Solr 停用词魔法

Ale*_*lka 3 lucene search solr stop-words solr4

我的停用词没有按预期工作。这是我的架构的一部分:

<fieldType name="text_general" class="solr.TextField">
    <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

<fieldType class="solr.TextField" name="text_auto">
    <analyzer type="index">
        <charFilter class="solr.HTMLStripCharFilterFactory"/>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        <filter class="solr.ShingleFilterFactory" maxShingleSize="3" outputUnigrams="true" outputUnigramsIfNoShingles="false"/>
    </analyzer>
    <analyzer type="query">
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false"/>
    </analyzer>
</fieldType>

<field name="deal_title_terms" type="text_auto" indexed="true" stored="false" required="false" multiValued="true"/>

<field name="deal_description" type="text_general" indexed="true" stored="true" required="false" multiValued="false"/>
Run Code Online (Sandbox Code Playgroud)

在 stopwords.txt 中,我有以下单词:the、is、a;
我的字段中还有下一个数据:

deal_description - 这是我的描述
deal_title_terms - 这是交易标题和条款(将按条款拆分)

当我尝试搜索 deal_description 时:
示例 1:“deal_description:his is the m ” - 我希望返回带有 deal_description “This is the my description”的文档
示例 2:“deal_description:is th ” - 我希望什么也不会被发现是因为“is”和“the”是停用词。

当我尝试搜索 deal_title_terms:
示例 1: "deal_title_terms: is " - 我预计不会找到任何内容,因为“is”是停用词。
示例 2:“deal_title_terms:is the deal ” - 我希望“is”和“the”将被忽略,并且会找到术语“deal”。
示例 3:“deal_title_terms:标题 a 条款” - 我预计“a”将被忽略,并且会找到术语“标题条款”。

问题 1:为什么停用词不适用于“deal_description”字段?
问题 2:为什么我的查询中“deal_title_terms”字段的停用词没有被删除?(当我尝试查找标题术语时,它不会找到“标题术语”术语)
问题 3:有没有办法在搜索结果中显示停用词,但是阻止他们搜寻?例子:

数据:这是很酷的搜索引擎
搜索查询:“ is coo ” -> 返回“这是很酷的搜索引擎”
搜索查询:“ is ” -> 不返回任何内容
搜索查询:“ This coll ” -> 返回“这是很酷的搜索引擎” ”

问题 4:在哪里可以找到停用词在 solr 中如何工作的详细描述(也许还有示例)?因为它看起来像魔法。

Abh*_*tti 5

问题 1 的答案:替换“KeywordTokenizerFactory”,因为它不进行实际标记化,因此整个输入字符串将保留为单个标记。请改用 StandardTokenizerFactory。

或者使用下面的字段类型。

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
Run Code Online (Sandbox Code Playgroud)

对于“deal_description”字段,停用词将按预期工作。

问题 3 的回答:是的。仅在 type="query" 的分析器中添加 StopFilterFactory。它将阻止他们搜索并且在索引时不添加它们。

问题 4 的答案:https ://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters

问题 2 的回答:您创建的自定义字段似乎不正确。必须首先使用标记器对文本进行标记,但您首先使用过滤器。通过solr分析页面查看其分析。

  • 我无法使用 KeywordTokenizerFactory。我的搜索(如此字段:*这是我的搜索*)将无法使用此过滤器,因为看起来它用空格分割字符串。此页面https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters没有停用词详细描述。 (2认同)