如何解决EPL Every Limit Subexpression Lifetime
SELECT * FROM PATTERN [
every(
e1=Event(device_ip IN ( '10.10.10.1' ) AND category IS NOT NULL ))where timer:within(1800 Sec)
->
e2=Event(device_ip IN ( '10.10.10.1' ) AND event_cat_name.toLowerCase() IN ('User') AND log_session_id = e1.log_session_id)
->
e3=Event(device_ip IN ( '10.10.10.1' ) AND result.toLowerCase() IN ('Block') AND log_session_id = e1.log_session_id )
->
e4=Event(device_ip IN ( '10.10.10.1' ) AND category IS NOT NULL AND log_session_id != e1.log_session_id)
->
e5=Event(device_ip IN ( '10.10.10.1' ) AND event_cat_name.toLowerCase() IN ('User') AND log_session_id = e4.log_session_id)
->
e6=Event(device_ip IN ( '10.10.10.1' ) AND result.toLowerCase() IN ('Block') AND log_session_id = e4.log_session_id )
->
e7=Event(device_ip IN ( '10.10.10.1' ) AND category IS NOT NULL AND log_session_id != e4.log_session_id)
->
e8=Event(device_ip IN ( '10.10.10.1' ) AND event_cat_name.toLowerCase() IN ('User') AND log_session_id = e7.log_session_id)
->
e9=Event(device_ip IN ( '10.10.10.1' ) AND result.toLowerCase() IN ('Block') AND log_session_id = e7.log_session_id )
];
让我解释一下:
我们知道“every”模式将在找到内容后重置并创建另一个“Window”寻找相同的事件,在这种情况下,我们将每个模式应用于“e1”事件。
上面的代码是针对 9 个事件,它们被 3 个事件“分组”,如您所见,从“e1”到“e3”对应于 1 个唯一事件,从“e4”到“e6”对应另一个唯一事件,依此类推上,我们知道的每 3 个事件都是相同的唯一事件,因为只有这 3 个事件在“log_session_id”中具有相同的 ID,但我们知道从“e1”到“e3”的事件与从“e4”到“e6”不同“e7”到“e9”,因为每个唯一事件在“log_session_id”中都有不同的 ID。
所以当我们有以下事件序列时:e1、e2、e3、e4、e5、e6、e7、e8、e9
当检测到“e1”到“e3”时,模式每次重置并搜索“e1”的相同事件......直到现在一切正常,但是当“e4”事件到达时,因为“e1”和“e4”几乎是相同的条件,第一个窗口匹配并且也匹配每次重新启动时创建的新窗口。我们在 "e4" 不同条件中,但在 "e1" 位置还不知道它们,所以因为 e1 一开始不知道 e4 存在,所以在新窗口中匹配并且直到现在打开了 2 个窗口: 第一个有 2 个独特的事件(e1 到 e6) 第二个有 1 个唯一窗口(e4 到 e6)。
当 "e7" 到 "e9" 到达时,会生成另一个窗口,到目前为止我们总共有 3 个窗口: 第一个有 3 个独特的事件(e1 到 e9), 第二个有 2 个独特的事件(e4 到 e9) 第三个有 1 个唯一事件(e7 到 e9)。
那么,您知道如何使用 every 限制到第一个 Window 吗?我们已经尝试过 AND NOT 但我们无法做到。
解决方法
您可以通过对相同表达式过滤器使用 insert-into 使该模式更小且更易读:
// use this for all the same-expression filters
insert into FilteredStream select Event(device_ip IN ( '10.10.10.1' ));
select * from pattern [every(
e1=FilteredStream(category IS NOT NULL )) where timer:within(1800 Sec)
....)];
对于去除重叠匹配,有多种选择,例如:
- 让重叠匹配发生并在输出事件上使用子查询来查看它是否重叠
- 改用匹配识别,它会自动跳过过去的最后一场比赛
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。