2011-10-13 21 views
3

我正在運行SOLR作爲內部網的搜索引擎,其文檔超過40000個。通過使用copyField指令將titlekeywords字段複製到content字段並僅索引該字段,我保持它非常簡單。SOLR:NGramFilterFactory存在問題

因爲現在我們使用這個配置:

<analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" /> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
    <filter class="solr.LowerCaseFilterFactory" />    
    <filter class="solr.SnowballPorterFilterFactory" language="German" /> 
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
</analyzer> 

這工作不錯,但也有抱怨,該通配符必須手動設置。所以我加了NGRamFilterFactory作爲分析的最後一行:

<analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" /> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
    <filter class="solr.LowerCaseFilterFactory" />    
    <filter class="solr.SnowballPorterFilterFactory" language="German" /> 
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="30" /> 
</analyzer> 

現在的問題是:與舊的配置我用來尋找7個文檔與某個關鍵字(「索尼」)。現在,只有2個。我徹底沖洗了索引並從頭開始構建它。當我再次將該線路重新排列並重新編制文檔時,它會再次按預期工作。這導致我的問題,我有:

  • 是FilterFactory對我來說是正確的事情,或者它應該是令牌工廠?如果標記器:它可以在過濾器之後運行嗎?
  • 我將文檔作爲xml添加到75個文檔的分檔中,並在最後進行提交。應該有更多的提交?
  • 又是一個,我現在忘了.. GRR提前

謝謝!

回答

5

只是胡亂猜測 -

什麼在你的內容字段的大小(字數)?
因爲,現在你已經將NGramFilterFactory放入你的過濾器鏈中,並且minGramSize是3,那麼將會生成許多令牌並將它們全部放在新的位置。

solrconfig.xml中的maxFieldLength設置限制要編制索引的令牌數量。
默認值爲10000(仍然很高),但可以在篩選器鏈中使用大內容和ngramfilter時超出。

<maxFieldLength>10000</maxFieldLength> 

嘗試將此值增加到較高的數字,重新索引並檢查是否找到匹配項。

+0

一個很好的「瘋狂猜測」。增加限制完成了這項工作。你知道是否可以檢查索引中有多少令牌? – harpax

+0

您可以檢查索引中的條款。不確定您是否可以檢查文檔和字段特定。嘗試盧克工具,它可能會幫助你。 – Jayendra

2

我強烈推薦使用工具。這可以通過Solr Admin站點訪問(點擊[Config]旁邊的[Analysis]鏈接)。這是一個非常強大的工具,您可以在其中查看文本值如何分解爲單詞,並在結果鏈通過每個過濾器後顯示結果令牌。

使用此工具,您可以在查詢「Sony」時獲取未返回的文檔之一,並將索引文本粘貼到索引字段並將索尼粘貼到查詢字段中,以查看Solr如何應用您的文檔過濾器,然後查詢該字段是否匹配。然後,您可以在沒有NGramFilterFactory的情況下將模式更改回原始模式,並查看您的文檔最初如何分解和匹配,以比較NGramFilterFactory如何影響索引和查詢。

較小的搜索結果可能基於您在NGramFilterFactory設置中指定的minGramSize和maxGramSize設置。請參考Solr Wiki上的NGramFilterFactory文檔,瞭解這些影響索引的更多細節。

+0

我檢查了該工具的結果,但無法找到錯誤。正如Jayendra Patil所提出的那樣,增加maxFieldLength可以完成這項工作。感謝您的回答! – harpax