考虑以下针对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/