【问题标题】:Solr stopwords magicSolr 停用词魔术
【发布时间】:2015-06-05 09:55:19
【问题描述】:

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

<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"/>

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

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

当我尝试搜索 deal_description 时:
示例 1:“deal_description:his is the m” - 我希望返回带有 deal_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: title a terms” - 我希望忽略“a”并找到“title terms”一词。

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

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

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

【问题讨论】:

  • 要观察您的查询发生了什么,您可以使用 solr 管理页面:yourWebsite:8983/solr/#/yourCore/analysis。输入您的查询并单击分析值。
  • 我正在使用这个工具。使用此工具,我看到查询分析器从我的查询中删除了停用词,但我仍然能够找到“the”、“is”等。如果我的查询分析器只有停用词。
  • 您查询的字段是什么?
  • 我正在使用带有注释 stopFilterFactory 的“deal_title_terms”作为分析器类型 =“索引”。重新启动 solr 并重新索引数据后,我能够找到像“the”这样的字符串。 postimg.org/image/ixl40cspp
  • 如果您使用的是 edismax 查询解析器,那么您可以只搜索停用词 - 这是为了解决“存在或不存在”的难题。

标签: search solr lucene solr4 stop-words


【解决方案1】:

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

或者使用下面的 fieldType。

<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>

“deal_description”字段中的停用词将按预期工作。

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

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

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

【讨论】:

  • 我无法使用 KeywordTokenizerFactory。我的搜索(比如这个字段:*这是我的搜索*)不适用于这个过滤器,因为它看起来像用空格分割字符串。此页面wiki.apache.org/solr/AnalyzersTokenizersTokenFilters 没有停用词详细说明。
猜你喜欢
  • 2013-06-08
  • 2015-09-08
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2015-04-24
  • 2016-10-17
相关资源
最近更新 更多