首页 > 解决方案 > SOLR - 在查询时被忽略的停用词

问题描述

我配置了一个在索引时间和查询时间都使用停用词的字段类型。但是,当我使用分析器分析此字段类型时,我看到这些停用词仅从索引端删除,而不是在查询端删除。这是 managed_schema 文件中的字段类型:

<fieldType class="solr.TextField" name="stopwords_test" stored="false">
          <analyzer type="index">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.EdgeNGramFilterFactory" maxGramSize="20" minGramSize="1"/>
          </analyzer>
          <analyzer type="query">
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
            <filter class="solr.PorterStemFilterFactory"/>
          </analyzer>
</fieldType>

标签: solr

解决方案


您在KeywordTokenizer查询端使用 a 。KeywordTokenizer 什么都不做 - 即它不拆分输入字符串输入多个标记。停止过滤器适用于标记,并且由于现在整个输入字符串是一个大标记,因此没有任何标记与停用词列表匹配。

给定,这将在由:和索引时the input string分成三个标记。通常会被视为停用词并被删除,最终您会在索引中找到and 。StandardTokenizertheinputstringtheinputstring

当您查询和输入 时the input string,KeywordTokenizer 除了将所有内容保存为单个标记外,什么都不做,因此 StopFilter 只看到the input string. 这不匹配任何停用词(除非您将整个字符串本身作为停用词),并且不会删除任何内容。

StandardTokenizer如果这是您想要的行为,或者WhitespaceTokenizer可能是不错的选择,您将不得不使用 Tokenizer 将字符串拆分为单独的标记。


推荐阅读