【问题标题】:stop synonyms.txt file Solr from being stemmed阻止 synonyms.txt 文件 Solr 被阻止
【发布时间】:2017-11-14 18:53:05
【问题描述】:

在 synonyms.txt 文件中我有一个条目 marine => saltwater,marine 但这两个词都被分别归为'saltwat', 'marin',尽管它们位于受保护的单词文件中。有办法避免吗?

schema.xml

 <fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.ASCIIFoldingFilterFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.EnglishPossessiveFilterFactory"/>
      <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
      <filter class="solr.CommonGramsFilterFactory" words="lang/stopwords_en.txt" ignoreCase="true"/>
      <filter class="solr.PorterStemFilterFactory"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt" />
      <filter class="solr.ASCIIFoldingFilterFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.EnglishPossessiveFilterFactory"/>
      <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
      <filter class="solr.CommonGramsFilterFactory" words="lang/stopwords_en.txt" ignoreCase="true"/>
      <filter class="solr.PorterStemFilterFactory"/>
      <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" analyzer="org.apache.lucene.analysis.en.EnglishAnalyzer" />
    </analyzer>
  </fieldType>

同义词.txt

marine => saltwater,marine

protwords.txt

saltwater
marine

现在,当我在管理面板中进行分析并查询 saltwat 时,就会出现 saltwat | marin。这意味着盐水确实在 synonyms.txt 文件中被限制为 saltwat

【问题讨论】:

  • 为这个字段分享你的 schema.xml

标签: solr solrcloud synonym stemming


【解决方案1】:

solr 分析的工作顺序与您在 schema 中的 fieldType 定义中声明它的顺序相同。因此,如果您在 Synonyms 过滤器之后声明任何 Stem 过滤器,它将在同义词更改后应用。如果不想这样,SynonymsFilter 应该配置在 StemFilter 之后,例如:

<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.ASCIIFoldingFilterFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.EnglishPossessiveFilterFactory"/>
      <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
      <filter class="solr.CommonGramsFilterFactory" words="lang/stopwords_en.txt" ignoreCase="true"/>
      <filter class="solr.PorterStemFilterFactory"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt" />
      <filter class="solr.ASCIIFoldingFilterFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.EnglishPossessiveFilterFactory"/>
      <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
      <filter class="solr.CommonGramsFilterFactory" words="lang/stopwords_en.txt" ignoreCase="true"/>
      <filter class="solr.PorterStemFilterFactory"/>
      <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" />
    </analyzer>
  </fieldType>

我建议您在 Solr Admin 中检查 Solr Analysis 工具,以检查您的字段在索引和查询时间的情况。

如果您需要更多帮助,请分享您的架构。

【讨论】:

  • 我已经添加了所有必要的文件。请看一看。
  • 那是因为您在同义词过滤器配置中使用了 org.apache.lucene.analysis.en.EnglishAnalyzer。它也负责应用词干。尝试从您的同义词过滤器配置中删除分析器(我已经更新了答案以匹配您的配置)。
  • 是的,需要英文分析器,因为它可以处理大量输入,但我看到lucene.apache.org/core/4_4_0/analyzers-common/org/apache/lucene/… 中有 3 个构造函数,所以有没有办法可以在我的架构中使用第三个构造函数传递 stemExclusionSet 以阻止单词在 synonyms.txt 中得到词干
  • 目前您似乎无法更改分析器配置:lucene.472066.n3.nabble.com/…。您可以做的是构建自己的分析器,将其打包为 solr 中的自定义库,并在您的同义词配置中引用它。在这种情况下,您只需扩展 EnglishAnalyser 并配置您想要更改的内容。但是.. 你确定你真的需要分析同义词吗?
  • 我的意思是你可以编写自己的分析器...我还没有使用分析器这样做,但理论上它是这样的:编写扩展 EnglishAnalyser 并调用构造函数的 java 类您需要,将其打包到 jar 文件中,将该 jar 包含在 solr contrib 文件夹中,将该 jar 引用为 solrconfig.xml 中的 ,并在 synonymFilter 配置中引用您的分析器类(完全限定的类名)。
【解决方案2】:

Protwords(受保护的词)是由 你不想被词干的英语搬运工词干分析器。

可以使用模式中的“受保护”属性指定自定义的受保护词列表。 Solr 中的任何词干分析器都不会修改受保护词列表中的任何词。

<fieldtype name="myfieldtype" class="solr.TextField">
  <analyzer>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt" />
    <filter class="solr.PorterStemFilterFactory" />
  </analyzer>
</fieldtype>

【讨论】:

  • 我已经添加了所有必要的文件。请看一看。
猜你喜欢
  • 2015-12-15
  • 2012-07-25
  • 2020-03-14
  • 1970-01-01
  • 2012-01-19
  • 2018-05-29
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多