今天的挑戰是創造我的商店的產品數據庫的搜索引擎搜索。全文產品代碼
很多產品都是用手工製作的,有很多不同的手!
所以這是有可能找到「我手機3GS」,「iPhone4的」和「我的手機5」,
我想是搜索「iPhone」,並找到上述三個例子的產品的結果。
這讓我想起了「模糊搜索」。我試着出的現成使用它們沒有成功。
我需要索引和搜索這種示例(文檔體內的特殊字符或空格)來檢索「同義詞」結果嗎?
例如
iPhone => 「我手機」
「特40」=> 「special40」
今天的挑戰是創造我的商店的產品數據庫的搜索引擎搜索。全文產品代碼
很多產品都是用手工製作的,有很多不同的手!
所以這是有可能找到「我手機3GS」,「iPhone4的」和「我的手機5」,
我想是搜索「iPhone」,並找到上述三個例子的產品的結果。
這讓我想起了「模糊搜索」。我試着出的現成使用它們沒有成功。
我需要索引和搜索這種示例(文檔體內的特殊字符或空格)來檢索「同義詞」結果嗎?
例如
iPhone => 「我手機」
「特40」=> 「special40」
使用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);
}
使用Solr,請務必通過實例教程以及相應的schema.xml中行走。你會看到,有兩個類型定義那裏(en_splitting和en_splitting_tight我認爲),顯示非常類似的用例。
具體而言,您正在查看WordDelimiterFilter由LowerCaseFilter和可能的SynonymFilter增強。你必須要小心一點與SynonymFilters雖然,特別是如果你是從多字等價映射到/。