全文搜索产品代码

时间:2013-03-22 18:02:55

标签: search solr lucene fuzzy-search

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

很多产品都是手工制作,有很多不同的手!

所以很可能找到“i-phone 3gs”,“iPhone4”和“i phone 5”,

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

那提醒我“模糊搜索”。我试图在开箱即用的情况下使用它们但没有成功。

我需要索引和搜索这种示例(文档正文中的特殊字符或空格)来检索“同义词”结果吗?

e.g。

iPhone => “我的电话”

“special 40”=> “special40”

2 个答案:

答案 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,特别是如果你要映射到多字等价物。