像lucene中句子的功能

时间:2017-05-21 21:05:30

标签: java solr lucene lucene.net

我试图在Lucene中复制SQL的LIKE功能。

如果我使用通配符搜索,请说" * Tulips Inn Riyadhh *"我面临以下行为:

  1. 利雅得郁金香酒店 - 匹配
  2. 利雅得郁金香酒店 - 不匹配
  3. Tulips Inn Riyadh hhss - Matching
  4. 郁金香 - 匹配
  5. Riyadhh - 匹配
  6. 其实我需要Lucene的一个例子,条件" 2"应该匹配和" 4"不应该匹配。

    我尝试了所有查询,但第二种情况不匹配。

    有些人建议使用Tokenizer和自定义分析器。

    由于我是Lucene的新手,我处理过查询,但不知道如何将Tokenizer和自定义分析器集成到我们的查询中。

1 个答案:

答案 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*查询条件进行了调整,因此如果您不需要进一步处理每个令牌(例如作为阻止每个单独的令牌等,可能是一个选项。