问题描述
如何在索引中搜索两条不同的消息文本,然后只过滤掉同一秒内发生的两条消息?
例如消息:“第一条消息”和消息:“第二条消息” (仅显示包含第一条消息的索引条目,然后是包含第二条消息的条目,如果日志条目发生在彼此之间 1 秒内)。
可接受的输出:
2020-12-18T20:26:58.089Z [INF]:第一条消息
2020-12-18T20:26:58.184Z [错误]:第二条消息
不可接受的输出:
(索引条目 1 和索引条目 2 之间的时间超过 1 秒)
2020-12-18T20:26:58.089Z [INF]:第一条消息
2020-12-18T20:26:59.184Z [错误]:第二条消息
(错误的事件顺序)
2020-12-18T20:26:58.184Z [错误]:第二条消息
2020-12-18T20:26:59.089Z [INF]:第一条消息
如果查询会生成一个结果集,该结果集包含在 1 秒内发生的所有匹配事件对?
解决方法
Elasticsearch 不是关系型数据库,它首先是一个搜索引擎,其次才是一个文档存储。您要求执行的操作类似于 SQL 中的自联接。
没有简单的方法可以做到这一点,但我相信您可以通过首先使用 1 秒间隔在整个索引上运行直方图聚合来实现您想要的结果,这将为您提供具有相同“1-第二个“时间范围,并遍历组,为每个组运行单独的查询并扫描您的 2 个文档的结果。这可以在 Java 中相当容易地完成,但我认为您无法仅通过 ES 查询轻松完成。