elasticsearch - 如何根据 Elasticsearch 中的重新评分函数选择顶级术语桶

标签 elasticsearch search lucene elasticsearch-5 relevance

考虑以下针对 Elasticsearch 5.6 的查询:

{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "rescore": [
    {
      "window_size": 10000,
      "query": {
        "rescore_query": {
          "function_score": {
            "boost_mode": "replace",
            "script_score": {
              "script": {
                "source": "doc['topic_score'].value"
              }
            }
          }
        },
        "query_weight": 0,
        "rescore_query_weight": 1
      }
    }
  ],
  "aggs": {
    "distinct": {
      "terms": {
        "field": "identical_id",
        "order": {
          "top_score": "desc"
        }
      },
      "aggs": {
        "best_unique_result": {
          "top_hits": {
            "size": 1
          }
        },
        "top_score": {
          "max": {
            "script": {
              "inline": "_score"
            }
          }
        }
      }
    }
  }
}

这是一个简化版本,其中真正的查询有一个更复杂的主查询,并且 rescore 函数更加密集。

让我先解释一下它的用途,以防我要花 1000 小时开发一支可以在太空中书写的钢笔,而铅笔实际上可以解决我的问题。我正在执行一个快速的初始查询,然后使用更密集的函数重新对顶部结果进行评分。从这些结果中,我想显示最重要的不同值,即任何两个结果都不应具有相同的 identical_id。如果有更好的方法来做到这一点,我也会认为这是一个答案。

我预计这样的查询会按 rescore 查询对结果进行排序,将具有相同 identical_id 的所有结果分组,并显示每个此类不同组的热门结果。我还假设,由于我按最大父 _score 对这些术语聚合桶进行排序,因此它们将被排序以反射(reflect)它们包含的最佳结果,这是根据原始 rescore 查询确定的。

实际情况是术语桶是按最大查询分数而不是重新查询分数排序的。奇怪的是,桶中的热门歌曲似乎确实使用了重新评分。

是否有更好的方法来实现我想要的最终结果,或者我可以通过某种方式修复此查询以使其按我期望的方式工作?

最佳答案

来自 documentation :

The query rescorer executes a second query only on the Top-K results returned by the query and post_filter phases. The number of docs which will be examined on each shard can be controlled by the window_size parameter, which defaults to 10.

由于 rescore 查询post_filter 阶段之后启动,我假设术语聚合桶已经固定。

我不知道如何结合重新评分和聚合。对不起:(

关于elasticsearch - 如何根据 Elasticsearch 中的重新评分函数选择顶级术语桶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52212625/

相关文章:

sorting - boost 弹性聚集结果

java - 我可以使用哪个函数代替 elasticsearch 2.1 中的 ImmutableSettings.settingsBuilder()

C#,按字母顺序对 LINQ 结果进行排序,然后根据搜索键对其进行排序

lucene - ElasticSearch中聚合中的范围0计数项

lucene - 如何检测 Lucene 自由文本搜索查询中的日期?

elasticsearch - Elasticsearch索引恢复

arrays - 如何在有序矩阵中高效搜索?

c - 搜索方法失败

Java:使用 URLDecoder 但保留加号 (+)

elasticsearch - Elastic Search,是否可以获取搜索结果集中特定文档的索引?