Solr查询:停止文字,或和古怪
我们将Solr 3.5与具有以下字段声明的模式一起使用: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
<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。