Elastic DSL:按数字键聚合和排序

Elastic DSL: Aggregate and order by keys as numeric

在我的数据集中,持续时间字段是字符串,我试图通过以下方式查找持续时间的聚合计数:

"aggs": {
    "duration": {
      "terms": {
            "script": "Math.ceil(doc[\"duration\"].value as double)",
            "order" : { "_term" : "asc"}
          }
    }
  }

此 returns 结果为:

"buckets" : [ {
        "key" : "1.0",
        "doc_count" : 4561
      }, {
        "key" : "10.0",
        "doc_count" : 117
      }, {
        "key" : "2.0",
        "doc_count" : 6004
      } ]

问题: 我想根据键的数值排序。基于documentation我找不到方法。

我看到了三种可能性:

一个。将您的 duration 字段索引为数字类型,即 integerdouble 或任何对您的值有意义的值

乙。如果 duration 没有太多不同的值(并且持续时间是自然数),您还可以使用 range aggregation 指定所有范围(1-2、2-3、3-4 , 4-5, 等等)

{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "durations": {
      "range": {
        "script": "Math.ceil(doc.duration.value as double)",
        "ranges": [
          {
            "to": 1
          },
          {
            "from": 1,
            "to": 2
          },
          {
            "from": 2,
            "to": 3
          },
          ...
        ]
      }
    }
  }
}

C。使用 avg metric 子聚合来推断 duration 的数值并使用该值对顶部聚合进行排序。

{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "duration": {
      "terms": {
        "script": "Math.ceil(doc[\"duration\"].value as double)",
        "order": {
          "avgduration": "asc"
        }
      },
      "aggs": {
        "avgduration": {
          "avg": {
            "script": "doc.duration.value as double"
          }
        }
      }
    }
  }
}