全部產品
Search
文件中心

Simple Log Service:查詢字串文法

更新時間:Oct 29, 2024

查詢字串文法是SLS DSL中用於快速過濾資料的文法,可以簡化條件判斷。本文介紹查詢字串的通用文法規則。

函數列表

使用以下函數時,您可以使用查詢字串文法。

類型

函數

情境

事件檢查函數

e_search

使用查詢字串判斷事件的欄位值是否滿足特定條件。

資源函數

res_log_logstore_pull

從Logstore中擷取並返回表格結構的資料,支援使用查詢字串配置黑白名單進行過濾篩選。

res_rds_mysql

從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\*teststatus: 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

邏輯關係

支援任意搜尋之間的邏輯關係,也支援用圓括弧()進行嵌套。

邏輯關係

關鍵字

andAND&&等,不區分大小寫。

orOR等,不區分大小寫。

notNOT!等,不區分大小寫。

範例:

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==""'):欄位不存在或值不為空白。