【问题标题】:Bucket sort in composite aggregation?复合聚合中的桶排序?
【发布时间】:2021-02-11 21:05:18
【问题描述】:

如何在复合聚合中进行桶排序?

我需要使用桶排序进行复合聚合。

我尝试过使用聚合进行排序。 我试过复合聚合。

【问题讨论】:

    标签: elasticsearch elastic-stack dsl querydsl elk


    【解决方案1】:

    我认为这个问题是您之前的@​​987654321@ 的延续,因此考虑相同的用例

    您需要使用Bucket sort aggregation,它是一个父管道 对其父多桶的桶进行排序的聚合 聚合。请参阅composite aggregation 上的此文档以了解更多信息。

    添加一个包含索引数据、映射、搜索查询和搜索结果的工作示例

    索引映射:

    {
      "mappings":{
        "properties":{
          "user":{
            "type":"keyword"
          },
          "date":{
            "type":"date"
          }
        }
      }
    }
    

    索引数据:

    {
      "date": "2015-01-01",
      "user": "user1"
    }
    {
      "date": "2014-01-01",
      "user": "user2"
    }
    {
      "date": "2015-01-11",
      "user": "user3"
    }
    

    搜索查询:

    可以设置size parameter来定义复合桶的数量 应该退回。每个复合桶被视为一个单一的 存储桶,因此将大小设置为 10 将返回前 10 个组合 从值源创建的存储桶。响应包含 包含值的数组中每个复合存储桶的值 从每个价值源中提取。默认为 10。

    {
      "size": 0,
      "aggs": {
        "my_buckets": {
          "composite": {
           "size": 3,               <-- note this
            "sources": [
              {
                "product": {
                  "terms": {
                    "field": "user"
                  }
                }
              }
            ]
          },
          "aggs": {
            "mySort": {
              "bucket_sort": {
                "sort": [
                  {
                    "sort_user": {
                      "order": "desc"
                    }
                  }
                ]
              }
            },
            "sort_user": {
              "min": {
                "field": "date"
              }
            }
          }
        }
      }
    }
    

    搜索结果:

    "aggregations": {
        "my_buckets": {
          "after_key": {
            "product": "user3"
          },
          "buckets": [
            {
              "key": {
                "product": "user3"
              },
              "doc_count": 1,
              "sort_user": {
                "value": 1.4209344E12,
                "value_as_string": "2015-01-11T00:00:00.000Z"
              }
            },
            {
              "key": {
                "product": "user1"
              },
              "doc_count": 1,
              "sort_user": {
                "value": 1.4200704E12,
                "value_as_string": "2015-01-01T00:00:00.000Z"
              }
            },
            {
              "key": {
                "product": "user2"
              },
              "doc_count": 1,
              "sort_user": {
                "value": 1.3885344E12,
                "value_as_string": "2014-01-01T00:00:00.000Z"
              }
            }
          ]
        }
    

    【讨论】:

    • 那么...如果我的用户数超过大小值(默认大小值在 10 对)怎么办?我需要对整个聚合进行排序!!!
    • @Sanker 你可以添加size 参数。请仔细阅读我更新的问题部分。
    • 我知道size参数。没关系。所以我需要的是:聚合 Elasticsearch 中的所有数据并按最大 @timestamp 的数据对它们进行排序。在这个阶段,基本上我需要将 ES 中的整个数据进行聚合和排序,这样我就可以从聚合中获取最新的 1000 个桶和下一个 1000 个等等......
    • 你有什么解决办法吗??
    • @Sanker 作为一个简单的解决方法,如果您需要 1000 个存储桶,您可以将 size 参数设置为该值。如果您的用例与此不同,我建议您针对此修改后的用例提出单独的问题(以便社区可以帮助您)。在同一个问题中混合不同的用例变得很难回答。而且,如果我的回答对您有所帮助,那么如果您可以投票并接受它,那就太好了 TIA :)
    猜你喜欢
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 2021-01-30
    • 2021-06-06
    • 1970-01-01
    • 2016-09-08
    • 2021-09-19
    • 1970-01-01
    相关资源
    最近更新 更多