查詢字串文法是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==""'):欄位不存在或值不為空白。