【问题标题】:How to do a constant score query in Solr如何在 Solr 中进行恒定分数查询
【发布时间】:2011-05-25 23:52:12
【问题描述】:

我正在使用 SolrNet 访问 Solr 索引,其中有一个名为“tags”的多值字段。我要执行以下伪代码查询:

(tags:stack)^10 OR (tags:over)^5 OR (tags:flow)^2

其中术语“stack”被提升 10,“over”被提升 5,“flow”被提升 2。我想要的结果是“stack”的结果将高于那些有“流”等的。

我遇到的问题是说“流”只出现在几个文档中,但“堆栈”出现在加载中,然后由于高 idf 值,带有“流”的文档出现在带有“堆栈”的文档之上”。

当这个项目直接在 Lucene 中实施时,我使用了 ConstantScoreQuery,它们消除了 idf,其分数仅基于 boost 值。

如何使用 Solr 和 SolrNet 实现这一点,我实际上只是向 Solr 传递了一个查询字符串?如果不能,是否有其他方法可以解决此问题?

提前致谢!

【问题讨论】:

  • 如果你去掉最后一个子句的分数提升怎么办? (tags:flow) 我相信这是一个恒定的分数查询。实际上,它是默认值 1 的分数提升。

标签: solr lucene solrnet solr-boost


【解决方案1】:

Solr 5.1 及更高版本通过 ^= 运算符将此内置到查询解析器语法中。

因此,只需使用您的原始查询: (tags:stack)^10 OR (tags:over)^5 OR (tags:flow)^2

并将 ^ 替换为 ^= 以从提升变为常量: (tags:stack)^=10 OR (tags:over)^=5 OR (tags:flow)^=2

【讨论】:

  • 添加虚假范围查询会影响性能。这应该是公认的答案。感谢@Yonik 的解决方案
【解决方案2】:

我认为没有办法在 Solr 中直接表达 ConstantScoreQuery,但似乎 range and prefix queries use ConstantScoreQuery under the hood,所以你可以尝试伪造一个范围查询,例如tags:[flow TO flow]

或者,您可以实现自己的 Solr QueryParser。

【讨论】:

  • 伪造一个范围查询是一种享受(至少现在是这样)。如果时间允许,我可能会考虑实现自定义查询解析器。谢谢。
猜你喜欢
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
相关资源
最近更新 更多