我试图在Lucene中复制SQL的LIKE功能。
如果我使用通配符搜索,请说" * Tulips Inn Riyadhh *"我面临以下行为:
其实我需要Lucene的一个例子,条件" 2"应该匹配和" 4"不应该匹配。
我尝试了所有查询,但第二种情况不匹配。
有些人建议使用Tokenizer和自定义分析器。
由于我是Lucene的新手,我处理过查询,但不知道如何将Tokenizer和自定义分析器集成到我们的查询中。
答案 0 :(得分:0)
如果仅需要前缀匹配,则可以使用带有LowercaseFilter和EdgeNgramFilter的KeywordTokenizer:
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="50"/>
</analyzer>
此链将传入的文本保留为单个标记(KeywordTokenizer),然后将传入的文本转换为小写(LowerCaseFilter),然后根据字符串长度将其拆分为多个标记。
如果要匹配字符串中的任何位置,可以使用普通的ngramfilter:
<filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="4"/>
..但请注意,如果min和max之间的差异很大,则索引的大小会快速增长。
还有第二个选项,并且使用ReversedWildcardFilter,它专门针对*foo*
查询条件进行了调整,因此如果您不需要进一步处理每个令牌(例如作为阻止每个单独的令牌等,可能是一个选项。