问题导读
1.匹配跳过策略的作用是什么?
2.匹配跳过策略有哪四种?
3.匹配跳过策略代码如何实现?
上一篇
Flink难点:彻底明白CEP5,组模式以及组操作【api】
http://www.aboutyun.com/forum.php?mod=viewthread&tid=27311
1.匹配跳过策略介绍
所以为匹配跳过策略,是对多个成功匹配的模式进行筛选。也就是说如果多个匹配成功,可能我不需要这么多,按照匹配策略,过滤下就可以。
对于给定模式,可以将同一事件分配给多个匹配【成功】。 要控制分配事件的匹配数,需要指定名为AfterMatchSkipStrategy的跳过策略。
跳过策略有四种类型,如下所示:
- NO_SKIP: 每个可能的匹配都被触发。
- SKIP_PAST_LAST_EVENT: 丢弃匹配开始后但结束前每个部分匹配。
- SKIP_TO_FIRST: 丢弃在匹配开始后但在PatternName的第一个事件发生之前开始的每个部分匹配。
- SKIP_TO_LAST: 丢弃在匹配开始后但在PatternNam发生的最后一个事件之前开始的每个部分匹配。
注意,使用SKIP_TO_FIRST和SKIP_TO_LAST跳过策略时,还应指定有效的PatternName。
【注意,这里的匹配跳过策略,其实针对的是循环重复出现的事件,比如SKIP_TO_FIRST,SKIP_TO_NEXT等】
例如,对于给定模式b + c和数据流b1 b2 b3 c,这四种跳过策略之间的差异如下:
1.跳过策略:
NO_SKIP
结果:
b1 b2 b3 c
b2 b3 c
b3 c
描述:
找到匹配b1 b2 b3 c后,匹配过程不会丢弃任何结果。
2.跳过策略:
SKIP_TO_NEXT
结果:
b1 b2 b3 c
b2 b3 c
b3 c
描述:
找到匹配b1 b2 b3 c后,匹配过程不会丢弃任何结果,因为没有其他匹配可以从b1开始。
3.跳过策略:
SKIP_PAST_LAST_EVENT
结果:
b1 b2 b3 c
描述:
找到匹配b1 b2 b3 c后,匹配过程将丢弃所有已开始的部分匹配。
4.跳过策略:
SKIP_TO_FIRST
结果:
b1 b2 b3 c
b2 b3 c
b3 c
描述:
找到匹配b1 b2 b3 c后,匹配过程将尝试丢弃在b1之前开始的所有部分匹配,但是没有这样的匹配。 因此,不会丢弃任何东西。
5.跳过策略:
SKIP_TO_LAST
结果:
b1 b2 b3 c
b3 c
描述:
找到匹配b1 b2 b3 c后,匹配过程将尝试丢弃在b3之前开始的所有部分匹配。 有一个这样的匹配b2 b3 c
另外看另一个例子,以便更好地看到NO_SKIP和SKIP_TO_FIRST之间的区别:模式:(a | b | c)(b | c)c + .greedy d和序列:a b c1 c2 c3 d然后结果将是:
1.跳过策略:
NO_SKIP
结果:
a b c1 c2 c3 d
b c1 c2 c3 d
c1 c2 c3 d
描述:
找到匹配b c1 c2 c3 d后,匹配过程不会丢弃任何结果。
2.跳过策略:
SKIP_TO_FIRST
结果:
a b c1 c2 c3 d
c1 c2 c3 d
描述:
找到匹配b c1 c2 c3 d后,匹配过程将丢弃在c1之前开始的所有部分匹配。 有一个这样的匹配b c1 c2 c3 d。
为了更好地理解NO_SKIP和SKIP_TO_NEXT之间的区别,请看下面的例子:模式:a b +和序列:a b1 b2 b3然后结果将是:
1.跳过策略:
NO_SKIP
结果:
a b1
a b1 b2
a b1 b2 b3
描述:
找到匹配b1后,匹配过程不会丢弃任何结果。
2.跳过策略:
SKIP_TO_NEXT
结果:
a b1
描述:
找到匹配b1后,匹配过程将丢弃从a开始的所有部分匹配。 这意味着既不能生成b1 b2也不生成b1 b2 b3。
【这里我们看到SKIP_TO_NEXT,其实是对于重复的忽略而已】
要指定要使用的跳过策略,只需通过调用以下命令创建AfterMatchSkipStrategy:
2.匹配跳过策略编程
1.函数
AfterMatchSkipStrategy.noSkip()
描述
创建NO_SKIP跳过策略
2.函数
AfterMatchSkipStrategy.skipToNext()
描述
创建SKIP_TO_NEXT跳过策略
3.函数
AfterMatchSkipStrategy.skipPastLastEvent()
描述
创建SKIP_PAST_LAST_EVENT跳过策略
4.函数
AfterMatchSkipStrategy.skipToFirst(patternName)
描述
使用引用的模式名称patternName创建SKIP_TO_FIRST跳过策略
5.函数
AfterMatchSkipStrategy.skipToLast(patternName)
描述
使用引用的模式名称patternName创建SKIP_TO_LAST跳过策略
通过调用将跳过策略应用于模式:
[mw_shl_code=java,true]AfterMatchSkipStrategy skipStrategy = ...
Pattern.begin("patternName", skipStrategy);[/mw_shl_code]
[mw_shl_code=scala,true]val skipStrategy = ...
Pattern.begin("patternName", skipStrategy)[/mw_shl_code]
注意对于SKIP_TO_FIRST / LAST,当没有元素映射到指定变量时,如何处理大小写有两种选择。 默认情况下,在这种情况下将使用NO_SKIP策略。 另一种选择是在这种情况下抛出异常。 可以通过以下方式启用此选项:
[mw_shl_code=java,true]AfterMatchSkipStrategy.skipToFirst(patternName).throwExceptionOnMiss()
[/mw_shl_code]
[mw_shl_code=scala,true]AfterMatchSkipStrategy.skipToFirst(patternName).throwExceptionOnMiss()
[/mw_shl_code]
最新经典文章,欢迎关注公众号
加入About云知识星球,获取更多实用资料
|
|