Link Search Menu Expand Document Documentation Menu

表达式语法

表达式提供了操作、过滤和路由数据的灵活性。以下部分提供了有关 OpenSearch Data Prepper 中表达式语法的信息。

关键术语

以下是表达式语境中使用的关键术语。

词项 定义
表达式 一个通用组件,包含一个主项或一个运算符。表达式可以嵌套在其他表达式中。表达式的直接子项可以包含 0–1 个运算符。
表达式字符串 在 Data Prepper 表达式中具有最高优先级,并且只支持一个表达式字符串,从而产生一个返回值。表达式字符串与表达式不同。
字面量 没有子项的基本值。字面量可以是以下之一:浮点数、整数、布尔值、JSON 指针、字符串或 null。请参见字面量
运算符 一个硬编码的标记,用于标识表达式中使用的操作。
主项 可以是以下之一:集合初始化器、优先级表达式或字面量。
语句 表达式字符串中优先级最高的组件。

运算符

下表列出了支持的运算符。运算符按优先级顺序(从上到下,从左到右)排列。

运算符 描述 结合性
() 优先级表达式 从左到右
not
+
-
一元逻辑非
一元正号
一元负号
从右到左
*, / 乘法和除法运算符 从左到右
+, - 加法和减法运算符 从左到右
+ 字符串连接运算符 从左到右
<, <=, >, >= 关系运算符 从左到右
==, != 相等运算符 从左到右
and, or 条件表达式 从左到右

关系运算符

关系运算符比较数值或解析为数值的 JSON 指针。这些运算符用于测试两个操作数之间的关系,判断一个是否大于、小于或等于另一个。关系运算符的使用语法如下:

<Number | JSON Pointer> < <Number | JSON Pointer>
<Number | JSON Pointer> <= <Number | JSON Pointer>
<Number | JSON Pointer> > <Number | JSON Pointer>
<Number | JSON Pointer> >= <Number | JSON Pointer>

例如,要检查事件中 status_code 字段的值是否在 HTTP 成功响应范围(200-299)内,可以使用以下表达式:

/status_code >= 200 and /status_code < 300

相等运算符

相等运算符用于测试两个值是否等效。这些运算符比较任何类型的值,包括 JSON 指针、字面量和表达式。相等运算符的使用语法如下:

<Any> == <Any>
<Any> != <Any>

以下是一些相等运算符的示例:

  • /is_cool == true: 检查 JSON 指针引用的值是否等于布尔值。
  • 3.14 != /status_code: 检查数值是否不等于 JSON 指针引用的值。
  • {1, 2} == /event/set_property: 检查数组是否等于 JSON 指针引用的值。

条件表达式

条件表达式允许您使用逻辑运算符组合多个表达式或值,以创建更复杂的评估标准。可用的条件运算符有 andornot。这些条件运算符的使用语法如下:

<Any> and <Any>
<Any> or <Any>
not <Any>

以下是一些条件表达式的示例:

/status_code == 200 and /message == "Hello world"
/status_code == 200 or /status_code == 202
not /status_code in {200, 202}
/response == null
/response != null

算术表达式

算术表达式支持基本的数学运算,如加法、减法、乘法和除法。这些表达式可以与条件表达式结合使用,以创建更复杂的条件语句。可用的算术运算符是 +、-、* 和 /。算术运算符的使用语法如下:

<Any> + <Any>
<Any> - <Any>
<Any> * <Any>
<Any> / <Any>

以下是算术表达式的示例:

/value + length(/message)
/bytes / 1024
/value1 - /value2
/TimeInSeconds * 1000

以下是一些在条件表达式中使用的算术表达式示例:

/value + length(/message) > 200
/bytes / 1024 < 10
/value1 - /value2 != /value3 + /value4

字符串连接表达式

字符串连接表达式允许您组合字符串以创建新字符串。这些连接的字符串也可以在条件表达式中使用。字符串连接的使用语法如下:

<String Variable or String Literal> + <String Variable or String Literal>

以下是字符串连接表达式的示例:

/name + "suffix"
"prefix" + /name
"time of " + /timeInMs + " ms"

