我们使用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>
Run Code Online (Sandbox Code Playgroud)
当我们发送这样的查询时:
field1:"term1"
Run Code Online (Sandbox Code Playgroud)
Solr返回结果.
当我们运行此查询时,我们仍然得到结果:
field1:"term1" AND (field2:term2 OR field3:term2)
Run Code Online (Sandbox Code Playgroud)
虽然term2是一个停用词,term1是一个常用词.
但是当我们发送这样的查询时:
field1:"term1" AND (field2:term2 OR field3:term2 OR field4:term2)
Run Code Online (Sandbox Code Playgroud)
什么都没有回来.
我们还注意到,当我们做类似的事情:
(field1:"term1" AND (field2:term2 OR field3:term2)) OR (field1:"term1" AND field4:term2)
Run Code Online (Sandbox Code Playgroud)
也适用,但由于真正的查询应在大约200个字段中搜索一个术语,因此不太喜欢此选项.
谢谢.
我猜测您的“怪异”更多地与您的 solrconfig 规则有关,而不是与您的停用词查询有关。我在子查询内的停用词查询中遇到了类似的问题,它最终成为我的 Dismax 搜索处理程序中的最小匹配规则。
查看您的内部solrconfig.xml并查找requestHandler您的搜索正在使用的内容。您应该"mm"声明一个(最小匹配)字符串。无论您的目标是什么,尝试调整您的规则,使其限制更少或更多。
祝你好运!