【问题标题】:How can I count aggs group in Elasticsearch如何计算 Elasticsearch 中的 aggs 组
【发布时间】:2023-02-10 18:13:46
【问题描述】:

我正在 Elastic search 中编写一些查询来计算索引中的一些事件。我认为我的构造是正确的,但虽然我可以从聚合组中获得搜索结果,但实际上我想要的是计数,而不是结果。

我的背景是 SQL,我尝试执行的等效查询是:

SELECT
  COUNT(1) as volume
FROM (
      SELECT
      key
    , type
    , ROW_NUMBER() OVER( PARTITION BY key ORDER BY timestamp DESC ) AS instance
  FROM event
  ) A
WHERE type != 'Delete'
AND instance = 1

通俗点说就是:key统计最近一次事件的事件量,不包括删除

我试过以下弹性:

GET /index/_search
{
  "size": 0,
  "aggs": {
    "group_by_key": {
      "terms": {
        "field": "key",
        "size": 1000000
      },
      "aggs": {
        "top_record_per_group": {
          "top_hits": {
            "sort": [
              {
                "timestamp": {
                  "order": "desc"
                }
              }
            ],
            "size": 1
          }
        }
      }
    }
  },
  "query": {
    "bool": {
      "must_not": [
        {
          "term": {
            "type": "Delete"
          }
        }
      ]
    }
  }
}

...这确实返回了我所期望的。我知道计数 API 并且知道它不支持聚合。

任何人都可以帮助指出我遗漏的一点,并希望向我展示仅获取体积值的最有效方法(即没有其他结果)?

提前致谢

【问题讨论】:

  • 如果你得到一个计数,我认为你不需要按键排序最新事件的标准。

标签: elasticsearch


【解决方案1】:

如果您只需要计数,则可以使用值 count aggs。

我还会使用过滤器来改进缓存并提高查询性能。

GET /test/_search
{
  "size": 0,
  "query": {
    "bool": {
      "filter": [
        {
          "bool": {
            "must_not": [
              {
                "term": {
                  "type": "Delete"
                }
              }
            ]
          }
        }
      ]
    }
  },
  "aggs": {
    "count_volume": {
      "value_count": {
        "field": "key"
      }
    }
  }
}

【讨论】:

  • 我需要大小为 1 的热门点击,否则我的事件会被重复计算
猜你喜欢
  • 2018-12-17
  • 1970-01-01
  • 2015-01-26
  • 1970-01-01
  • 2016-03-27
  • 2020-12-03
  • 2014-10-13
  • 1970-01-01
  • 2018-07-30
相关资源
最近更新 更多