ElasticSearch - 聚合中最小值的顺序

ElasticSearch - order with min in aggregation

我在索引中有一些对象,这些对象通过 id 相关联,将它们分组。 群组创建时间是群组中最小createdAt个对象与群组中最大createdAt个对象之间的时间。

我想按最短或最长时间对这些组进行排序,我该怎么做?

{
   "size":0,
   "aggs":{
      "intervals":{
         "composite":{
            "size":10000,
            "sources":[
               {
                  "totalId":{
                     "terms":{
                        "field":"totalId"
                     }
                  },
                  "name": {
                    "terms":{
                        "field":"name"
                     }
                  }
               }
            ]
         },
         "aggs": {
          "createdAtStart": {
            "min": {"field": "createdAt", "format": "YYYY-MM-DD'T'HH:mm:ssZ"}, "order": { "createdAtStart": "desc" }
          },
          "createdAtEnd": {
            "max": {"field": "createdAt", "format": "YYYY-MM-DD'T'HH:mm:ssZ"}
          }
      }
   }
}

我使用顺序错误:

Found two aggregation type definitions

您正在添加一个额外的 {

{
  "size": 0,
  "aggs": {
    "intervals": {
      "composite": {
        "size": 10000,
        "sources": [
          {
            "totalId": {
              "terms": {
                "field": "totalId"
              }
            }
          }
        ]                                    <-- note this
      },
      "aggs": {
        "createdAtStart": {
          "min": {
            "field": "createdAt",
            "format": "YYYY-MM-DD'T'HH:mm:ssZ"
          },
          "order": {
            "createdAtStart": "desc"
          }
        },
        "createdAtEnd": {
          "max": {
            "field": "createdAt",
            "format": "YYYY-MM-DD'T'HH:mm:ssZ"
          }
        }
      }
    }
  }
}

您无法使用 composite 聚合实现此目的,因为 terms 源无法按子聚合的值排序,就像“正常”[=12] 的情况一样=]聚合。 (还有日期格式错误)

所以正确的查询会给你想要的是这个:

{
  "size": 0,
  "aggs": {
    "totalId": {
      "terms": {
        "field": "totalId",
        "order": {
          "createdAtStart": "asc"
        }
      },
      "aggs": {
        "createdAtStart": {
          "min": {
            "field": "createdAt",
            "format": "yyyy-MM-dd'T'HH:mm:ssZ"
          }
        },
        "createdAtEnd": {
          "max": {
            "field": "createdAt",
            "format": "yyyy-MM-dd'T'HH:mm:ssZ"
          }
        }
      }
    }
  }
}

由于复合聚合的工作方式,无法实现您想要的效果。原因是复合聚合的创建是为了对大量的桶进行“分页”。该分页由桶的排序方式定义。如果可以根据子聚合对桶进行排序,则意味着所有桶都需要在返回第一页结果之前进行预计算和预排序,这将完全违背这种聚合的目的。