solr查询中的子字符串匹配

时间:2016-12-15 22:22:57

标签: solr lucene

我有一个要求,我必须匹配查询中的子字符串。 例如,如果该字段具有值:

  

PREFIXabcSUFFIX

我必须创建一个匹配abc的查询。我总是知道前缀的长度。

由于空间限制,我无法使用EdgeNgramNgram。(因为它们会创建更多索引。)

所以我需要在查询时间而不是索引时间执行此操作。使用通配符作为*abc*之类的前缀将对性能产生很大影响。

因为我会知道前缀的长度,我希望能有一些方法,我可以做....abc*之类的事情,其中​​点代表前缀的确切长度,这样查询就不会像搜索那样糟糕整个索引与通配符查询(*abc*)的情况一样。

这在solr中是否可行?谢谢你的时间。

Solr版本:4.10

2 个答案:

答案 0 :(得分:3)

当然,通配符语法为documented here,您可以搜索????abc*之类的内容。您也可以使用正则表达式查询。

但是,此*abc*以上的性能优势将非常小。它仍然必须对整个索引执行顺序搜索。但如果您无法改进分析以支持您的搜索需求,则可能无法解决(GIGO)。

答案 1 :(得分:1)

您可以使用the RegularExpressionPatternTokenizer。对于下面的示例,我猜测前缀的长度为6.您的示例文字PREFIXabcSUFFIX将变为abcSUFFIX。这样您就可以搜索abc*

<analyzer>
  <tokenizer class="solr.PatternTokenizerFactory" pattern=".{6}(.+)" group="1"/>
</analyzer>

关于Tokenizer:

  

此标记生成器使用Java正则表达式将输入文本流分解为标记。 pattern参数提供的表达式可以解释为分隔标记的分隔符,或者将应该从文本中提取的模式匹配为标记。