Search 产品代码全文搜索

Search 产品代码全文搜索,search,solr,lucene,fuzzy-search,Search,Solr,Lucene,Fuzzy Search,今天的挑战是为我的商店的产品数据库创建一个搜索引擎 很多产品都是由很多不同的人手工制作的 所以很可能会发现“iPhone3GS”、“iPhone4”和“iPhone5” 我想要的是搜索“iPhone”,并找到上面的三个示例产品结果 这让我想起了“模糊搜索”。我试着开箱即用,但没有成功 为了检索“同义词”结果,我必须索引和搜索此类示例(文档体中的特殊字符或空格)什么 e、 g iPhone=>“i-phone” “special 40”=>“special40”使用Lucene,我推荐几个选项 一

今天的挑战是为我的商店的产品数据库创建一个搜索引擎

很多产品都是由很多不同的人手工制作的

所以很可能会发现“iPhone3GS”、“iPhone4”和“iPhone5”

我想要的是搜索“iPhone”,并找到上面的三个示例产品结果

这让我想起了“模糊搜索”。我试着开箱即用,但没有成功

为了检索“同义词”结果,我必须索引和搜索此类示例(文档体中的特殊字符或空格)什么

e、 g

iPhone=>“i-phone”


“special 40”=>“special40”

使用Lucene,我推荐几个选项

一种方法是使用索引为产品ID编制索引,然后按照建议使用查询

或者,您可以创建一个自定义分析器,在其中添加一个,该分析器将在大小写发生更改时创建标记,以及破折号和空格(如果通过标记器后标记中存在)。一个重要的注意事项是,如果您使用的是StandardAnalyzer、SimpleAnalyzer或类似工具,那么您需要确保在执行之前应用
WordDelimiterFilter
。当然,通过
lowercaseefilter
运行它将防止它能够基于驼峰大小写拆分术语。另一个注意事项是,您可能需要自定义您的,因为“I”是一个常见的英语停止词

在自定义分析器中,您主要只需要重写。例如,如果要将
WordDelimiterFilter
功能添加到StandardAnalyzer的过滤器集中:

@覆盖
受保护的TokenStreamComponents createComponents(字符串字段名、读卡器){
标记器标记器=新的标准标记器(Version.LUCENE_40,reader);
TokenStream filter=新的标准过滤器(Version.LUCENE_40,tokenizer);
//查看WordDelimiterFactory API,了解有关此筛选器行为的其他选项
过滤器=新的WordDelimiterFilter(过滤器,WordDelimiterFilter.GENERATE\u WORD\u PARTS,null);
filter=新的小写filter(Version.LUCENE_40,filter);
//如前所述,创建stopwords的ChararySet,因为默认设置可能会给您带来问题
filter=新的StopFilter(Version.LUCENE_40,filter,myStopWords);
返回新的TokenStreamComponents(标记器、过滤器);
}

对于Solr,请确保仔细阅读示例教程和相应的schema.xml。您将看到有两个类型定义(我认为是en_spliting和en_spliting_tight)显示了非常相似的用例

具体地说,您将看到由小写过滤器和同义过滤器增强的。不过,您确实需要对同义词过滤器稍微小心一点,尤其是在映射到多单词等效项或从多单词等效项映射时