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
字段索引为数字类型,即 integer
、double
或任何对您的值有意义的值
乙。如果 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"
}
}
}
}
}
}
在我的数据集中,持续时间字段是字符串,我试图通过以下方式查找持续时间的聚合计数:
"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
字段索引为数字类型,即 integer
、double
或任何对您的值有意义的值
乙。如果 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"
}
}
}
}
}
}