带空格的 Solr 子字符串搜索
Solr substring search with whitespace
我想通过 "hn do"
搜索找到 "john doe"
。 "*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
" or "back
", default is "front
") 是否从头开始计算n-grams (front
) 或从末尾 (back
)
它将作为 :
In: "babaloo"
Out: "oo", "loo", "aloo", "baloo"
KeywordTokenizerFactory
:这 tokenizer
将整个文本字段视为单个标记。
我想通过 "hn do"
搜索找到 "john doe"
。 "*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
" or "back
", default is "front
") 是否从头开始计算n-grams (front
) 或从末尾 (back
)
它将作为 :
In: "babaloo"
Out: "oo", "loo", "aloo", "baloo"
KeywordTokenizerFactory
:这 tokenizer
将整个文本字段视为单个标记。