2017-04-20 35 views
0

私は職業(識別子+職業)のインデックスを持っている:SOLRとアクセント付き文字

curl -X GET "http://192.168.1.11:8983/solr/cyp_occupations/select?indent=on&q=occ_id:1+occ_id:195+occ_id:129&wt=json" 
{ 
    "responseHeader":{ 
    "status":0, 
    "QTime":1, 
    "params":{ 
     "q":"occ_id:1 occ_id:195 occ_id:129", 
     "indent":"on", 
     "wt":"json"}}, 
    "response":{"numFound":3,"start":0,"docs":[ 
     { 
     "occ_id":1, 
     "occ_tx_name":"Abogado", 
     "_version_":1565225103805906944}, 
     { 
     "occ_id":129, 
     "occ_tx_name":"Informático", 
     "_version_":1565225103843655680}, 
     { 
     "occ_id":195, 
     "occ_tx_name":"Osteópata", 
     "_version_":1565225103858335746}] 
    }} 

<field name="occ_id" type="int" indexed="true" stored="true" required="true" /> 
<field name="occ_tx_name" type="text_es" indexed="true" stored="true" multiValued="false" /> 


<!-- Spanish --> 
<fieldType name="text_es" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_es.txt" format="snowball" /> 
    <filter class="solr.SpanishLightStemFilterFactory"/> 
    </analyzer> 
</fieldType> 

これは、3つの識別子(1、195及び129)のために、実際のクエリですそのうち2つはアクセント記号付きであり、もう1つはアクセント記号付きです。それでは、アクセントを使用せずにocc_tx_nameで検索しましょう:「informatico」は成功している間

curl -X GET "http://192.168.1.11:8983/solr/cyp_occupations/select?indent=on&q=occ_tx_name:abogado&wt=json" 
{ 
    "responseHeader":{ 
    "status":0, 
    "QTime":1, 
    "params":{ 
     "q":"occ_tx_name:abogado", 
     "indent":"on", 
     "wt":"json"}}, 
    "response":{"numFound":1,"start":0,"docs":[ 
     { 
     "occ_id":1, 
     "occ_tx_name":"Abogado", 
     "_version_":1565225103805906944}] 
    }} 

curl -X GET "http://192.168.1.11:8983/solr/cyp_occupations/select?indent=on&q=occ_tx_name:informatico&wt=json" 
{ 
    "responseHeader":{ 
    "status":0, 
    "QTime":0, 
    "params":{ 
     "q":"occ_tx_name:informatico", 
     "indent":"on", 
     "wt":"json"}}, 
    "response":{"numFound”:1,”start":0,"docs":[ 
     { 
     "occ_id":129, 
     "occ_tx_name":"Informático", 
     "_version_":1565225103843655680}] 
    }} 


curl -X GET "http://192.168.1.11:8983/solr/cyp_occupations/select?indent=on&q=occ_tx_name:osteopata&wt=json" 
{ 
    "responseHeader":{ 
    "status":0, 
    "QTime":0, 
    "params":{ 
     "q":"occ_tx_name:osteopata", 
     "indent":"on", 
     "wt":"json"}}, 
    "response":{"numFound":0,"start":0,"docs":[] 
    }} 

私は、最後の検索「osteopata」は失敗したという事実について非常に迷惑しています。インデックスのソースデータは、単純なMySQLのテーブルです:

-- ----------------------------------------------------- 
-- Table `mydb`.`occ_occupation` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`occ_occupation` (
    `occ_id` INT UNSIGNED NOT NULL, 
    `occ_tx_name` VARCHAR(255) NOT NULL, 
    PRIMARY KEY (`occ_id`) 
ENGINE = InnoDB 

テーブルの照合は「utf8mb4_general_ci」です。索引はDataImportHandlerで作成されます。これは定義です:

<dataConfig> 
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.1.11:3306/mydb" 
     user=“mydb” password=“mydb” /> 
    <document name="occupations"> 
     <entity name="occupation" pk="occ_id" 
      query="SELECT occ.occ_id, occ.occ_tx_name FROM occ_occupation occ WHERE occ.sta_bo_deleted = false"> 
      <field column="occ_id" name="occ_id" /> 
      <field column="occ_tx_name" name="occ_tx_name" /> 
     </entity> 
    </document> 
</dataConfig> 

問題を検出するには手がかりが必要です。誰でも助けてくれますか?前もって感謝します。

+0

私はsolr-6.3.0を使用していることを忘れていました。このコマンドでサーバを起動しています:solr start -a "-Duser.language = es -Duser.country = ES -Duser.timezone =ヨーロッパ/マドリード " –

答えて

0

私はソースの問題を発見しました。私は、16進モードでVIを使用してSQLロードスクリプトを開いています。

INSERTステートメントの「Agrónomo」の16進数です。41 67 72 6f cc 81 6e 6f 6d 6f。

6f cc 81!!!! This is "o COMBINING ACUTE ACCENT" UTF code!!!! 

だからそれが問題だ...それは「C3はB3」でなければなりません...私はリテラルは、Webページから/貼り付けをコピーしますので、起源上のソース文字が問題でした。

あなたのおかげで、私はSOLRの魂についてもっと学びました。

よろしくお願いいたします。

0

mysqlやjvmの設定はこれと関係ないと思います。私は1つがうまくいくと思うし、もう1つはSpanishLightStemFilterFactoryのせいかもしれない。

正しい方法は、発音区別符号は、次を使用しているに関係なくマッチング達成するために:

<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> 

あなたの両方のインデックスとクエリアナライザ鎖にトークナイザ、および任意の付加記号の前にASCIIバージョンに変換する必要があることを入れてください。それはそれが常に働くようにします。

+0

こんにちは。それはうまくいかなかった。同じ結果:( –

+0

[分析]タブに移動すると、ボットインデックスとクエリ側でその単語の冗長な出力が表示されます – Persimmonium

+0

Solr Adminではインデックスを選択してスキーマセクションをクリックしました。フィールド 'occ_tx_name'、 'Load term info'ボタンをクリックすると、上位10個の用語が表示されます。10個を278個に変更してすべての用語を表示します。リスト内の各用語はHTML Anchor、 SOLRの質問に答えてください...そして、私は私が見ているとは信じられません。 –

0

ちょうどあなたのフィルタ・アナライザ・チェーンにsolr.ASCIIFoldingFilterFactoryを追加したり、より良い新しいFIELDTYPEを作成します。

<!-- Spanish --> 
<fieldType name="text_es_ascii_folding" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.ASCIIFoldingFilterFactory" /> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_es.txt" format="snowball" /> 
    <filter class="solr.SpanishLightStemFilterFactory"/> 
    </analyzer> 
</fieldType> 

このフィルタは、基本的なラテンのUnicodeブロックに含まれていない、アルファベット、数字、およびシンボリックユニコード 文字を変換し、 (最初の のASCII文字127文字)をASCII相当文字に変換します(存在する場合)。

アクセント記号のついていない文字がなくても、検索に合わせる必要があります。 "cañon"や "canon"のような言葉は同等であり、どちらも同じ文書IIRCに当てはまるという欠点があります。

+0

こんにちは。フィルタ "solr.ASCIIFoldingFilterFactory"を追加しましたが、まったく同じ結果が得られます... –

+0

コレクション全体を再インデックスする必要があります – freedev