【问题标题】:Few Solr stopwords showing up in facet search results很少有 Solr 停用词出现在构面搜索结果中
【发布时间】:2015-07-07 03:53:13
【问题描述】:

问题:在构面搜索结果中显示的 Solr 停用词很少。

当前实施: 我在stopwords.txt 文件中至少有 30 到 40 个停用词。 Solr 方面搜索与停用词完美配合:

对于,是,和,作为

但很少有像

这样的停用词

打电话,陈述,询问

出现在构面搜索结果中。我尝试使用 solr 分析。单词出现在 ST。

我正在使用以下配置

<field name="message" type="text_en" indexed="true" stored="true" 
multiValued="true"/>

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

【问题讨论】:

  • 索引后是否更改了停用词列表?对停用词文件进行任何更改后,您需要重新索引。
  • 是的,我在进行更改后确实重新编制了索引。我做了几次,但遇到了同样的问题。
  • 这里我发现如果我从索引分析器中删除了 PorterStemFilterFactory。停用词停止显示在构面搜索结果中。有人知道这是什么原因吗?

标签: solr lucene


【解决方案1】:

尝试更改过滤器的顺序。将StopFilterFactory 放在链中的最后。这应该可以防止停用词被索引。

<field name="message" type="text_en" indexed="true" stored="true" 
multiValued="true"/>

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

说明

前一个分词器/过滤器的输出作为输入馈送到下一个分词器/过滤器。

来自Solr Reference Guide

过滤器检查令牌流并保留、转换或丢弃它们 他们,或创建新的。 分词器和过滤器可以组合成 形成管道或链,其中一个的输出是输入到 next. 这样的分词器和过滤器序列称为 分析器和分析器的结果输出用于匹配 查询结果或建立索引。

因此,如果您有“调用”之类的词,它将首先到达您的 fieldType 链中的StopFilterFactory

由于“calling”不在您的 stopwords.txt 文件中,因此它将转到 PorterStemFilterFactory,其中“calling”更改为“call”。

检查此website 以使用 PorterStemFilterFactory 查看根词)并索引该词。

这就是为什么您仍然在索引中看到停用词的原因。

根据您使用的 Solr 版本,您可能会看到“呼叫”之类的词是如何被编入索引的。

http://YourSolrIPAddress:8983/solr/#/YourCoreORCollection/schema-browser?field=message

【讨论】:

  • 感谢它正在工作。我把停用词放在最后,一切都按预期工作。谢谢你的解释。
猜你喜欢
  • 2011-08-30
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
相关资源
最近更新 更多