我希望如果有人搜索phan
,那么elephant
应匹配。
现在我有value:*phan*
然后它有效,所以我尝试了这个
<analyzer type="query">
<filter class="solr.PatternReplaceFilterFactory" pattern="(.+)" replacement="*$1*" replace="all" />
然后它将查询作为
"*phan*"
为单个字段而不是wilcard
我该怎么做
答案 0 :(得分:3)
要让Solr查找单词部分的文档,您需要查看the NGramTokenizer或the 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是关于这个主题的更详细的写作。