根据字段值匹配、序列和有限时间范围生成 Elasticsearch 查询输出

问题描述

如何在索引中搜索两条不同的消息文本,然后只过滤掉同一秒内发生的两条消息?

例如消息:“第一条消息”和消息:“第二条消息” (仅显示包含第一条消息的索引条目,然后是包含第二条消息的条目,如果日志条目发生在彼此之间 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 查询轻松完成。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...