2016-12-15 101 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參數提供的表達式可以解釋爲分隔符,也可以將應該從文本中提取的模式作爲標記進行匹配。