2016-12-15 100 views
0

我有一个必须在查询中匹配子串的需求。 e.g如果字段值:solr查询中的子串匹配

PREFIXabcSUFFIX

我要创建相匹配abc查询。我总是知道前缀的长度。

我不能使用EdgeNgramNgram由于空间限制的。(因为他们将创造更多的索引。)

所以我需要做的查询时间,而不是指数的时间。使用通配符作为类似*abc*的前缀将对性能产生很大影响。

因为我会知道前缀的长度,我希望能有一些方法,我可以做点像....abc*其中点代表的确切长度的前缀,使查询不像搜索整个索引如在通配符查询的情况下(*abc*)。

这是可能的solr?谢谢你的时间 。

Solr的版本:4.10

回答

3

当然,通配符语法是documented here,您可以搜索类似????abc*。你也可以使用正则表达式查询。

但是,这比*abc*的性能好处将会很小。它仍然需要对整个索引进行顺序搜索。但是,如果您无法改进分析以支持您的搜索需求,那么可能无法获得(GIGO)。

1

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

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

关于该标记者:

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