2013-02-20 52 views
1

我試圖找到一種方法來改善Solr提供的拼寫建議,同時仍保留儘可能多的好建議。一個特定的搜索是造成我SA巨大的頭痛:Solr返回差和無效的拼寫建議

「黃花」

當這個Solr的搜索提供的建議「黃flowersit」

至於我可以告訴大家,這是從一個工段在這個領域用於生成看起來像「花朵」的建議。

這只是我對這個特定查詢的許多迭代問題中的一個(我確定他們有很多其他的,但我注重解決這個問題)。以前我有問題,用省略號串聯詞,如:

「花......一個」 =>「黃flowersa」

我已經厭倦了各種事情,如添加spellcheck.accuracy到查詢,但我發現這排除了有效的建議,排除了無效的建議(它在0.7處排除「acet」=>「acer」,但直到0.9時才排除「flowerse」)。我已經試過唯一的莫名其妙的真假,都沒有可觀的效果。

我在考慮嘗試使用thresholdTokenFrequency,但我有一種感覺,我會失去很多有效的建議,比如只能在索引中出現一次的專有名稱。

沿着同樣的線條:尋找「flowerse」會產生諸如「flowersse」的建議,而不是更合適的「花朵」建議。

我該怎麼做才能改善拼寫建議的結果,甚至只是列出永遠不會被建議或類似的單詞?

爲什麼索爾建議這樣的古怪的詞組合,當搜索詞是我索引中最常用的單詞之一時,它不會出現超過幾次?

文本字段類型定義:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
     <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(…|[\.]{2,})" replacement=" " /> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/> 
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/> 
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
</fieldType> 

建議字段定義:

<field name="suggestions" type="text" indexed="true" stored="true" multiValued="true" termVectors="true" termPositions="true" termOffsets="true" />

requestHandler:

<requestHandler name="standard" class="solr.SearchHandler" default="true"> 
    <lst name="defaults"> 
     <str name="echoParams">explicit</str> 
     <str name="spellcheck.onlyMorePopular">false</str> 
     <str name="spellcheck.extendedResults">false</str> 
     <str name="spellcheck.count">1</str> 
    </lst> 
    <arr name="last-components"> 
     <str>spellcheck</str> 
    </arr> 
</requestHandler> 
+0

請問您可以從您的schema.xml添加fieldType定義,以便從您的solrconfig.xml中導出建議的字段以及您的拼寫requestHandler條目? – 2013-02-20 20:04:02

+0

謝謝,完成。我還添加了字段定義 – John 2013-02-20 20:24:02

回答

1

感謝張貼您的字段類型定義。基於此,我認爲你的問題與使用EnglishPorterFilterFactory和WordDelimiterFilterFactory有關。這兩個過濾器工廠正在更改被標記化的值(由Solr在字段中存儲)以最大化搜索結果。因此,你被提供這些起源和劃定的價值作爲拼寫建議,我相信這不是你期望的行爲。

在這種情況下,我建議使用不同的字段類型作爲建議字段,刪除這兩個過濾器工廠作爲起點,以查看您的拼寫建議是否得到改進。因爲我相信你需要的拼寫建議更能代表傳遞給Solr進行索引的值,而不是Solr如何存儲它們以最大化搜索結果。

另請注意,EnglishPorterFilterFactory has been deprecated,建議您切換到SnowballPorterFilterFactory