【问题标题】:How do I sort buckets by Term Aggregation's nested doc_count?如何按术语聚合的嵌套 doc_count 对存储桶进行排序?
【发布时间】:2019-01-27 21:18:27
【问题描述】:

我有一个索引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 aggregation. Order by nested bucket doc_count

谢谢!

【问题讨论】:

    标签: elasticsearch elasticsearch-aggregation


    【解决方案1】:

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

            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' } }],
                },
              },
    

    【讨论】:

      【解决方案2】:

      以防万一有人再次遇到此问题。使用 Elasticsearch 7.10 版尝试的最新更新可以以这种方式工作:

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

      仅指定_count,它将自动采用doc_count 并进行相应的排序。

      【讨论】:

        猜你喜欢
        • 2023-01-10
        • 2015-12-30
        • 1970-01-01
        • 1970-01-01
        • 2016-03-15
        • 2016-09-08
        • 2015-07-31
        • 2019-09-15
        • 1970-01-01
        相关资源
        最近更新 更多