
# 事件检查函数
本文介绍事件检查函数的语法规则，包括参数解释、函数示例等。
#### 函数列表
| **类型** |                                                                  **函数**                                                                   |                   **说明**                    |
|---|---|---|
| 基本方法   | [e_has]         | 判断日志字段是否存在。                                 |
| 基本方法   | [e_not_has]      | 判断日志字段是否不存在。支持和其他函数组合使用。                    |
| 表达式函数  | [e_search]     | 提供一种简化，类似Lucene语法的事件搜索方式。支持和其他函数组合使用。       |
| 表达式函数  | [e_match]     | 判断当前日志字段的值是否满足正则表达式。支持和其他函数组合使用。            |
| 表达式函数  | [e_match_any]  | 判断当前日志字段的值是否满足正则表达式，任意字段匹配返回true，否则返回false。 |
| 表达式函数  | [e_match_all] | 判断当前日志字段的值是否满足正则表达式，所有字段匹配返回true，否则返回false。 |
   
同时，事件检查函数可以与如下表达式函数配合使用：
| **类型** |                                                                                                 **函数**                                                                                                  |       **说明**        |
|---|---|---|
| 基本判断   | [op_and](https://support.huaweicloud.com/usermanual-lts/lts_07_0158.html#lts_07_0158__zh-cn_topic_0000002058021002_zh-cn_topic_0000001891594196_zh-cn_topic_0000001674787385_section8515174401119)      | 逻辑and运算。            |
| 基本判断   | [op_or](https://support.huaweicloud.com/usermanual-lts/lts_07_0158.html#lts_07_0158__zh-cn_topic_0000002058021002_zh-cn_topic_0000001891594196_zh-cn_topic_0000001674787385_section1162414091512)       | 逻辑or运算。             |
| 基本判断   | [op_not](https://support.huaweicloud.com/usermanual-lts/lts_07_0158.html#lts_07_0158__zh-cn_topic_0000002058021002_zh-cn_topic_0000001891594196_zh-cn_topic_0000001674787385_section1263472171516)      | 逻辑not运算。            |
| 基本判断   | [op_nullif](https://support.huaweicloud.com/usermanual-lts/lts_07_0158.html#lts_07_0158__zh-cn_topic_0000002058021002_zh-cn_topic_0000001891594196_zh-cn_topic_0000001674787385_section241863601119)    | 判断两个表达式的取值。         |
| 基本判断   | [op_ifnull](https://support.huaweicloud.com/usermanual-lts/lts_07_0158.html#lts_07_0158__zh-cn_topic_0000002058021002_zh-cn_topic_0000001891594196_zh-cn_topic_0000001674787385_section1214212018114)   | 返回第一个值不为None的表达式的值。 |
| 基本判断   | [op_coalesce](https://support.huaweicloud.com/usermanual-lts/lts_07_0158.html#lts_07_0158__zh-cn_topic_0000002058021002_zh-cn_topic_0000001891594196_zh-cn_topic_0000001674787385_section7892152713110) | 返回第一个值不为None的表达式的值。 |
   
 #### e_has
判断字段是否存在。
- **函数格式**
  ```
  e_has("key")
  ```
  
- **参数说明**
  
  | **参数名称** | **参数类型** | **是否必填** | **说明**  |
  |---|---|---|---|
  | key      | String   | 是        | 日志的字段名。 |
     
  
- **返回结果**
  字段存在返回true，不存在返回false。
  
- **函数示例**
  判断日志是否存在content字段，存在则保留，不存在则丢弃。
  - 测试数据
    ```
    {
     "content": 123
    }
    ```
    
  
  - 加工规则
    ```
    e_keep(e_has("content"))
    ```
    
  
  - 加工结果
    ```
    content: 123
    ```
    
   
 
 #### e_not_has
判断字段是否不存在。
- **函数格式**
  ```
  e_not_has("key")
  ```
  
- **参数说明**
  
  | **参数名称** | **参数类型** | **是否必填** | **说明** |
  |---|---|---|---|
  | key      | String   | 是        | 字段名称。  |
     
  
- **返回结果**
  字段不存在返回true，存在返回false。
  
- **函数示例**
  判断日志是否存在content字段，不存在则保留该日志，否则丢弃该日志。
  - 测试数据
    ```
    {
     "content": 123
    }
    ```
    
  
  - 加工规则
    ```
    e_if_else(e_not_has("content"),e_keep(),e_drop())
    ```
    
  
  - 加工结果 日志被丢弃。
    
   
- **更多参考**
  支持和其他函数组合使用。
  
 
 #### e_search
提供一种简化，类似Lucene语法的事件搜索方式。该功能在邀测期间，e_search函数处理日志流量比较小，请谨慎使用。
- **函数格式**
  ```
  e_search(querystring)
  ```
  
- **参数说明**
  
  |  **参数名称**   | **参数类型** | **是否必填** |        **说明**         |
  |---|---|---|---|
  | querystring | String   | 是        | 查询字符串，用于快速过滤日志的查询字符串。 |
     
  
- **返回结果**
  满足条件返回true，否则返回false。
  
- **函数参考示例**
  ```
  # 全文
  e_search("active error")# 全文：两个子串是OR关系，进行搜索。 
  e_search('"active error"')   # 全文：一个子串搜索。  
  # 字段:字符串
  e_search("status: active")         # 单词搜索。 
  e_search('author: "john smith"')   # 带空格子串搜索。 
  e_search('field: active error')   # 相当于field:active OR "error"。  
  # 完全匹配
  e_search('author== "john smith"')    
  # 通配符搜索，星号（*）匹配零个或多个字符，半角问号（?）匹配一个字符。
  e_search("status: active*test")    # active*test中仅包含星号（*），可以不使用双引号（""）包裹。 
  e_search("status: active?good")    # active?good中仅包含半角问号（?），可以不使用双引号（""）包裹。 
  e_search("status== ac*tive?good")  # 完全匹配。  
  # 搜索值转义，星号（*）或问号（?）需要使用反斜线（\）转义。
  e_search('status: "\*\?()[]:="')  # \*\?()[]:=中包含特殊字符，需要使用双引号（""）包裹，除了星号（*）、半角问号（?）和反斜线（\）需要转义外，其他不用转义。
  e_search("status: active\*test")  # active\*test中仅包含星号（*），可以不使用双引号（""）包裹。 
  e_search("status: active\?test")  # active\?test中仅包含半角问号（?），可以不使用双引号（""）包裹。 
   # 字段名转义
  e_search("\*\(1+1\)\?: abc")                  # 字段名不能用双引号（""）包裹，特殊字符用反斜线（\）转义。 e_search("__tag__\:__container_name__: abc")  # 用反斜线（\）转义。 
  e_search("中文字段: abc")                     # 直接写中文。  
  # 正则匹配
  e_search('content~="正则表达式"')   # 正则匹配。 
  # 数字
  e_search('count: [100, 200]')   # >=100 and <=200
  e_search('count: [*, 200]')     # <=200
  e_search('count: [200, *]')     # >=200
  e_search('age >= 18')           # >= 18
  e_search('age > 18')            # > 18 
  # 使用关系运算符
  e_search("abc OR xyz")    # 关系运算符不区分大小写，OR和or效果一样。 
  e_search("abc and (xyz or zzz)")
  e_search("abc and not (xyz and not zzz)")
  e_search("abc && xyz")    # and
  e_search("abc || xyz")    # or
  e_search("abc || !xyz")   # or not
  ```
  
- 函数示例
  - 测试数据
    ```
    {
     "desc": "john smith is a player"
    }
    ```
    
  
  - 加工规则
    ```
    e_if(e_search('desc: "john smith"'), e_set("found", "Yes"))
    ```
    
  
  - 加工结果
    ```
    {
        "found": "Yes",
        "desc": "john smith is a player"
    }
    ```
    
   
- **更多参考**
  支持和其他函数组合使用。
  
 
 #### e_match
判断当前日志字段的值是否满足正则表达式。
- **函数格式**
  ```
  e_match(key, regular_expression, full=true)
  ```
  e_match函数通常与op_not、op_and或者op_or结合使用。
  
- **参数说明**
  
  |      **参数名称**      | **参数类型** | **是否必填** |                             **说明**                              |
  |---|---|---|---|
  | key                | String   | 是        | 字段名。当字段不存在时，视为当前子条件不匹配。例如：字段f1不存在，那么e_match("f1", ...)结果为false。 |
  | regular_expression | String   | 是        | 正则表达式。如果需要使用纯粹字符串匹配时（非正则表达式），可以使用函数str_regex_escape修饰正则表达式。     |
  | full               | Bool     | 否        | 是否完全匹配，默认为true表示完全匹配。                                           |
     
  
- **返回结果**
  返回字段匹配的判断结果true或false。
  
- **函数示例**
  判断字段k1的值是否为数字。
  - 测试数据
    ```
    {
     "k1": 123
    }
    ```
    
  
  - 加工规则
    ```
    e_set("e_match", e_match("k1",r'\d+'))
    ```
    
  
  - 加工结果
    ```
    k1: 123
    match: true
    ```
    
   
- **更多参考**
  支持和其他函数组合使用。
  
 
 #### e_match_any
判断当前日志字段的值是否满足正则表达式，任意字段匹配返回true，否则返回false。
- **函数格式**
  ```
  e_match_any(key1, regular_expression1, key2, regular_expression2, ..., full=true)
  ```
  - 函数中key和regular_expression必须成对出现。
  
  - e_match_any函数通常与op_not、op_and或者op_or结合使用。
   
- **参数说明**
  
  |      **参数名称**      | **参数类型** | **是否必填** |                               **说明**                                |
  |---|---|---|---|
  | key                | String   | 是        | 字段名。当字段不存在时，视为当前子条件不匹配。例如：字段f1不存在，那么e_match_any("f1", ...)结果为false。 |
  | regular_expression | String   | 是        | 正则模式。如果需要使用纯粹字符串匹配时（非正则），可以使用函数str_regex_escape修饰正则。                |
  | full               | Bool     | 否        | 是否完全匹配，默认为true表示完全匹配。                                               |
     
  
- **返回结果**
  返回字段匹配的判断结果true或false。
  
- **函数示例**
  e_match_any匹配，任意字段匹配则返回true。
  - 测试数据
    ```
    {
     "k1": 123,
     "k2": "abc",
     "k3": "abc123"
    }
    ```
    
  
  - 加工规则
    ```
    e_set("match",e_match_any('k1', r'\d+', 'k2', '.+'))
    ```
    
  
  - 加工结果
    ```
    k1:123
    k2:abc 
    k3:abc123 
    match:true
    ```
    
   
- **更多参考**
  支持和其他函数组合使用。
  
 
 #### e_match_all
判断当前日志字段的值是否满足正则表达式，所有字段匹配返回true，否则返回false。
- **函数格式**
  ```
  e_match_all(key1, regular_expression1, key2, regular_expression2, ..., full=true)
  ```
  - 函数中key和regular_expression必须成对出现。
  
  - e_match_all函数通常与op_not、op_and或者op_or结合使用。
   
- **参数说明**
  
  | **参数名称** | **参数类型** | **是否必填** |                               **说明**                                |
  |---|---|---|---|
  | 字段名      | String   | 是        | 字段名。当字段不存在时，视为当前子条件不匹配。例如：字段f1不存在，那么e_match_all("f1", ...)结果为false。 |
  | 正则       | String   | 是        | 正则模式。如果需要使用纯粹字符串匹配时（非正则），可以使用函数str_regex_escape修饰正则。                |
  | full     | Bool     | 否        | 是否完全匹配，默认为true表示完全匹配。                                               |
     
  
- **返回结果**
  返回字段匹配的判断结果true或false。
  
- **函数示例**
  - 测试数据
    ```
    {
     "k1": 123,
     "k2": "abc",
     "k3": "abc123"
    }
    ```
    
  
  - 加工规则
    ```
    e_set("match", e_match_all("k1", r"\d+", "k2", r"\d+"))
    ```
    
  
  - 加工结果
    ```
    k1:123
    k2:abc 
    k3:abc123 
    match:false
    ```
    
  
  
  
  - **更多参考**
    支持和其他函数组合使用。
    
   
 
