Solr nGram Filter minGramSize - 只有2个字符的单词标记

时间:2016-07-12 10:20:26

标签: solr lucene

我正在与Solr合作,想了解EdgeNGramFilterFactory的工作原理。

例如,我正在搜索术语“1 tb”。请注意,我搜索的字段的属性很少。

以下是此字段类型的索引时间应用的过滤器。

<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="10" /> 

现在,当我搜索“1 tb”这个词时,我没有得到理想的结果。

我的产品很少有术语“5 MegaPixels”,当我搜索“5 meg”时,它给了我结果。后来我发现它对“5我”不起作用。并没有给出结果。

如果我删除nGram过滤器,它可以正常工作。此外,如果我们设置minGramSize =“1”,那么查询“1 tb”工作正常。

我假设对于术语tb,令牌tb应该是有效的。但是当我应用minGramSize为2时,似乎没有创建它!

有人可以解释原因吗?

这是架构中定义的字段。

<fieldType name="AttributesField" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="10" /> 
        <filter class="solr.PorterStemFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.PorterStemFilterFactory"/>
      </analyzer>
    </fieldType>

1 个答案:

答案 0 :(得分:0)

您可以尝试使用以下fieldType

<fieldType name="AttributesField" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="10" /> 
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

PorterStemFilterFactory:它执行标准化过程,从单词中删除常见结尾。

Example: "riding", "rides", "horses" ==> "ride", "ride", "hors".

<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>

根据以下配置,字符串值 Nigerian 会细分为以下字词

Nigerian => "ni", "nig", "nige", "niger", "nigeri", "nigeria", "nigeria", "nigerian"