查詢字串文法是SLS DSL中用於快速過濾資料的文法,可以簡化條件判斷。本文介紹查詢字串的通用文法規則。
函數列表
使用以下函數時,您可以使用查詢字串文法。
類型 | 函數 | 情境 |
事件檢查函數 | 使用查詢字串判斷事件的欄位值是否滿足特定條件。 | |
資源函數 | 從Logstore中擷取並返回表格結構的資料,支援使用查詢字串配置黑白名單進行過濾篩選。 | |
從RDS MySQL中擷取並返回表格結構的資料,支援使用查詢字串配置黑白名單進行過濾篩選。 |
功能概覽
不同搜尋功能對欄位搜尋和全文檢索搜尋的支援情況如下表所示。
功能 | 欄位搜尋 | 全文檢索搜尋 |
子串搜尋 | 支援 | 支援 |
萬用字元 | 支援 | 支援 |
完全符合搜尋 | 支援 | 不支援 |
Regex搜尋 | 支援 | 不支援 |
數值範圍搜尋 | 支援 | 不支援 |
數值比較 | 支援 | 不支援 |
關係and、or、not及組合 | 支援 | 支援 |
字元轉義
在字串查詢文法中,需要對一些特殊字元,例如星號(*)、反斜線(\)等進行轉義操作。
欄位名轉義
欄位名不能使用半形雙引號("")包裹,包含特殊字元時使用反斜線(\)轉義。例如:
\*\(1+1\)\?: abc
:使用反斜線(\)轉義。__tag__\:__container_name__: abc
:使用反斜線(\)轉義。中文欄位: abc
:中文不需要轉義。"content": abc
:非法定義,欄位名不能用半形雙引號("")包裹。
搜尋值轉義
包含半形雙引號("")或反斜線(\)時需用反斜線(\)轉義,例如
content: "abc\"xy\\z"
。說明搜尋值只能使用半形雙引號("")包裹。您可以使用單引號('')包裹外層字串,使用半形雙引號("")包裹裡層搜尋值,例如:
e_search("domain: '/url/test.jsp'")
是錯誤的,正確的為e_search('domain: "/url/test.jsp"')
。搜尋星號(*)或半形問號(?)時需要使用反斜線(\)轉義,否則會被視為萬用字元匹配。
只包含中文、字母、數字、底線(_)、短劃線(-)、星號(*)或半形問號(?)這些特殊字元時,不需要用半形雙引號("")包裹,其他情況需要使用半形雙引號("")包裹。例如:
status: "\*\?()[]:="
:使用半形雙引號("")包裹,並使用反斜線(\)對星號(*)、半形問號(?)進行轉義,其他字元不用轉義。content: ()[]:=
:非法定義,需要使用半形雙引號("")包裹。status: active\*test
、status: active\?test
:欄位值僅包含星號(*)、半形問號(?)及字母,只需要對星號(*)或半形問號(?)進行轉義,不需要使用半形雙引號("")包裹。
子串搜尋
全文檢索搜尋
在所有欄位中搜尋子串。
文法格式
e_search('子串')
樣本
e_search('"錯誤"')
:搜尋中文子串。e_search('"active error"')
:搜尋完整帶空格的子串。e_search('active error')
:多個子串搜尋,多個子串之間預設為OR關係。
欄位搜尋
在特定欄位中搜尋子串。
文法格式
e_search('...')
樣本
e_search('status: active')
:子串搜尋。e_search('author: "john smith"')
:帶空格子串搜尋。
說明e_search('field: active error')
相當於field:active OR "error"
,表示在field欄位中搜尋active或者全文檢索搜尋error。
萬用字元搜尋
星號(*)表示零個或多個字串,半形問號(?)表示一個字元,也可以表示一個寬字元(例如中文字元)。
全文檢索搜尋
在所有欄位中搜尋子串。
文法格式
e_search('子串')
樣本
e_search('active*test')
:匹配零到多個字元,因為字串中有星號(*),所以該字串不需要使用半形雙引號("")包裹。e_search('發生*錯誤')
:匹配零到多個字元,可以匹配發生錯誤
,發生嚴重錯誤
等。e_search('active?good')
:匹配一個字元,因為字串中有半形問號(?),所以該字串不需要使用半形雙引號("")包裹。e_search('ac*tive?good')
:完全符合。e_search('ac*tive??go*od')
:支援多個混合使用。
欄位搜尋
在特定欄位中搜尋子串。
文法格式
e_search('欄位名:子串')
樣本
e_search('status: active*test')
:匹配零到多個字元。e_search('status: active?good')
:匹配一個字元。
完全符合
完全符合要求對欄位值從開始到結尾完全符合。
文法格式
e_search('欄位名==完全符合字串')
樣本
e_search('author== "john smith"')
:author欄位完全等於john smith。e_search('status== ac*tive?good')
:與萬用字元結合使用。
Regex匹配
Regex匹配是比萬用字元匹配更強大的匹配方式。
文法格式
e_search('欄位名~=Regex字串')
說明由於Regex中可能包含反斜線(\),推薦使用
r
進行不轉義。預設為部分匹配,如果需要完全符合,需要在開頭和結尾加上
^
和$
。
樣本
e_search('status~= "\d+"')
:status欄位包含數字。e_search('status~= "^\d+$"')
:status欄位等於數字。
數值比較
對數值進行比較。
數值直接比較
使用
>
、>=
、=
、<
、<=
進行比較。e_search('age >= 18') # >=18 e_search('age > 18') # > 18 e_search('age = 18') # = 18 e_search('age <= 18') # <=18 e_search('age < 18') # < 18
數值範圍比較:
使用閉區間,支援使用星號(*)表示無邊界。
e_search('count: [100, 200]') # >=100 and <=200 e_search('count: [*, 200]') # <=200 e_search('count: [200, *]') # >=200
邏輯關係
支援任意搜尋之間的邏輯關係,也支援用圓括弧()
進行嵌套。
邏輯關係 | 關鍵字 |
且 |
|
或 |
|
否 |
|
範例:
e_search('abc OR xyz') # 關係運算子不區分大小寫
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
子串匹配也支援邏輯關係:
e_search('field: (abc OR xyz)') # 欄位field包含abc或xyz
e_search('field: (abc OR not xyz)') # 欄位field包含abc或不包含xyz
e_search('field: (abc && !xyz)') # 欄位field包含abc且不包含xyz
欄位判斷
使用搜尋字串對欄位進行判斷。
e_search('field: *')
:欄位存在。e_search('not field:*')
:欄位不存在。e_search('not field:""')
:欄位不存在。e_search('field: "?"')
:欄位存在且值不為空白。e_search('field==""')
:欄位存在且值為空白。e_search('field~=".+"')
:欄位存在且值不為空白。e_search('not field~=".+"')
:欄位不存在或值為空白。e_search('not field==""')
:欄位不存在或值不為空白。