以下是一些可以在条件表达式中使用的字符串连接表达式示例:

/service + ".com" == /url
"www." + /service != /url

保留符号

某些符号,例如 ^、%、xor、=、+=、-=、*=、/=、%=、++、– 和 ${},保留用于未来的功能或扩展。保留符号包括 `^`、`%`、`xor`、`=`、`+=`、`-=`、`*=`、`/=`、`%=`、`++`、`--` 和 `${}`.

语法组件

语法组件是 Data Prepper 中表达式的基本组成部分。它们允许您定义集合、指定评估顺序、引用事件中的值、使用字面量值,并遵循特定的空白字符规则。理解这些组件对于在 Data Prepper 管道中有效创建和使用表达式至关重要。

优先级表达式

优先级表达式指定表达式的评估顺序。它们用括号 () 括起来。优先级表达式必须包含一个表达式或值(不支持空括号)。以下是一个优先级表达式的示例:

/is_cool == (/name == "Steven")

JSON 指针

JSON 指针用于引用事件中的值。它们以一个前导正斜杠 / 开头,后跟字母数字字符或下划线,这些字符或下划线由额外的正斜杠 / 分隔。

JSON 指针可以通过将整个指针用双引号 "" 括起来并使用反斜杠 \ 转义字符来使用扩展字符集。请注意,~/ 字符被视为指针路径的一部分,无需转义。以下是一些有效的 JSON 指针示例:~0 表示字面字符 ~,或 ~1 表示字面字符 /

简写语法

JSON 指针的简写语法可以使用以下正则表达式模式表示,其中 \w 表示任何单词字符(A–Z、a-z、0–9 或下划线)

/\w+(/\w+)*`

以下是此简写语法的示例:

/Hello/World/0

转义语法

JSON 指针的转义语法可以表示如下:

"/<Valid String Characters | Escaped Character>(/<Valid String Characters | Escaped Character>)*"

以下是一个转义 JSON 指针的示例:

# Path
# { "Hello - 'world/" : [{ "\"JsonPointer\"": true }] }
"/Hello - 'world\//0/\"JsonPointer\""

字面量

字面量是没有子项的基本值。Data Prepper 支持以下字面量类型:

  • 浮点数 (Float):支持从 3.40282347 x 10^38 到 1.40239846 x 10^-45 的值。
  • 整数 (Integer):支持从 -2,147,483,648 到 2,147,483,647 的值。
  • 布尔值 (Boolean):支持 truefalse
  • JSON 指针:更多信息请参见JSON 指针
  • 字符串 (String):支持有效的 Java 字符串。
  • Null:支持 null 以检查 JSON 指针是否存在。

空白字符规则

关系运算符、正则表达式相等运算符、相等运算符和逗号周围的空白字符是可选的。集合初始化器、优先级表达式、集合运算符和条件表达式周围的空白字符是必需的。

运算符 描述 必需的空白字符 ✅ 有效示例 ❌ 无效示例
{} 集合初始化器 /status in {200} /status in{200}
() 优先级表达式 /a==(/b==200)
/a in ({200})
/status in({200})
in, not in 集合运算符 /a in {200}
/a not in {400}
/a in{200, 202}
/a not in{400}
<, <=, >, >= 关系运算符 /status < 300
/status>=300
 
+ 字符串连接运算符 /status_code + /message + "suffix"  
+, - 算术加法和减法运算符 /status_code + length(/message) - 2  
*, / 乘法和除法运算符 /status_code * length(/message) / 3  
=~, !~ 正则表达式相等运算符 /msg =~ "^\w*$"
/msg=~"^\w*$"
 
==, != 相等运算符 /status == 200
/status_code==200
 
and, or, not 条件运算符 /a<300 and /b>200 /b<300and/b>200
, 集合值分隔符 /a in {200, 202}
/a in {200,202}
/a in {200 , 202}
/a in {200,}
typeof 类型检查运算符 /a typeof integer
/a typeof long
/a typeof string
/a typeof double
/a typeof boolean
/a typeof map
/a typeof array
/a typeof /b
/a typeof 2