我想用"john doe"
搜索找到"hn do"
。"*hn*"
或"john\ d\*"
有效,但当查询包含空白时,"*hn\ do*"
不起作用。转义通配符也没有帮助。
我的字段定义如下:
<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>
最佳答案
尝试使用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
)计算n个grams其工作原理如下:
In: "babaloo"
Out: "oo", "loo", "aloo", "baloo"
KeywordTokenizerFactory
:此tokenizer
将整个文本字段视为单个标记。