我有一个要求,我必须匹配查询中的子字符串。 例如,如果该字段具有值:
PREFIXabcSUFFIX
我必须创建一个匹配abc
的查询。我总是知道前缀的长度。
由于空间限制,我无法使用EdgeNgram
和Ngram
。(因为它们会创建更多索引。)
所以我需要在查询时间而不是索引时间执行此操作。使用通配符作为*abc*
之类的前缀将对性能产生很大影响。
因为我会知道前缀的长度,我希望能有一些方法,我可以做....abc*
之类的事情,其中点代表前缀的确切长度,这样查询就不会像搜索那样糟糕整个索引与通配符查询(*abc*
)的情况一样。
这在solr中是否可行?谢谢你的时间。
Solr版本:4.10
答案 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参数提供的表达式可以解释为分隔标记的分隔符,或者将应该从文本中提取的模式匹配为标记。