如何按术语聚合的嵌套doc_count对存储桶进行排序?



我有一个索引,invoices,我需要聚合到年度存储桶中然后排序。

我已经成功地使用存储桶排序按简单的总和值(revenuetax(对我的存储桶进行排序。但是,我正在努力按更深嵌套的doc_count值(status(进行排序。

我不仅想按revenue排序我的存储桶,还想按status字段等于 1、2、3 等的文档数量排序......

我的索引中的文档如下所示:

"_source": {
"created_at": "2018-07-07T03:11:34.327Z",
"status": 3,
"revenue": 68.474,
"tax": 6.85,
}

我请求这样的聚合:

const params = {
index: 'invoices',
size: 0,
body: {
aggs: {
sales: {
date_histogram: {
field: 'created_at',
interval: 'year',
},
aggs: {
total_revenue: { sum: { field: 'revenue' } },
total_tax: { sum: { field: 'tax' } },
statuses: {
terms: {
field: 'status',
},
},
sales_bucket_sort: {
bucket_sort: {
sort: [{ total_revenue: { order: 'desc' } }],
},
},
},
},
},
},
}

响应(截断(如下所示:

"aggregations": {
"sales": {
"buckets": [
{
"key_as_string": "2016-01-01T00:00:00.000Z",
"key": 1451606400000,
"doc_count": 254,
"total_tax": {
"value": 735.53
},
"statuses": {
"sum_other_doc_count": 0,
"buckets": [
{
"key": 2,
"doc_count": 59
},
{
"key": 1,
"doc_count": 58
},
{
"key": 5,
"doc_count": 57
},
{
"key": 3,
"doc_count": 40
},
{
"key": 4,
"doc_count": 40
}
]
},
"total_revenue": {
"value": 7355.376005351543
}
},
]
}
}

例如,我想按key: 1排序。根据存储桶具有最多文档数且状态值为 1 的存储桶进行排序。我尝试对我的术语聚合进行排序,然后指定所需的键,如下所示:

statuses: {
terms: {
field: 'status',
order: { _key: 'asc' },
},
},
sales_bucket_sort: {
bucket_sort: {
sort: [{ 'statuses.buckets[0]._doc_count': { order: 'desc' } }],
},
},

然而,这并没有奏效。它没有错误,只是似乎没有任何效果。

多年前,我注意到SO上的其他人也有类似的问题,但我希望从那时起会出现一个更好的答案:Elasticsearch聚合。按嵌套存储桶doc_count排序

谢谢!

没关系,我想通了。我添加了一个单独的过滤器聚合,如下所示:

aggs: {
total_revamnt: { sum: { field: 'revamnt' } },
total_purchamnt: { sum: { field: 'purchamnt' } },
approved_invoices: {
filter: {
term: {
status: 1,
},
},
},

然后我能够像这样对该值进行存储桶排序:

sales_bucket_sort: {
bucket_sort: {
sort: [{ 'approved_invoices>_count': { order: 'asc' } }],
},
},

如果有人再次遇到此问题。使用 Elasticsearch 7.10 版本尝试的最新更新可以这样工作:

sales_bucket_sort: {
bucket_sort: {
sort: [{ '_count': { order: 'asc' } }],
},
}

仅指定_count,它将自动获取doc_count并相应地排序。

我相信这个答案只会按date_histogram聚合的doc_count排序,而不是嵌套排序。

JP的答案有效:创建一个带有目标field: value过滤器,然后按它排序。

最新更新