2013-12-23 31 views
2

我想如果有人搜索phan然后elephant应该匹配。我如何添加通配符来查询文本在solr搜索

现在我有value:*phan*然后它工作,所以我想这

<analyzer type="query"> 
    <filter class="solr.PatternReplaceFilterFactory" pattern="(.+)" replacement="*$1*" replace="all" /> 

但后来它使得查询作为 "*phan*"单场不wilcard

我怎么能做到这一点

回答

3

要让Solr查找单词部分的文档,您需要查看the NGramTokenizerthe Edge NGramTokenizer。由于您需要在中间匹配单词的部分内容,因此您应该查看NGramTokenizer。如果这个词的开头和结尾都是这样,那么EdgeNGram将会是有利的,因为它在指数方面更小。

在问题Apache solr search part of the word中发现了一个很好的示例。

为什么索引查询时间?

Lucene和这样的Solr并不打算用领先的通配符进行搜索。所以即使搜索*foo可能会导致糟糕的表现。更不用说*foo*。您可以在the FAQs 'What wildcard search support is available from Lucene?'

领先的通配符(例如* OOK)阅读这件事是不是通过默认的QueryParser支持。从Lucene 2.1开始,可以通过调用QueryParser.setAllowLeadingWildcard(true)来启用它们。请注意,这可能是一项昂贵的操作:它需要全面扫描索引中的标记列表以查找与该模式匹配的标记列表。

在SO问题Understanding Lucene leading wildcard performance是一个更详细的写在这个话题。

+0

我想将它应用于查询而非索引分析器。我可以这样做吗 – user3113427

+0

我不明白什么是不包含在solr中的简单的东西。用N克和边克,假设我有20个字符长的单词,所以这意味着,系统必须索引全部15个单词来做部分匹配。是否有效if – user3113427

+0

如果可以的话,搜索解决方案的效率会更高。您只需在索引时间投入一次所需的计算时间。如果您希望在查询时间内执行此操作,您将面临更高的CPU使用率和更差的搜索性能。 – cheffe