在Elasticsearch中进行聚合后排序

max*_*v15 11 sorting aggregation elasticsearch

我有这种结构的文档:

{
    FIELD1:string,
    FIELD2:
        [ {SUBFIELD:number}, {SUBFIELD:number}...]
}
Run Code Online (Sandbox Code Playgroud)

我想对FIELD2.SUBFIELDs中数字总和的结果进行排序:

GET myindex/_search
{
  "size":0,
  "aggs": {
    "a1": {
      "terms": { 
        "field": "FIELD1",
        "size":0
      },
      "aggs":{
        "a2":{
          "sum":{
            "field":"FIELD2.SUBFIELD"
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我这样做,我获得的桶没有排序,但我希望桶按"a2"值排序.我怎么能这样做?谢谢!

Val*_*Val 36

你几乎拥有它.您只需要在术语聚合中添加order属性a1,如下所示:

GET myindex/_search
{
  "size":0,
  "aggs": {
    "a1": {
      "terms": { 
        "field": "FIELD1",
        "size":0,
        "order": {"a2": "desc"}      <--- add this
      },
      "aggs":{
        "a2":{
          "sum":{
            "field":"FIELD2.SUBFIELD"
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @Val当a2是scripted_metric聚合时不起作用。我将其用于必须使用`scripted_metric`聚合的情况。我收到此错误`“ reason”:{“ type”:“ aggregation_execution_exception”,“ reason”:“无效的术语聚合顺序路径[totalViews]。术语存储区只能在从零开始构建的子聚合路径上排序或路径中的更多单桶聚合,以及路径末端的最终单桶或指标聚合。” }` (2认同)

Jon*_*n R 7

来自 Val 的精彩/sf/users/322320561/

基本上是同样的事情,但以下是我找到每个“名称”的最大“大小”,并显示前 25 个最大的方法:

{
  "size": 0,
  "aggs": {
    "agg1": {
      "terms": {
        "field": "name.keyword",
        "order": {
          "agg2": "desc"
        },
        "size": 25
      },
      "aggs": {
        "agg2": {
          "max": {
            "field": "size"
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)