首页 > 解决方案 > 搜索相隔不到 X 分钟的 2 个 ES 条目

问题描述

我有一个带有事件(日志)的 ES 索引,我想搜索在接下来的 5 分钟内有 1 个 A 类型事件后跟 1 个 B 类型事件的事件。我对 ES 很陌生,所以我确定实现这一目标的最佳方法是什么,我认为聚合可能是一个好方法,但我认为没有任何适合这种需求的方法。

示例
我有以下事件

{ id: 1, timestamp: "2019-11-08 10:00", type: "A" },
{ id: 2, timestamp: "2019-11-08 10:01", type: "B" },
{ id: 3, timestamp: "2019-11-08 10:07", type: "A" },
{ id: 4, timestamp: "2019-11-08 10:10", type: "B" },
{ id: 5, timestamp: "2019-11-08 10:20", type: "B" }

我想找到一种输出“相关”事件的方法,例如(这里的输出格式不是导入,如果需要我可以调整,只有“相关”信息很重要)

{ "id" : [1, 2] },
{ "id" : [3, 4] }

因为事件 1 和 2 发生在彼此相隔 5 分钟之内,而事件 3 和 4 也发生了。事件 5 与任何其他事件都不“相关”,因此它不在结果中

标签: elasticsearch

解决方案


对于初学者,您可以利用date_histogram聚合

首先,索引一些文档:

POST test/_doc/_bulk
{"index":{"_id": "1"}}
{ "id": 1, "timestamp": "2019-11-08T10:00:00", "type": "A" }
{"index":{"_id": "2"}}
{ "id": 2, "timestamp": "2019-11-08T10:01:00", "type": "B" }
{"index":{"_id": "3"}}
{ "id": 3, "timestamp": "2019-11-08T10:07:00", "type": "A" }
{"index":{"_id": "4"}}
{ "id": 4, "timestamp": "2019-11-08T10:09:00", "type": "B" }
{"index":{"_id": "5"}}
{ "id": 5, "timestamp": "2019-11-08T10:20:00", "type": "B" }

然后运行一个以 5 分钟为间隔聚合文档的查询:

POST test/_search
{
  "size": 0,
  "aggs": {
    "history": {
      "date_histogram": {
        "field": "timestamp",
        "interval": "5m",
        "min_doc_count": 1
      },
      "aggs": {
        "hits": {
          "top_hits": {
            "_source": false
          }
        }
      }
    }
  }
}

你会看到你期望的结果。在第一个存储桶中,您将看到文档 1 和 2,在第二个存储桶中看到文档 3 和 4,在第三个存储桶中看到文档 5。


推荐阅读