2012-05-31 58 views
1

我該如何讓Solr/Lucene忽略空間?我想實現的目標是讓搜索引擎匹配搜索短語,例如。 「香港」只有「香港」被索引。如何讓Solr/Lucene忽略空間?

據我所知,我應該玩一些文本分析儀。我找不到任何描述這種方法的好消息。

謝謝!

回答

2

您的案例中的搜索條件是不同的。
您需要使用solr.SynonymFilterFactory並將此組合定義爲同義詞。
查看上述鏈接中的示例。
這將使您可以搜索香港和香港,仍然可以得到結果。

通常WordDelimiterFilterFactory將用於沒有空間的組合。
它用於您想要使用任意組合進行搜索的情況下更改情況或字母數字組合。

例如
無線網絡應該可以通過wifi,wifi,wifi等搜索...
iPhone應該可以搜索iphone,iPhone,手機等...
j2se可以通過j2se,j 2 se等搜索。 。

+2

我也會啓用拼寫檢查。通過同義詞解決這個問題是一場無盡的戰鬥。我會使用您的分析包來幫助識別主要犯罪者,並讓拼寫檢查選取其餘部分。 –

2

您可以使用ShingleFilterFactory創建字的組合。您需要設置tokenSeparator =「」以刪除令牌之間的空間。如果您仍想搜索單個單詞,則可能需要將outputUnigrams = true。

<fieldType name="text_shingle" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="2" 
     outputUnigrams="true" outputUnigramsIfNoShingles="false" tokenSeparator=""/> 
    </analyzer> 
    </fieldType> 

http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.ShingleFilterFactory

你必須要小心,雖然。 ShingleFilter將爲文檔中的所有內容創建組合。例如「需要小心」會產生「需要保持小心」。 。這個例子看起來不錯,讓我們看看這個:「食客們是否也會」產生「劇院也是這樣」。對「劇院」的查詢將導致誤報。

如果您正在索引諸如人名之類的短文檔,那麼我肯定會建議使用ShingleFilter,因爲組合總是用在人名中。但是,如果您正在索引文檔,則需要知道您正在合併的內容。在這種情況下,同義詞過濾器可能更適合。您可以從字典中創建組合並將其與SynonymFilterFactory一起使用。