当前位置: 首页 > 知识库问答 >
问题:

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

孔安阳
2023-03-14

我有一个索引发票,我需要将其聚合到每年的桶中,然后进行排序。

我已经成功地使用Bucket Sort按简单的和值(收入和税收)对我的Bucket进行排序。然而,我很难按照嵌套更深入的doc\u计数值进行排序(状态)。

我想不仅通过收入来排序我的桶,而且还通过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
                }
            },
          ]
        }
      }

例如,我想按键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

谢啦!


共有2个答案

茹高义
2023-03-14

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

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

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

单于翰飞
2023-03-14

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

        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' } }],
            },
          },
 类似资料:
  • 数据 我在ES索引中保留了对象。其中每个字段都有一个myKey和myName字符串字段(持久化为关键字字段)。不能保证同一个myKey的myName总是相同的。E、 g.以下两个条目共享相同的myKey,但具有不同的myName值: 挑战 我需要选择并返回所有不同的myKey值,查找并显示最可能的myName(myKey上下文中出现的最多),并按myName对生成的Bucket进行排序。 到目前为

  • 我在elasticsearch中对嵌套字段使用复合聚合,但我想从结果中排除一些术语。 此聚合正在工作: 但是我想从stk2中排除一些术语, 上述查询不起作用。 更新1:结果应该只省略数组元素,而不是包含“cancel”的整个文档。 我使用的是弹性v6.7

  • 在这里,我得到了错误: “无效的术语聚合顺序路径[price>price>price.max]。术语桶只能在子聚合器路径上排序,该路径由路径中的零个或多个单桶聚合和路径末尾的最终单桶或度量聚合组成。子路径[price]指向非单桶聚合” 如果我按持续时间聚合排序,查询可以正常工作,如 那么,有什么方法可以通过嵌套字段上的嵌套聚合来排序聚合吗?

  • 问题内容: 我正在尝试过滤存储桶中的嵌套聚合。 对应: 索引数据: 我正在使用此查询和聚合定义 我从聚合结果中得到的是: 我在筛选存储桶列表时遇到了麻烦,因为它们只能提供所提供的事件ID,因此结果应类似于: 问题答案: 您快到了,只需要在聚合中添加过滤器即可,如下所示: 原因是您的查询将正确选择具有指定事件ID的嵌套事件的所有文档,但是,汇总将对所有选定文档中的所有嵌套事件进行处理。因此,您还需要

  • 问题内容: ES版本:1.5(Amazon Elasticsearch) 我的目标:在某个字段上具有重复数据删除功能的搜索结果。我目前正在对聚合进行一些研究,以解决重复数据删除问题。因此,我的结果是一个带有1个大小的存储桶的列表存储桶。但是,我找不到订购存储桶列表的方法。 当前查询: 结果: 我想看到第二个存储桶,其中max_score = 68.78424为第一个。这可能吗? 如果不建议使用聚合

  • 我正在使用Elasticsearch bucket聚合。我有一组文档,每个文档都有一个类别字段,它是一个数组。我需要获得每个类别的数量以及搜索结果。但目前,我得到了错误的doc\u计数。 这是我的聚合查询 } 下面是我得到的错误doc\u计数的结果。