首页 > 解决方案 > 在 Elasticsearch 中按分数排序复合聚合结果

问题描述

弹性搜索版本:6.2.4

我现在通过以下方式获得了复合聚合的结果:

GET index/_search
{
  "aggs": {
    "my_buckets": {
      "composite": {
        "sources": [
          {
            "name": {
              "terms": {
                "field": "name.keyword"
                }
            }
          }
        ]
      }
    }
  },
  "query":{

   }
}

为简化问题,此处省略查询部分。

我可以得到如下结果:

"aggregations": {
    "my_buckets": {
      "buckets": [
        {
          "key": {
            "name": "Bill Gates"
          },
          "doc_count": 1
        },
        {
          "key": {
            "name": "Steven Paul Jobs"
          },
          "doc_count": 1
        },
        {
          "key": {
            "name": "Gates Godar"
          },
          "doc_count": 1
        }
        ]
       }
      }

我注意到搜索结果的顺序不是按查询字符串的来源(相似性)排序的。

我们如何实现按分数对复合聚合结果进行排序?

谢谢。

标签: elasticsearch

解决方案


我发现的唯一选择是使用管道 bucket_sort 聚合,使用读取分数的最大度量聚合中的值

{
  "aggs": {
    "myBuckets": {
      "composite": {
        "sources": []
      },
      "aggs": {
        "mySort": {
          "bucket_sort": {
            "sort": [
              {
                "max_score": {
                  "order": "desc"
                }
              }
            ]
          }
        },
        "max_score": {
          "max": {
            "script": "_score"
          }
        }
      }
    }
  }
}

推荐阅读