【问题标题】:Solr nGram Filter minGramSize - token for word with only 2 charactersSolr nGram 过滤器 minGramSize - 只有 2 个字符的单词的标记
【发布时间】:2016-07-12 10:20:26
【问题描述】:

我正在使用 Solr,想了解 EdgeNGramFilterFactory 的工作原理。

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

这是该字段类型在索引时间上应用的过滤器。

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

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

我很少有带有“5 MegaPixels”一词的产品,当我搜索“5 meg”时,它会给出结果。后来我发现它不适用于“5 me”。并且不给出结果。

如果我删除 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>

【问题讨论】:

  • 您是否在 solr 管理页面上分析过同样的问题?该字段使用的确切 fieldType 是什么?
  • 我创建了文本字段类型以应用所需的单独过滤器和标记器。
  • 你能描述一下吗?它有什么?
  • 嗨,已添加到问题中

标签: solr lucene


【解决方案1】:

你可以试试下面的 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"

【讨论】:

  • 我试过这个,得到了同样的结果。如何查看制作了哪些令牌?
  • 在 solr 分析页面上检查相同。它将显示在索引时创建的令牌和在查询时发送的令牌
  • 你能检查一下当前的 fieldType ...我已经修改了相同的更改标记器...
  • 请告知您更改了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2017-08-20
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多