我试图在Lucene中复制SQL的类似功能。
如果我使用通配符搜索,请说“*郁金香酒店Riyadhh*”,我面临以下行为:
实际上,我需要一个在Lucene中的例子,其中条件"2“应该匹配,"4”不应该匹配。
我尝试了所有的查询,但是第二个场景不匹配。
一些人建议使用托肯器和自定义分析器。
因为我是Lucene新手,所以我处理查询,但不知道如何将Tokenizer和自定义分析器集成到我们的查询中。
发布于 2017-05-22 06:19:45
如果只需要前缀匹配,则可以使用KeywordTokenizer和LowercaseFilter和EdgeNgramFilter:
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="50"/>
</analyzer>该链将将传入的文本保持为单个令牌(KeywordTokenizer),然后将传入的文本转换为小写(LowerCaseFilter),然后根据字符串长度将其拆分为多个令牌。
如果要匹配字符串中的任何位置,可以使用普通的plain筛选器:
<filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="4"/>。。但是,请注意,如果min和max之间的差异很大,索引的大小将迅速增长。
还有第二个选项,那就是使用ReversedWildcardFilter,它专门为*foo*查询条件进行调优,所以如果您不需要对每个令牌进行进一步处理(例如对每个单独的令牌进行词干,等等)。这可能是个选择。
https://stackoverflow.com/questions/44101781
复制相似问题