00:00
现在已经知道pattern API整体怎么样使用了,那接下来呢,我们就要给大家引入一些具体的概念,让大家看一看里边每一步操作,每一步定义,到底还有哪些更加复杂的用法。呃,那这里边提出一个概念,首先就是拍的API里边的模式其实可以分类的,首先最基本的概念叫做个体模式individual patterns,所谓的个体模式指的是什么呢?就是我们在这个pattern里边,大家其实也发现了,不是我们有步骤吗?前面begin什么,然后next什么,Follow by什么,对吧?这相当于是先后发生的一步一步操作啊,所以大家会发现构成这个很复杂的规则啊,这个pattern可能是由这个一步一步操作组成的,就是组成这个复杂规则的每一步操作,一个单独的这个模式定义都叫做一个个体模式。所以所谓的个体模式其实就是我们前面这里边的每一行对吧?啊,这个模个体模式主要就包含了前面这里边,可能相当于大家可以理解成有一个连接词对吧?前后有一个连接词,然后呢,有一个名称,后面是不是还有它的筛选条件啊,哎,这就是这个所谓个体模式的一个概念,然后接下来呢,还有就是组合模式,所谓组合模式,顾名思义当然就是很多个个体模式用连接词连接在一起组合起来,这就变成了一个组合模式对吧?哎,所以有时候这个组合模式也叫做模式序列。
01:28
因为大家看到就相当于是先后发生的一堆个体模式嘛,所以大家就想到这就是序列嘛,一个一个发生,对吧,先做什么后做什么啊,去做一个条件判断,那么大家要注意的一点是,组合模式有限制,它必须以一个所谓的初始模式开始,也就是说一开始你定义这样一个组合模式的时候,必须是pattern.begin对吧,必须是用这种方式。也就是说,我们第一个个体模式必须是这个begin开头的一个一个模式。然后另外还有一个比较特殊的概念,叫做模式组,模式组的概念呢,稍微的特殊一点就是相当于可以把一个模式序列,组合模式作为一个条件嵌套在当前的一个个体模式里面啊,这就之前大家看到那个VR里边除了simple condition之外,还有这个迭代条件对吧?呃,Terribleable这个condition啊,那个的话,如果你要放的话,就可以放这个所谓的组合模式,当然这个一般就很复杂了啊,我们一般用不到,所以大家只要理解这个个体模式和组合模式也就够了。
02:30
那接下来我们具体看一看,什么叫个体模式呢?呃,就个体模式我们已经说了,就是,呃,相当于就是定义每一步模式序列里边的每一步操作,对吧,每一个单独的模式,那么大家要注意个体模式里边呢,还能够划分,它能够划分所谓的单立模式和循环模式啊,这个单立模式确实是它的英文就叫single啊,但是大家要注意一下,这跟我们设计模式里边的那个单例不是一回事,它指的是什么呢?非常简单,指的就是当前的个体模式筛选数据,它筛选事件啊,匹配出来的就是单个的一个事件。
03:07
哎,大家就想到了,那是不是就相当于我可以检测到多个事件啊,就是一个个体模式就有可能检测到多个事件,对不对?那什么样的个体模式能检测到多个事件呢?哎,就是所谓的循环模式。诶,就是单例模式只能接收一个事件,循环模式可以接收多个,其实前面大家看到我给的这个例子,这里边其实就涉及到了这个循环模式的定义了。大家看这个start后面给了一个什么times times大家知道就是次数的意思吗?所以TIMES3表示什么含义,是不是就是当前的这个事件,我检测的时候要循环三次去检测啊,哎,所以大家想这不就是我这个事件要发生三次吗?啊,所以检测到是不是就是三个事件啊,符合后面这个VR条件提取出来的三个连续的事件啊,这就是这个循环模式啊,所以这里面接下来给大家讲一讲个体模式里边的一些要点,首先就是量词。
04:05
就是在个体模式里边呢,可以在后边追加一个量词,这个量词其实就代表了循环的次数,大家看一下这个量词长什么样,就直接最简单的量词就是times times里边给一个整数TIMES4,这就表示当前的这个个体模式对应的那个事件是要匹配循环出现四次对吧?啊,发生四次,那那家看后面还可以加其他的操作,比方说我,我再加一个optional optional的意思是。是可选对吧,啊就是可有可无,那所以如果要是TIMES4,然后optional啥意思呢,就是哎出现。匹配的话要匹配四次,那你这个四次是不是不匹配也行啊,Optional嘛,可选,所以呢,它的这个匹配是零次或者四次,对吧?啊,这个比较特殊一点,然后另外还可以怎么样呢?还可以定一个,就是times里边可以给两个参数定义一个次数的循环的范围,比方说二次,那表示的就是匹配234222到四次,对吧,就是这样的一个范围啊,那同样还可以加一个,加一个限定,叫做greedy greedy大家知道是。
05:16
贪心贪婪的那个那个意思,所以如果要是ged的话,意思就是说当前我是不是要尽可能多的匹配啊,对吧,就是选取当前尽可能多的那种匹配的方式,所以如果要是start,然后TIMES24GED,这表示什么意思呢?就是当前我可以匹配234次,然后我是尽可能多的匹配对吧,就是能匹配多就尽量多,哎,那另外还有一个特殊的用法是叫one or more和times or more,这个含义,那其实跟这个限定范围的也差不多,对吧?呃,就这里边的one or more,就是一次或多次上限不限,然后另外还有time or more,那就是这里边给一个二的话,那就是两次或多次上限不限。
06:00
甚至我还可以后面再追加,就是两次或多次,然后optional greedy,这啥意思呢?这就是我可以要匹配的话,匹配两次或多次,另外呢,诶,你要不匹配零次也可以对吧,然后如果能匹配到的话,我尽可能多的重复匹配啊,所以这就是非常灵活啊,大家在使用的过程当中就可以定义各种各样不不同的量词,去指定当前的这个循环规则。大家总结一下的话,这个有点像什么呀。这是不是很像正则的那个表达啊,对吧,就像我们那个比方说像星星儿号对吧?呃,像这个点儿号对吧?啊像问号啊,就是一次或多次,或者说这个多次,或者说匹配这个零次或一次啊,就是所有的这些跟这个正则的表达其实非常非常像的,所以确实所谓的CCP啊,它的底层其实是什么呢?就是一个NFA。这样的一个架构,就是所谓的。
07:02
呃,就是呃,有有限就非确定性有限状态状态机对吧,就是相当于是一个状态机的一个定义啊,这个底层架构就跟这个正则的底层是一样的,正则底层也是这样的一个状态机的架构啊,大家可以稍微做一点了解啊啊那这是个体模式的量词,另外个体模式呢,还有一个非常重要的组成部分就是。条件大家看前面我们指定一个个体模式的时候,除了前面那个名称,还有那个连接词之外,连接词大家可以理解成呢,是构成组合模式的时候才用到对吧?哎,那个体模式的话,最重要的其实就是它的名称,另外我们讲了一个量词,量词是可选可可以有可以没有对吧,没有的话就是就是个体模式嘛,就是一个嘛,那那然后得到的。就是我们要提取这个事件,是不是必须得有一个满足的条件才行啊,所以后边这个它的条件其实必不可少的,所以这里边我们看每一个模式都需要指定触发的条件,这就是作为当前这个模式是否接受当前数事件啊,进入我们当前的这个啊匹配的这个缓存里边的一个重要依据,你如果符合条件,我才把你接收进来,然后开始等后边的这个匹配,那么所以这个CP里边的个体模式呢,主要通过什么方法来指定条件呢?啊,一般能调的方法就是这么几个。
08:25
Where,这是最常见的对吧?然后还有就是or,还有这个until,那这些方法主要又分成哪几类呢?大家看这个分成以下几类啊,最简单的就是所谓的simple condition简单条件啊,这个顾名思义就是我们调的时候直接是不是传了一个simple condition啊,哎,那么这里边直接就调的就是点where方法对吧?点where就相当于里边我定义了一个条件过滤器对吧?必须要实现这个simple condition接口里边的一个filter方法,它和我们filter的那个操作完全一样。你返回一个布尔类型的值,如果为真的话,就把它选取出来,如果为假的话就不要,对吧,直接滤掉啊,所以这个非常简单,比方说我这里边写了一个呃,value.get name,然后start with,负,那就相当于是要求这个value的name必须以这个foo for开头,对吧?哎,这个非常简单的一种提取,像我们之前是要求它的那个登录状态必须等于film,对吧?啊,这个过程还是非常简单的。
09:27
那么大家就想到了,那如果说我现在的这个条件不止一个呢,我如果要好多个条件怎么办呢?哎,当然如果说你是这个逻辑条件的一个组合的话,与或非,那大家想我也可以在里边直接来一个逻辑与或非的一个判断,对吧?来做一个条件组合,那另外呢,你在里边写的话,这个代码可读性比较差嘛,那大家想多个条件,我也可以在外边直接给它做组合,怎么组合呢?诶大家看合并的时候直接用点二就可以表示一个逻辑上的相连的关系,对吧,逻辑或相连。
10:03
就是点where一个条件,然后点二又一个条件,这两个条件是不是只要发生一个,我就把当前这个这个事件提取出来啊,所以这个是非常理解的,那大家可能想到,那如果要是语的话,怎么语呢?是点and吗?大家看到没有点and对吧?那如果要是想语的条件的话,你就是where.where对吧?继续往后where就可以了啊,连接不同的多个where。那除了这个组合条件之外,还有一个比较特殊的条件,叫做终止条件stop condition,这个终止条件指的是什么呢?就是后边直接调until until,大家知道,顾名思义就是到什么什么为止对吧?啊,到什么状态为止?那大家想这个在什么情况下建议大家一定要用一个终止条件呢?哎,就是前面我们讲的one or more,或者是one or more optional,当然还有这个times or more对吧?Times or more optional,大家想在这种条件下,它是不是可以有多个,然后诶,那这里面就涉及到一个问题,就是我如果检测到一个匹配的事件的话,我现在直接这个这个当前这个匹配就结束了吗?我这个复杂事件就都提取完了吗?
11:13
没完对不对,没完的话,是不是我接下来要继续等啊,大家想这个等待的过程其实就是把之前的事件,我应该只要符合我前面的条件,我是不是就应该缓存起来啊,缓存在哪里,是不是就是之前我们看到那个map数据结构啊,对吧?那map数据结构不是就是来一个事件有一个T对应一个value吗?那我对应的有一个检测到一步操作,有一个事件发生了,那我就把它对应的那个K写进去,Value保存进去嘛,那这个过程接下来我要等后面的事件继续发生,大家想我等多久呢?如果你是one or more times or more的话,是不是我永远不知道等到什么时候结束啊,因为你后边这个永远可能有更多的时间匹配对吧?所以大家会发现在这种情况下,我是不是应该要尽量的不让这个,如果你要连续不断等下去,相当于我的这个缓存状态就永远释放不掉,对吧?那这个对内存压力就会越来越大,所以说我要释放内存的话,建议大家一定要有一个终止条件,Until对吧,方便清理状态,那另外还有一个比较特殊的条件叫做迭代条件,这就是前面大家看到的一般化的这个。
12:25
呃呃,Condition,那么这个condition其实是where条件里边一般化的一个接口啊,实现的这个接口simple condition其实也是继承自这个的,也是ative condition,那么它里边就比较特殊一点,它能调到什么东西呢?里边有上下文。所以它可以调一个CX的一个方法叫get events for pattern,然后传一个pattern的那个name进来,那大家想这个Python name,这应该是什么name呀,是不是就是之前我们定义好的。
13:00
呃,模式序列里边的前面发生的每一个事件的那个名称啊,所以大家看它就相当于可以对之前我们已经接收到的事件进行一个处理,所以就我这里边where不是条件判断吗?之前我们那个filter大家看是不是只能拿到当前的这个事件啊。而现在我是不是里边就相当于可以接收到之前的事件了,对吧,上下文里边就有之前事件的缓存嘛,啊,这个能做的事情可以就更复杂一点,更多一点,对吧?啊,这个就是大家可以在有些特殊场景下啊,应用到这样一个迭代条件。呃,那然后接下来呢,知道了这个个体模式,我们就要来说一下模式序列了。大家发现不同的个体模式,我们可以先后用这样的一个类似于连接词的东西,把它连在一起,就构成了一个模式序列。我们最终定义的那个pattern,其实主要就是模式序列。那这里面就涉及到你到底用什么样的连接词来做连接呢?
14:00
哎,这里边要给大家讲一下不同的所谓的近邻模式,大家看到上下两个流我们定义了不同的提取这个复杂事件的规则,上面这个流里边我们定义的规则是什么呢?是圆圈后边紧跟着正方形,大家看,注意我的定义是紧跟着。所以这里边如果要是后边这个啊,圆圈后边跟着正方形这个能匹配出来吗。这个是不是匹配不出来啊,紧跟着的意思是不是就必须是下一个必须就是正方形,不能是别的对吧,你这里边圆圈下一个已经变成这个五边形了,那当然就不符合我们的定义了啊,所以这就是我们之前给大家讲的那个next对吧?啊,这就是所谓的大家可以看到所谓的严格禁令模式,就是紧接着下一个必须是什么。那与之对应的另外一种定义方式,其实就是比方说下边我们这个定义啊,五角星后边可以跟着一个,就是接下来会跟着一个正方形,那至于说是不是紧跟着,我不做要求,只要后边它跟上有这个正方形就可以,那大家看中间是不是可以隔几个啊,对吧?比方说我下一个是这个,呃,菱形,然后下一个三角形,下一个圆形,然后接下来来了正方形,我这是不是也可以认为这是一个匹配。
15:24
不管中间隔几个对吧,你下一个立刻就是正方形也行,中间隔两个隔三隔三个都行,都能检测到,这就是前面我们看到的那个followed by,对,所以这种净灵模式,我们管它叫做宽松净灵啊,所以接下来我们看一下。具体的这个代码里边API调用的时候啊,严格近零啊,那它的要求就是按照顺序依次出现,严格的按照这个顺序一个一个出现啊中间没有任何不匹配的事件,由这个NEX来制定,那所以大家看一下这个规则啊,如果是我定义了一个前面一个事件啊,Begin一个事件对吧?A,然后后面是点next,后面定义一个B的话,大家看这个ACB1B2B1B2就表示符合B要求的两个事件对吧?啊先后的两个事件,那这个里边能够匹配出来吗?
16:15
A后面紧跟着B能能匹配出来吗?已经有C了,那肯定就匹配不到对吧?所以这个是没有匹配的,那如果说是宽松精灵,宽松精灵的话,中间就可以出现不匹配的事件,我们定义的时候followed by,对吧?所以如果还是这个ACB1B2,我们如果是a followed by b的话,就可以直接有一个匹配,那就是ABBE1对吧,这个匹配出来就可以了,大家注意这个follow by,这也是匹配出来之后,相当于是不是我们当前这个匹配到的这个事件就都匹配到一次了,然后就相当于已经输出了,然后这个数据就已经不再做缓存了,对吧?啊,所以接下来这个B2它就没有匹配了,那有同学可能想,那假如说我要让这个B2跟前面的A也做一个匹配,行不行呢?哎,这是另外一种特殊的定义方式,这个叫做非确定性宽松定理,调用的时候呢,叫做followed by any,它指的就是进一步放松这个匹配条件,之前已经匹配。
17:15
配过的事件,我接下来再匹配的时候还可以拿出来用,诶,所以大家看就是A已经匹配过一次了,现在呢,还能继续匹配,所以如果是a followed by any b的话,ACBB2就有两个匹配输出,大家看啊,哎,所以就输出的是AB1AB2对吧。啊,这就是不同的这个近邻模式,大家可以看到创建出来的这个魔术模式序列啊,先后发生的这个顺序就是不一样的。那另外除了上面我们讲过的这个模式序列之外,我们还可以有单独的比较特殊的定义,这种定义呢,是加了一个否定性的限制词not,它表示的是。不希望出现某种关系,对吧,Not嘛,所以这里边非常简单,就是not next not next什么意思。
18:05
是不是是前一个事件后边不要紧跟着发生什么呀?诶这个非常简单啊,那另外还有一个是not followed by not followed by,大家知道字面上理解的话,这应该是前一个事件,后边不要跟着发生什么事件,对吧?但是大家注意,我们实际使用的时候,不是直接这么用的,不是说比方说a not followed by b,然后然后就完了,那家想a not followed by b,你这个定义的话,意思就是说我我我怎么样要匹配到这个当前这个patternon呢?那就是我检测到一个A对吧?诶,那当前A出现了,然后后边是不能出现b not followed by b对吧。那你说我接下来的数据,比方说如果出现了B了,那我知道是不是当前就肯定不符合这个我当前的这个模式啊,对吧,那肯定我就知道不符合啊,我这个就没有输出,那大家想什么时候我叫符合呢?
19:00
哎,大家想啊,那我现在检测到的都符合对吧,只要不是B,这个CDE都符合,但是你是not followed by啊,并不是说紧跟着这个就就满足条件了,那假如说我我前面来了C,来了D,来了E,后边又来了B呢,那是不是相当于现在又不符合了呀,那所以说你当前我到底是等到什么时候我才能知道这个B,它真的就永远不会来,然后表示它这个呃,后面就没有B出现呢?这永远等下去,我们是流失数据,永远等下去,永远都不会玩,对吧?哎,所以大家要注意啊,Not follow by不是这么用的,它一般是用在什么场景呢?它是用来表示某个事件,不让这个事件在两个事件之间发生,啥意思呢?就是说前面我们定义一个A。比方说,然后后边not followed by。我这个就简写了啊,这个followed by对吧。然后not followed by一个B,然后接下来再去来一个比方说followed by。
20:03
C。那大家想这个意思是啥?这是不是就是A后边我检测是想要跟着C对吧,然后中间呢,A和C中间是不是还不能出现B啊,如果这样定义的话,这个就没毛病了,对不对?我们检测的时候是不是就是这个标准是A后面要有一个C出现,而且中间没有B,这种情况才是我们对应的一个匹配啊。哎,所以大家看到它一般是定义是这这么用的啊,所以not follow by表示的是B不在A和C之间发生啊,往往是这么去用,然后这里边给大家注意几个要点啊,这里边我们要注意几个,呃,就是相当于是模式序列在定义的过程当中的一个规则吧,首先就是前面提到过的模式序列必须以别给你开头啊,这个是必须这么去做啊,没别的,没别的方式,另外还有就是。最后结束的时候不能以not follow by结束,大家前面也看到了,对吧,我们必须是让它表示两个事件之间不发生什么事件,你不能最后结束的时候来一个not follow by,诶,那另外就是note类型的模式不能被optional所修饰。
21:16
大家看前面这个not next not follow by,它都表示不让什么什么事事件发生,对吧,不符合某种条件,那大家想如果是not next,然后后面再来一个option是什么效果,就是我不让这个事件紧邻前一个事件发生,然后又又可选可选就是可有可无对吧?那你说我,我就错乱了,我到底是你,你让它发声还是不发声呢?那没意义了,对吧?啊,所以这里边不不能被optional所修饰。另外还有就是一个特殊的限制条件,前面我们也已经用过了。就是所谓的时间约束对吧?哎,时间约束指的就是有一个within的这个方法,在指定我们当前模式序列的时候,跟上一个微信,就表示当前我们检测这一组事件的时候,要求它必须在多长时间范围内生效,而且这个微信它的这个时间是跟我们当前的时间语义有关的,如果我们是事件时间的话,大家发现它是不是就相当于也是以watermark那个为准啊,也能够我们设置了watermark延迟之后,是不是它也能处理乱序数据啊?诶,所以这个其实就非常好用啊,我们在很多场景下,特定的跟时间相关的那些需求都是要有一个within的时间限制。
22:33
这就是关于个体模式和模式序列怎么样去使用它里边一些概念的划分。
我来说两句