我们正在为我们的某个项目尝试ShingleFilterFactory
,但它似乎无效。
我们希望使用KeywordTokenizerFactory
,以便不对字段值进行标记。之后我们尝试应用ShingleFilterFactory
,但它不起作用。
例如“这个世界拥有所需的一切”是田间价值。我们搜索“有所需的一切”,但它无法正常工作。
<fieldType name="string_ci" class="solr.TextField" sortMissingLast="true" omitNorms="true">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="4"
outputUnigrams="true" outputUnigramsIfNoShingles="false" tokenSeparator=" "/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="4"
outputUnigrams="true" outputUnigramsIfNoShingles="false" tokenSeparator=" "/>
</analyzer>
</fieldType>
答案 0 :(得分:1)
木瓦过滤器工厂只能在首次标记字段时才能工作。需要代币并将它们结合起来 - 例如&#34;这个世界拥有所需的一切&#34;可能导致令牌的组合:&#34;这个世界&#34;,&#34;世界已经&#34;,&#34;拥有一切&#34;,&#34;所需的一切&#34;。如果您使用关键字标记生成器,则不会有要合并的标记。
如果您在搜索中使用多个单词,我相信您需要在查询分析器中使用关键字tokenizer,并在索引分析器中使用标准(或空白)tokenizer / shingle过滤器工厂组合,例如:
<fieldType name="string_ci" class="solr.TextField" sortMissingLast="true" omitNorms="true">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="4"
outputUnigrams="true" outputUnigramsIfNoShingles="false">
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>