2015-09-03 123 views
1

我已經使用Solr 5.1和新的託管模式對內部網站建立索引。我使用「text_en」和「text_en_splitting」將頁面標題,網址和正文編入索引。除非查詢字符串包含下劃線,否則我幾乎得到了我想要的行爲。我的用例如下:假設我們有3個術語,「第一」,「第二」和「第三」,並且索引中不存在「第二個」,但是「第一個」和「第三個」是這樣做的。當搜索項是「第一個第二」時,我得到我想要的行爲(即返回具有「第一」和「第三」的頁面)。Solr 5.1:包含下劃線的搜索查詢問題

但是,當搜索項是「first_second_third」時,我得到0個結果,但我期望得到的東西,因爲索引中存在「第一個」和「第三個」。

我使用edismax利用qf搜索= url_txt_en title_txt_en title_txt_en_split text_txt_en_split

有人建議的方式來調整我的配置來獲得我想要什麼?

回答

1

您是否使用Solr示例附帶的text_en_splitting的定義?

如果是這樣,問題是這種類型使用WhitespaceTokenizerFactory,它會創建通過分割空白符分隔的令牌。它會忽略下劃線。

相反,它聽起來像你需要在空白和下劃線上進行標記。因此,嘗試更換與PatternTokenizerFactory,就像這樣:

<tokenizer class="solr.PatternTokenizerFactory" pattern="_\s*" /> 

不要忘記在這兩個索引和查詢分析器塊來改變這一點。

+0

有效定界符的text_en_splitting定義使用WordDelimiterFilterFactory,它根據該文檔應該在非字母數字字符分割。 – Stephan

+0

@Stephan確實,fieldType還包含WordDelimiterFilterFactory,它通常用於補充空白標記器。但是,我沒有看到WordDelimiterFilterFactory的任何選項可以分割下劃線上的單詞。這就是爲什麼我認爲你需要改變標記器。如果你只想更新過濾器,你可以嘗試添加[PatternReplaceFilterFactory](https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr。PatternReplaceFilterFactory)在WordDelimiterFilterFactory之前用空格替換下劃線,儘管這基本上是一個標記器。 – nofinator

+0

從文檔中,它表示它應該分割爲「非字母數字」字符,所以默認情況下它應該在下劃線上工作;他們舉例說「Wi-Fi」,它被分成「Wi」和「Fi」。此外,分析儀的輸出顯示WDF將「first_second_third」分成「first」,「second」和「third」;這是我所追求的。我只是不知道爲什麼我的查詢是空的。 – Stephan

0

嘗試使用WordDelimiterFilterFactory的以下字段類型。它將單詞拆分爲子字,並對子字組執行可選轉換。

默認情況下,字被劃分成子字的規則如下:

1.split上字內的分隔符(所有非字母數字字符)。 「無線網絡連接」 - > 「無線」, 「網絡連接」

的情況下過渡2.split(可以關閉 - 見splitOnCaseChange參數) 「的PowerShot」 - > 「電源」, 「射擊」

3.split上字母 - 數字轉換(可以關閉 - 見splitOnNumerics參數) 「SD500」 - > 「SD」, 「500」

<fieldtype name="subword" class="solr.TextField"> 
     <analyzer type="query"> 
      <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
      <filter class="solr.WordDelimiterFilterFactory" 
       generateWordParts="1" 
       generateNumberParts="1" 
       catenateWords="0" 
       catenateNumbers="0" 
       catenateAll="0" 
       preserveOriginal="1" 
       /> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.StopFilterFactory"/> 
      <filter class="solr.PorterStemFilterFactory"/> 
     </analyzer> 
     <analyzer type="index"> 
      <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
      <filter class="solr.WordDelimiterFilterFactory" 
       generateWordParts="1" 
       generateNumberParts="1" 
       catenateWords="1" 
       catenateNumbers="1" 
       catenateAll="0" 
       preserveOriginal="1" 
       /> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.StopFilterFactory"/> 
      <filter class="solr.PorterStemFilterFactory"/> 
     </analyzer> 
    </fieldtype> 
+0

管道已經在使用WordDelimiterFilterFactory;我的問題是理解爲什麼它似乎沒有工作。 – Stephan

+0

添加並嘗試使用 .... –

0

你可以只轉換_與任何非字母數字Tokenizer標記的字符。在下面的情況下,我它轉換爲連字符「 - 」是用於StandardTokenizerFactory

<charFilter class="solr.PatternReplaceCharFilterFactory" 
        pattern="_" 
        replacement="-"/> 
     <tokenizer class="solr.StandardTokenizerFactory"/>