2017-04-20 89 views
0

我有職業的索引(標識符+職業):SOLR和重音字符

<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> 

這是一個真正的查詢,爲三個標識符(1,195和129):

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}] 
    }} 

其中兩個有重音字符,一個沒有。因此,讓我們occ_tx_name搜索,而無需使用口音:

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」失敗這一事實很煩人,而「informatico」成功。索引的源數據是一個簡單的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

好的,我發現了源代碼問題。我已經用十六進制打開了VI的SQL加載腳本。

這是INSERT語句中'Agrónomo'的十六進制內容:41 67 72 6f cc 81 6e 6f 6d 6f。

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

所以這就是問題所在......它必須是「C3 B3」 ......我得到的文本從網頁上覆制/粘貼,所以在原產地源字符是問題。

感謝你們兩位,因爲我對SOLR的靈魂有了更多的瞭解。

問候。

0

我不認爲MySQL或您的jvm設置與此有任何關係。我懷疑一個工程,另一個不可能是由於SpanishLightStemFilterFactory。

正確的方式來實現,無論變音符號是使用以下的匹配:

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

將在這兩個索引和查詢分析器鏈的標記生成器,以及任何音調符號之前,應轉換爲ASCII版本。這將使它始終工作。

+0

嗨。它沒有工作。相同的結果:( –

+0

轉到分析選項卡在bot索引和查詢端查看該詞的詳細輸出 – Persimmonium

+0

它是瘋了@在Solr Admin中,我選擇了我的索引,然後單擊Schema部分。字段'occ_tx_name',然後是「加載期限信息」按鈕,所以我可以看到列出的前10個術語。我已將10更改爲278,以查看所有術語。列表中的每個術語都是HTML錨點,該鏈接我不能相信我看到... –

0

只需添加solr.ASCIIFoldingFilterFactory到您的過濾器分析儀鏈,甚至更好地創造一個新的字段類型:

<!-- 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 字符,這是不是在基本拉丁語的Unicode塊(第一個 127個ASCII字符)轉換爲它們的ASCII等價物(如果存在)。

即使重音字符丟失,也應該讓您匹配搜索。 缺點是,像「cañon」和「canon」這樣的詞現在是相同的,並且都是相同的文件IIRC。

+0

嗨。我已經添加了過濾器「solr.ASCIIFoldingFilterFactory」,但我得到了完全相同的結果... –

+0

你必須重新索引整個集合 – freedev