我希望通过"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>
答案 0 :(得分: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
”)是否从头开始计算n-gram({{1 }})文本或从末尾(front
)
它将起作用:
back
In: "babaloo"
Out: "oo", "loo", "aloo", "baloo"
:此KeywordTokenizerFactory
将整个文本字段视为单个标记。