ShingleFilterFactory无法按预期工作

时间:2016-02-16 16:35:18

标签: solr

我们正在为我们的某个项目尝试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> 

1 个答案:

答案 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>