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