java - SOLR 4.x 与 3.x 解析查询的差异

标签 java solr lucene solr4

我正在从 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/

相关文章:

java - 注入(inject) MultivaluedMap 的注入(inject)提供程序 (application/x-www-form-urlencoded)

java - 如何获取特定文件之后创建或更新的文件?

java - Java Point 类 getX() 或 getY() 是否自动转换?

java - 无法创建自己的方法来使用selenium的显式等待方法

search - 如果在 lucene 搜索中包含单个搜索词字段,如何排除该项目?

lucene - 在 Lucene 中,术语如何用于计算分数,我可以用 CustomScoreQuery 覆盖它吗?

node.js - SOLR 的 Nodejs 客户端 - 如何在查询中构建构面

mysql - Solr 范围查询对于某些字段无法以正确的方式工作

mysql - apache solr 中文档的请求计数

java - Hibernate Search 未正确索引嵌入式集合