我有一个索引invoices
,我需要将其聚合到每年的存储桶中,然后进行排序。
我已经成功地使用Bucket Sort按简单的总和值(revenue
和tax
)对存储桶进行了排序。但是,我很难按嵌套更深的docCount值(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' } }],
},
},
然而,这并没有奏效。它没有出错,只是看起来没有任何效果。
很多年前,我注意到其他人也有类似的问题,但我希望从那时起就出现了更好的答案:Elasticsearch aggregation. Order by nested bucket doc_count
谢谢!
3条答案
按热度按时间pgx2nnw81#
不要紧,我想通了。我添加了一个单独的过滤器聚合,如下所示:
然后我可以像这样对该值进行存储桶排序:
83qze16e2#
以防有人再提起这件事。使用Elasticearch 7.10版尝试的最新更新可能是这样工作的:
如果仅指定
_count
,它将自动获取doc_count
并进行相应的排序。kknvjkwl3#
我相信this answer将只按
date_histogram
聚合的doc_count
排序,而不是嵌套排序。JP's answer有效:使用目标
field: value
创建筛选器,然后按其排序。