Solr查询:停用词、OR和AND问题

6
我们正在使用带有以下字段声明的Solr 3.5模式:
<fieldType name="fieldN" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.WordDelimiterFilterFactory"
            generateWordParts="0" generateNumberParts="0" catenateWords="0" catenateNumbers="0" 
            catenateAll="0" splitOnCaseChange="1" splitOnNumerics="0" preserveOriginal="1"/>
    <filter class="solr.LengthFilterFactory" min="2" max="256"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.StopFilterFactory"
            ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"
            />
    <filter class="solr.PorterStemFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.LengthFilterFactory" min="2" max="256"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.StopFilterFactory"
            ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"
            />
    <filter class="solr.PorterStemFilterFactory"/>
  </analyzer>
</fieldType>

当我们发送这样的查询时:

field1:"term1"

Solr返回结果。
当我们运行此查询时,仍然会得到结果:
field1:"term1" AND (field2:term2 OR field3:term2)

虽然term2是停用词,而term1是常规词汇。

但是当我们发送这样的查询:

field1:"term1" AND (field2:term2 OR field3:term2 OR field4:term2)

没有任何返回值。

我们还注意到,在执行以下操作时:

(field1:"term1" AND (field2:term2 OR field3:term2)) OR (field1:"term1" AND field4:term2)

这也可以,但是由于真正的查询需要在大约200个字段中搜索一个术语,因此这个选项不太受欢迎。

谢谢。


1
你期望的结果是什么?由于term2是停用词,你不应该预期第二和第三个查询都没有结果吗?无论如何,你应该首先使用Luke检查你的索引,以确保你正在查询的内容。 - Marko Topolnik
我原本以为停用词部分不会影响结果,查询像_term1_ _term2_这样的语句应该返回所有匹配_term1_的文档,即使_term2_是个停用词。我会尝试这些测试,谢谢。 - Noam
1
是的,分析停用词不会产生任何标记,因此整个查询术语应该像不存在一样。但我认为这对QueryParser来说是一个挑战。您的第二个查询是由两个子句组成的BooleanQuery,其中右侧子句是一个内部BooleanQuery。如果term2是一个停用词,那么这个内部查询将没有任何子句,因此Lucene将得到一个空的BooleanQuery。我想知道它是如何处理这种情况的。很久以前(但仍然存在)有一个关于这种情况的JIRA问题(https://issues.apache.org/jira/browse/LUCENE-933)。 - Marko Topolnik
1个回答

1

我猜你的“怪异”现象更多是由于solrconfig规则而不是带有停用词的查询。我曾经在子查询中遇到过类似的停用词查询问题,最终发现是我的Dismax搜索处理程序中的最小匹配规则。

查看你的solrconfig.xml文件,并查找你的搜索使用的requestHandler。你应该声明一个"mm"(最小匹配)字符串。尝试调整你的规则,使它们更加灵活或严格,以达到你的目标。

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接