我正在从 3.x 迁移到 4.x,并且正在运行一些查询来验证一切是否像以前一样工作。 然而,我发现查询“galaxy s3”给出的结果要少得多。在 3.x 中 numFound=1628,在 4.x 中 numFound=70。
这是相关的架构部分:
<fieldtype name="text_pt" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
<analyzer type="index">
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="-" replacement="IIIHYPHENIII"/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.PatternReplaceFilterFactory" pattern="IIIHYPHENIII" replacement="-"/>
<filter class="solr.ASCIIFoldingFilterFactory" />
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" preserveOriginal="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="false" words="portugueseStopWords.txt"/>
<filter class="solr.BrazilianStemFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="-" replacement="IIIHYPHENIII"/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.PatternReplaceFilterFactory" pattern="IIIHYPHENIII" replacement="-"/>
<filter class="solr.ASCIIFoldingFilterFactory" />
<filter class="solr.SynonymFilterFactory" ignoreCase="true" synonyms="portugueseSynonyms.txt" expand="true"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" preserveOriginal="1" catenateNumbers="0" catenateAll="0" protected="protwords.txt"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="false" words="portugueseStopWords.txt"/>
<filter class="solr.BrazilianStemFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldtype>
该查询涉及的同义词有:
siii, s3
galaxy, galax
我的默认搜索运算符是 AND(在两个版本中,即使它在 4.x 中已弃用),调试的输出是:
SOLR 3.x
<str name="parsedquery">+(title_search_pt:galaxy title_search_pt:galax)
+MultiPhraseQuery(title_search_pt:"(sii s3 s) 3")</str>
SOLR 4.x
<str name="parsedquery">+((title_search_pt:galaxy title_search_pt:galax)/no_coord)
+(+title_search_pt:sii +title_search_pt:s3 +title_search_pt:s +title_search_pt:3)/str>
奇怪的是它不会返回像“galaxy s3”这样的结果。这是调试查询:
与必需的子句不匹配 (+title_search_pt:sii +title_search_pt:s3 +title_search_pt:s +title_search_pt:3)
(NON-MATCH) 未能满足必需/禁止条款的条件,与必需条款不匹配 (title_search_pt:sii)
(NON-MATCH)没有匹配的术语
(MATCH) 权重(title_search_pt:1834535 中的 s3)
(MATCH) 权重(title_search_pt:s in 1834535)
(MATCH) 权重(1834535 中的 title_search_pt:3)
当 sii 应该与 s 和 s3 进行“或”运算时,sii 为何是必需的?
分析输出显示 sii 的标记位置为 2,就像它的同义词一样,如下所示:
galaxy sii 3
galax s3
s
最佳答案
出于某种我们不知道的原因,autoGeneratePhraseQueries="false"在 SOLR 3.x 中没有得到尊重,但在 4.x 中却得到了尊重。
为了保持我们在解析查询中看到的相同行为,我们必须将标志切换为 true。
感谢 SOLR 邮件列表中的 Chris Hostetter 为我提供了答案。
关于java - SOLR 4.x 与 3.x 解析查询的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18661996/