考虑以下针对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)它们所包含的最佳结果,这些结果是根据原始重新评分查询确定的。

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

有没有更好的方法来达到我想要的最终结果,或者某种方式我可以修复此查询以使其达到我期望的方式?

最佳答案

documentation:



随着rescore query阶段之后post_filter的加入,我假设术语“聚合存储桶”已经固定。

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

关于elasticsearch - 如何在Elasticsearch中基于重新评分功能选择最高级的存储桶,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52212625/

10-09 09:46