2013-03-22 71 views
0

今天的挑戰是創造我的商店的產品數據庫的搜索引擎搜索。全文產品代碼

很多產品都是用手工製作的,有很多不同的手!

所以這是有可能找到「我手機3GS」,「iPhone4的」和「我的手機5」,

我想是搜索「iPhone」,並找到上述三個例子的產品的結果。

這讓我想起了「模糊搜索」。我試着出的現成使用它們沒有成功。

我需要索引和搜索這種示例(文檔體內的特殊字符或空格)來檢索「同義詞」結果嗎?

例如

iPhone => 「我手機」

「特40」=> 「special40」

回答

0

使用Lucene,有一對夫婦的我會推薦選項。

一種方法是將產品ID索引爲KeywordAnalyzer,然後按照您的建議進行查詢,並使用fuzzy query進行查詢。

或者,你可以創建一個自定義分析,在其中添加一個WordDelimiterFilter,這將創造在情況變化,以及破折號和空格標記(如果有的話在您的令牌已經通過該標記者通過後存在) 。需要注意的是,如果您使用的是StandardAnalyzer或SimpleAnalyzer或類似軟件,則需要確保在LowercaseFilter之前應用WordDelimiterFilter。通過LowercaseFilter運行它將,當然,防止它能夠基於駱駝外殼分割條款。另一個注意事項,你可能會想自定義您的StopFilter,因爲「我」是一種常見的英文停用詞。

在自定義分析器中,您主要只需要覆蓋createComponents()。例如,如果你想添加WordDelimiterFilter功能集成到StandardAnalyzer的組過濾器:

@Override 
protected TokenStreamComponents createComponents(String fieldName, Reader reader) { 
    Tokenizer tokenizer = new StandardTokenizer(Version.LUCENE_40,reader); 
    TokenStream filter = new StandardFilter(Version.LUCENE_40,tokenizer); 
    //Take a look at the WordDelimiterFactory API for other options on this filter's behavior 
    filter = new WordDelimiterFilter(filter,WordDelimiterFilter.GENERATE_WORD_PARTS,null); 
    filter = new LowercaseFilter(Version.LUCENE_40,filter); 
    //As mentioned, create a CharArraySet of your stopwords, since the default will likely cause problems for you 
    filter = new StopFilter(Version.LUCENE_40,filter,myStopWords); 
    return new TokenStreamComponents(tokenizer, filter); 
} 
0

使用Solr,請務必通過實例教程以及相應的schema.xml中行走。你會看到,有兩個類型定義那裏(en_splitting和en_splitting_tight我認爲),顯示非常類似的用例。

具體而言,您正在查看WordDelimiterFilter由LowerCaseFilter和可能的SynonymFilter增強。你必須要小心一點與SynonymFilters雖然,特別是如果你是從多字等價映射到/。