Solr查询:停止文字,或和古怪

Solr查询:停止文字,或和古怪,solr,lucene,Solr,Lucene,我们将Solr 3.5与具有以下字段声明的模式一起使用: <fieldType name="fieldN" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="solr.WhitespaceTokenizerFactory"/> <filter class="solr.WordDelimiterFilt

我们将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>
Solr返回结果

运行此查询时,仍会得到以下结果:

field1:"term1" AND (field2:term2 OR field3:term2)
而term2是一个停止词,term1是一个常规词

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

field1:"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个字段中搜索一个术语,所以不太喜欢这个选项


谢谢。

我猜你的“wierdness”更多地与你的solrconfig规则有关,而不是与你的stopwords查询有关。我在子查询中遇到过类似的stopword查询问题,它最终成为我的Demax搜索处理程序中的最小匹配规则

查看您的
solrconfig.xml
并查找您的搜索正在使用的
requestHandler
。您应该声明一个
“mm”
(最小匹配)字符串。不管你的目标是什么,试着调整你的规则,使它们更少或更严格


祝你好运

你的预期结果是什么?既然term2是一个stopword,那么您不应该期望第二次和第三次查询都没有结果吗?无论如何,你应该采取的第一步是与Luke一起检查你的索引,只是为了确定你到底在查询什么。我希望停止字部分不会影响结果,像term1这样的查询term2应该返回所有与term1匹配的文档,当term2是停止字时。我将尝试测试,谢谢。是的,分析stopword不会产生任何标记,因此整个查询词应该看起来好像不存在。但我认为这对爱发牢骚的人来说是一个挑战。您的第二个查询是一个包含两个子句的布尔查询,其中右子句是一个内部布尔查询。如果term2是stopword,那么这个内部查询就没有子句,因此Lucene剩下一个空布尔查询。我想知道它是如何处理的。(很久以前,但现在仍然)有一个关于这个案件的JIRA。