ElasticSearch-聚合中具有最小值的顺序



我在索引中有一些对象通过一个id相关,该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"}
}
}
}
}

我用错了订单:

找到两个聚合类型定义

使用composite聚合无法实现这一点,因为terms源不能按子聚合的值排序,就像使用";正常的";CCD_ 5聚合。(日期格式也错误(

因此,正确的查询会给你想要的是这个:

{
"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"
}
}
}
}
}
}

由于复合聚合的工作方式,不可能实现您想要的。原因是已经创建了复合聚合;paginate";在一大堆水桶上。分页是由存储桶的排序方式定义的。如果可以根据子聚合对存储桶进行排序,这意味着在返回第一页结果之前,所有存储桶都需要进行预计算和预排序,这将完全违背这种聚合的目的。

您正在添加一个额外的{

{
"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"
}
}
}
}
}
}

最新更新