【问题标题】:Solrj Query - Get the most relevant record firstSolrj Query - 首先获取最相关的记录
【发布时间】:2013-02-11 08:23:57
【问题描述】:

我在Solr 4.0 中有一些文件。我希望首先显示最相关的记录,然后再显示不太相关的记录。

例如,我有 3 个标题如下的文档 -

  1. 制定收入分配政策
  2. 收入分配和经济政策
  3. 发展中国家的收入分配政策

现在,当我查询 q=title:Income Distribution Policy 之类的内容时,

我希望第 3 个文档首先显示(因为前 3 个单词完全匹配)然后我希望第 1 个文档显示第二个(除了“Towards”其余匹配项)然后我想要要显示的文档编号 2(因为中间有一些单词)。

我的schema.xml 看起来像这样 -

<types>
  <fieldType name="search" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SnowballPorterFilterFactory" language="German2" />
    <filter class="solr.PorterStemFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SnowballPorterFilterFactory" language="German2" />
    <filter class="solr.PorterStemFilterFactory"/>
  </analyzer>
</fieldType>
</types>

<fields>
   <field name="title" type="search" indexed="true" stored="true"/>
</fields>

EDIT 1 调试输出

"rawquerystring": "title:Income Distribution Policy",
"querystring": "title:Income Distribution Policy",
"parsedquery": "title:incom title:distribut title:polici",
"parsedquery_toString": "title:incom title:distribut title:polici"

EDIT 2 修改了 fieldType

我用了下面的组合,输出还是一样的。

  1. StandardTokenizerFactory - autoGeneratePhraseQueries(不存在) - PorterStemFilterFactory。
  2. StandardTokenizerFactory - autoGeneratePhraseQueries="true" - PorterStemFilterFactory。
  3. StandardTokenizerFactory - autoGeneratePhraseQueries(不存在)。
  4. StandardTokenizerFactory - autoGeneratePhraseQueries="true"。
  5. WhitespaceTokenizerFactory - autoGeneratePhraseQueries(不存在) - PorterStemFilterFactory。
  6. WhitespaceTokenizerFactory - autoGeneratePhraseQueries="true" - PorterStemFilterFactory。
  7. WhitespaceTokenizerFactory - autoGeneratePhraseQueries(不存在)。
  8. WhitespaceTokenizerFactory - autoGeneratePhraseQueries="true"。

【问题讨论】:

    标签: solr schema solrj


    【解决方案1】:

    如果您不按其他任何内容进行排序,则您正在按相似度/相关性进行排序。因此,如果您没有以正确的顺序获得结果,您可能需要考虑如何分配权重以及您正在使用哪些查询解析器。

    我假设您正在使用 eDismax 并在标题字段上进行提升。此外,请查看 mm(最小匹配)和 pf(短语字段)以进行提升。

    您可能还想使用在您的 fieldType 上设置的 autoGeneratePhraseQueries 字段进行测试。

    当然,查询上的 debugQuery=true 将帮助您了解正在发生的事情。您可能会发现,在您尝试读取调试输出的前几次,添加 debug.explain.structured=true 可能很有用。

    【讨论】:

    • 我使用 debugQuery=true 和 debug.explain.structured=true 执行了查询。我发现在开始时原始查询本身是标记化的,即查询是这样标记的 - 标题:收入标题:分配标题:策略,因此不会显示完全匹配。你能给我一些解决方案吗?如果有帮助,我可以分享调试输出。
    • 尝试将 autoGeneratePhraseQueries="true" 放在类型定义上,看看它是否会改善结果。
    • 也会尝试的。这需要重新生成索引,这可能需要一些时间。会回复你的。谢谢你的帮助,我希望以后也能来。
    • 结果是一样的。我尝试了使用 autoGeneratePhraseQueries true 和 false(未提及)的 StandardTokenizerFactory。我还尝试了使用 autoGeneratePhraseQueries true 和 false(未提及)的 WhitespaceTokenizerFactory。我也尝试了上面有和没有词干的方法。结果是一样的。
    【解决方案2】:

    我尝试在查询字符串周围使用"",它成功了。

    喜欢 - q=title:"Income Distribution Policy" OR title:Income Distribution Policy

    这给了我文档 1、文档 3 和文档 2 的输出。不完美但足够接近。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-27
      • 2012-03-23
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多