如何在solr搜索中添加通配符来查询文本

时间:2013-12-23 06:48:08

标签: search solr lucene

我希望如果有人搜索phan,那么elephant应匹配。

现在我有value:*phan*然后它有效,所以我尝试了这个

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

然后它将查询作为 "*phan*"为单个字段而不是wilcard

我该怎么做

1 个答案:

答案 0 :(得分:3)

要让Solr查找单词部分的文档,您需要查看the NGramTokenizerthe Edge NGramTokenizer。由于您需要在其中间匹配单词的部分,您应该看看NGramTokenizer。如果单词的开头和结尾都行,那么EdgeNGram将是有利的,因为它在索引方面较小。

问题Apache solr search part of the word中的SO上找到了一个很好的样本。

为什么要对查询时间进行索引?

Lucene和Solr并不打算用领先的通配符进行搜索。因此,即使搜索*foo也可能导致性能下降。更不用说*foo*了。您可以在the FAQs 'What wildcard search support is available from Lucene?'

中阅读此内容
  

默认情况下,QueryParser支持前导通配符(例如* ook) 。从Lucene 2.1开始,可以通过调用QueryParser.setAllowLeadingWildcard(true)来启用它们。请注意,这可能是一项昂贵的操作:它需要完整地扫描索引中的标记列表以查找与模式匹配的标记。

在问题中Understanding Lucene leading wildcard performance是关于这个主题的更详细的写作。