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

Search 如何在solr搜索中向查询文本添加通配符,search,solr,lucene,Search,Solr,Lucene,我希望如果有人搜索phan,那么elephant应该匹配 现在我有了值:*phan*然后它就工作了,所以我尝试了这个 <analyzer type="query"> <filter class="solr.PatternReplaceFilterFactory" pattern="(.+)" replacement="*$1*" replace="all" /> 但随后,它提出了如下问题: “*phan*”作为单个字段,而不是wilcard 我该如何做才能让

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

现在我有了
值:*phan*
然后它就工作了,所以我尝试了这个

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

但随后,它提出了如下问题:
“*phan*”
作为单个字段,而不是wilcard


我该如何做才能让Solr找到word部件的文档,您需要查看或。因为需要匹配单词中间的部分,所以应该看看NGramTokenizer。如果单词的开头和结尾都可以,那么边格伦图将是有利的,因为它在索引方面更小

这里有一个很好的例子,所以在问题中

为什么要随查询时间索引?

Lucene和Solr并不打算使用前导通配符进行搜索。因此,即使搜索
*foo
,也可能导致性能不佳。更不用说
*foo*
。你可以在书中读到这个

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


SO问题中有一篇关于这个主题的更详细的文章。

我想把它应用到查询而不是索引分析器上。我不明白solr中没有包括的那个简单的东西是什么。对于N-gram和edge-gram,假设我有20个字符长的单词,这意味着系统必须索引所有15个以上的单词来进行部分匹配。如果可以的话,为搜索解决方案编制索引会更有效。您只需在索引时投入一次所需的计算时间。如果您想在每次查询时都这样做,您将面临更高的CPU使用率和更差的搜索性能。