首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何按术语聚合的嵌套doc_count对存储桶进行排序?

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

Stack Overflow用户
提问于 2018-08-22 00:15:20
回答 2查看 1.8K关注 0票数 1

我有一个索引invoices,我需要将它聚合到每年的存储桶中,然后进行排序。

我已经成功地使用Bucket Sort按简单的sum值(revenuetax)对存储桶进行了排序。但是,我很难按嵌套更深的doc_count值(status)进行排序。

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

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

代码语言:javascript
复制
"_source": {
  "created_at": "2018-07-07T03:11:34.327Z",
  "status": 3,
  "revenue": 68.474,
  "tax": 6.85,
}

我像这样请求我的聚合:

代码语言:javascript
复制
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' } }],
            },
          },
        },
      },
    },
  },
}

响应(截断)如下所示:

代码语言:javascript
复制
"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的文档数量最多的存储桶进行排序。我尝试对术语聚合进行排序,然后指定所需的键,如下所示:

代码语言:javascript
复制
          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

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2018-08-22 04:19:53

不要紧,我想通了。我添加了一个单独的过滤器聚合,如下所示:

代码语言:javascript
复制
        aggs: {
          total_revamnt: { sum: { field: 'revamnt' } },
          total_purchamnt: { sum: { field: 'purchamnt' } },
          approved_invoices: {
            filter: {
              term: {
                status: 1,
              },
            },
          },

然后我可以像这样对这个值进行桶排序:

代码语言:javascript
复制
          sales_bucket_sort: {
            bucket_sort: {
                sort: [{ 'approved_invoices>_count': { order: 'asc' } }],
            },
          },
票数 1
EN

Stack Overflow用户

发布于 2021-09-07 09:12:21

以防有人再来讨论这个问题。使用Elasticsearch 7.10版本尝试的最新更新可以这样工作:

代码语言:javascript
复制
      sales_bucket_sort: {
        bucket_sort: {
            sort: [{ '_count': { order: 'asc' } }],
        },
      }

如果只指定了_count,它将自动获取doc_count并进行相应的排序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51952843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档