2016-05-13 71 views
3

我想查找"john doe"并使用"hn do"搜索。 "*hn*""john\ d\*"有效,但当查询包含空格时,"*hn\ do*"不起作用。逃避通配符也没有帮助。Solr子串空白搜索

我的字段定义如下:

<fieldType name="string" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <!--<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="25" side="back" />--> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

回答

2

尝试使用NGramTokenizerFactory。它会在给定范围内生成大小为n-gram的令牌。正如下面

<analyzer> 
    <tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="10"/> 
</analyzer> 

它将作品:

In: "john doe" 
Out: "jo","joh","john", "john ","john d","john do", 
"john doe", "oh", "ohn","ohn ", "ohn d"... 

并从fieldType定义KeywordTokenizerFactory。

您也可以考虑使用solr.EdgeNGramTokenizerFactory

它有另一个属性side的。

side:(“front‘或’back”,默认为“front”)无论从文本的开始(front)或结束(back

这将计算正克工作原理:

In: "babaloo" 
Out: "oo", "loo", "aloo", "baloo" 

KeywordTokenizerFactory:这tokenizer将整个文本字段作为一个单一的令牌。