elasticsearch - 搜索相隔不到 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 与任何其他事件都不“相关”,因此它不在结果中
解决方案
对于初学者,您可以利用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。
推荐阅读
- python - 有没有办法在 __init__ 中分配变量而不让它们立即运行?
- python - 如何使用 Blob 检测来隔离图像中的区域
- python - 熊猫数据框解决问题?
- google-apps-script - Apps 脚本,当 2 个值匹配时触发动作的难度
- node.js - 在 express 出现错误时自动运行 ejs-lint
- php - 添加带左尖括号的字符串会破坏我的数组
- java - java中的Timeline和Thread有什么区别
- angular - 检测到循环依赖,我看不到
- shell - Shell:在循环中的每个 curl 请求后重写日志输出
- android - Flutter:同时使用 Pan 和 Scale 手势?