文档介绍:厦门大学计算机科学系 2021版
林子雨 博士/副教授
厦门大学计算机科学与技术系
E-m()
// 要么匹配2、3或4次, 要么不匹配
(2, 4).optional()
(3)greedy方法:将该模式标记为贪婪的,即该模式在完成指定次数匹配的情况下尽可能多地匹配。
// 匹配2到4次,并且希望尽可能多地匹配
(2, 4).greedy()
个体模式
(4)oneOrMore方法:希望匹配一次或多次。
// 匹配1次或多次
()
// 要么匹配1次或多次,要么不匹配
().optional()
(5)timesOrMore方法:指定匹配次数为若干次或以上。
// 匹配2次或更多次
(2)
// 匹配0次或2次或更多次
(2).optional()
个体模式
2. 条件
对于每一个个体模式,都可以设置一些条件来控制该模式是否要开始接收事件或停止接收事件。只有当事件的属性满足预设的条件才可以被模式接收。Pattern API为可以为个体模式定义5种不同类型的条件,分别是迭代条件、简单条件、复合条件、停止条件和邻近条件。
个体模式
(1)迭代条件
迭代条件能够根据之前已接收事件的属性或这些事件的子集属性的统计信息,来判断是否要继续接收后续的事件。下面的代码演示了迭代条件的使用。首先通过subtype方法将事件转换为SubEvent,,并计算出这些事件的总价格。如果下一个事件的名称以foo开头,,则该模式middle将接收这一事件。要注意的是,,因此它的开销可能很大。Flink官方建议我们尽量减少该方法的使用,以免对系统的性能造成影响。
()
.subtype(classOf[SubEvent])
.where(
(value, ctx) => {
lazy val sum = ("middle").map().sum
("foo") && sum + <
}
)
个体模式
(2)简单条件
该类型的条件继承自IterativeCondition类,它根据事件本身的属性来判断是否要接收该事件。以下代码规定了只有名称以foo开头的事件才会被模式start接收。
(event => ("foo"))
(3)复合条件
复合条件即多个条件的组合,多个顺序排序的where方法代表逻辑与,使用or方法连接条件代表逻辑或。。
(event => ("foo"))
.or(event => < )
个体模式
(4)停止条件
对于循环模式,可以指定停止条件让其在满足条件时停止接收事件。FlinkCEP提供了until方法来规定停止条件,需要注意的是,until方法必须与oneOrMore方法一起使用。如下代码用until方法指定停止条件为遇到事件名称为end的事件时,停止接收事件。
().until(event => () == “end”)
个体模式
(5)邻近条件
一个循环模式一次可以接收一个或多个事件,邻近条件规定了每个事件之间的相邻关系。在FlinkCEP中可以对循环模式规定3种不同的邻近条件,分别是严格邻近、宽松邻近和非确定宽松邻近。严格近邻规定,所有匹配的事件应该是严格地一个接一个地出现,中间不能有任何不匹配的事件;而宽松邻近允许匹配的事件之间出现不匹配的事件;非确定宽松邻近则进一步放开了条件,允许在匹配过程中忽