今天的挑战是为我的商店产品数据库创建一个搜索引擎。
很多产品都是手工制作,有很多不同的手!
所以很可能找到“i-phone 3gs”,“iPhone4”和“i phone 5”,
我想要的是搜索“iPhone”并查找上面的三个示例产品结果。
那提醒我“模糊搜索”。我试图在开箱即用的情况下使用它们但没有成功。我需要索引和搜索这种示例(文档正文中的特殊字符或空格)来检索“同义词”结果吗?
e.g。
iPhone => “我的电话”
“special 40”=> “special40”
答案 0 :(得分:0)
使用Lucene,我会推荐几种选择。
一种方法是使用KeywordAnalyzer对产品ID进行索引,然后按照建议进行查询,并使用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);
}
答案 1 :(得分:0)
使用Solr,请确保完成示例教程和相应的schema.xml。您将看到有两种类型定义(我认为en_splitting和en_splitting_tight)显示非常相似的用例。
具体来说,您正在查看由LowerCaseFilter和可能的SynonymFilter扩充的WordDelimiterFilter。但是你必须要小心使用SynonymFilters,特别是如果你要映射到多字等价物。