我想用"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将整个文本字段视为单个标记。

09-26 22:16