【问题标题】:How can I multiply the score of two queries together in Elasticsearch?如何在 Elasticsearch 中将两个查询的分数相乘?
【发布时间】:2015-10-23 16:36:22
【问题描述】:

在 Solr 中,我可以使用 query 函数查询来返回查询的数字分数,我可以在 bf 参数的上下文中使用它,例如 bf=product(query('cat'),query('dog')) 将两个相关性分数相乘。

Elasticsearch 的搜索 API 通常使用起来更灵活,但我不知道如何才能完成同样的壮举。我可以在 function_query 的 script_function 中使用 _score,但我只能使用主查询的 _score。如何合并另一个查询的分数?如何将分数相乘?

【问题讨论】:

  • 更好的是,您可以命名这些查询并在 Solr 查询 DSL 的上下文中对它们做任何您想做的事情,例如 catQuery={!edismax qf=title^10 text v=$q},然后在函数查询中引用该查询:product($catQuery...)。失望的 Elasticsearch 缺乏这种相当强大的功能

标签: elasticsearch relevance function-query


【解决方案1】:

您可以使用 function_score 查询编写 TF*IDF 评分函数。像这样的东西(忽略 Lucene 的查询和长度标准化):

"script": "tf = _index[field][term].tf(); idf = (1 + log ( _index.numDocs() / (_index[field][term].df() + 1))); return sqrt(tf) * pow(idf,2)"

您将获取 'cat' 和 'dog' 的这些函数结果的乘积,并将它们添加到您的原始查询分数中。

这是完整的查询gist

【讨论】:

  • 还有许多其他索引级别的信息,您可以使用这些信息直接在 DSL 中测试和构建自己的评分脚本:elastic.co/guide/en/elasticsearch/reference/1.6/…
  • 非常棒的答案......但我会避免这种类型的低级细节。特别是如果我正在考虑多术语或多字段查询。 function_scorefunctions 支持 filter 部分。理想情况下,我们也可以有一个 query 部分。
  • 或者更简单,将score_mode 参数添加到Bool Queryshould 块。 (截至目前,ES 对布尔查询的评分如下:must 子句分数 + sum-of(should 子句分数))。你要做的是must 子句分数 + prod-of(should 子句分数)。
【解决方案2】:

或者,如果您在 bf 中有足够重的内容,您不希望在整个匹配集中运行它,您可以使用 rescore requests 修改 前 N 名的得分ORIGINAL QUERY 结果排名 使用您的(猫、狗等)评分查询的后续评分传递。

【讨论】:

  • 为什么同一个问题你回答了两次?如果您希望提供替代解决方案,可以将其添加到相同的答案中
  • 我喜欢将两个不同的答案呈现为两个不同的答案,以便投票可以区分它们
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多