【问题标题】:ShingleFilter search with more terms than indexed phrase fails词条多于索引短语的 ShingleFilter 搜索失败
【发布时间】:2010-07-13 08:19:24
【问题描述】:

我在 Windows 上使用 Solr 1.4.1 (lucene 2.9.3) 并试图了解 ShingleFilter。我编写了以下代码,发现如果我提供的单词多于字段中索引的实际短语,则对该字段的搜索将失败,即 debugQuery=true 时该字段没有提供分数。

这是我创建的用于重现的示例,其中包含字段名称和索引的文档:
编号:1
title_1:妮娜·西蒙尼
title_2: 我对你施了咒语

发出以下查询 (dismax):
- “我放了 Nina Simone” - “尼娜西蒙尼”

尝试分析上述差异,当我使用 Solr 的 Field Analysis 和“shingle”字段(如下所示)并尝试“Nina Simone I put”时,它成功了。所以只有在查询期间才提供分数。我还检查了“parsedquery”,它显示 disjunctionMaxQuery 向 title_1 字段发出字符串“Nina_Simone Simone_I I_put”。

title_1 和 title_2 字段属于“shingle”类型,定义为:

<fieldType name="shingle" class="solr.TextField" positionIncrementGap="100" indexed="true" stored="true">
  <analyzer type="index">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.ShingleFilterFactory" maxShingleSize="2" outputUnigrams="false"/>
  </analyzer>
  <analyzer type="query">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.ShingleFilterFactory" maxShingleSize="2" outputUnigrams="false"/>
  </analyzer>
</fieldType>

请注意,我还有一个包罗万象的字段,即文本。我将 qf 设置为:'id^2 catchall^0.8' 和 pf 设置为:'title_1^1.5 title_2^1.2'

我有什么遗漏或做错了吗?

【问题讨论】:

    标签: search lucene solr


    【解决方案1】:

    在 dismax 查询中,查询的分数是子查询的最大值。不是总和。我不太了解它是如何稀疏 shingle 查询的,但是如果它执行类似 "(title1:(shingle1 shingle2...)) (title2:(shingle1 shingle2...))" 的事情,那么您应该期望看到只有一个字段对分数有贡献。

    【讨论】:

    • 是的,如果 tie 为 0.0,dismax 确实取总和的最大值。您的上述观点是正确的,但是当您将 debugQuery 设置为 true 时,它​​应该在选择最大值之前显示每个查询的分数是多少。请注意,我已经使用 PositionFilterFactory 修复了上述问题(感谢 Steve),并试图了解它是如何修复它的。有什么想法吗?
    猜你喜欢
    • 2012-08-12
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 2019-12-06
    • 1970-01-01
    • 2013-05-29
    相关资源
    最近更新 更多