全部產品
Search
文件中心

Simple Log Service:使用search函數進行全文檢索索引

更新時間:Feb 26, 2026

在SQL分析語句中,您可以使用search函數對日誌資料執行全文檢索索引。本文介紹search函數的使用樣本、使用限制、最佳實務建議和常見問題。

前提條件

使用樣本

與SQL謂片語合

search函數可以與標準SQL謂詞通過AND組合使用,實現更精細的過濾。

-- search + 比較子
* | SELECT * FROM log
  WHERE search('status: 200') AND request_time > 100

-- search + IN 子句
* | SELECT * FROM log
  WHERE search('request_method: GET') AND status IN (200, 301, 302)

-- search + LIKE
* | SELECT * FROM log
  WHERE search('status: 200') AND http_user_agent LIKE '%Chrome%'

-- search + BETWEEN
* | SELECT * FROM log
  WHERE search('request_method: POST') AND request_time BETWEEN 100 AND 500

-- search + 複雜條件組合(OR不包含search即可)
* | SELECT * FROM log
  WHERE search('request_method: GET')
    AND (status = 200 OR status = 302)
    AND request_time > 50
  • search函數與其他SQL謂詞只能使用AND串連。

  • search函數不能出現在OR的任何層級中。例如search('error') OR status = 500不允許的。

  • OR可以用於非search的其他SQL謂詞條件。例如search('error') AND (status = 500 OR status = 502)

多表JOIN情境

search函數支援在多LogStore JOIN情境下使用。每個參與JOIN的子查詢可以獨立應用各自的search()過濾條件,互不干擾。

說明

每個子查詢中仍然只能有一個search()函數。多表JOIN之所以可以有多個search(),是因為每個search()分屬不同的子查詢。

範例資料說明

以下樣本使用訂單表(orders LogStore)和使用者表(users LogStore)進行說明。

訂單表(orders LogStore)Schema:

欄位名

欄位類型

說明

order_id

long

訂單ID

user_id

long

使用者ID,關聯使用者表

status

text

訂單狀態,如completed、pending、cancelled

amount

double

訂單金額

order_type

text

訂單類型,如normal、vip

使用者表(users LogStore)Schema:

欄位名

欄位類型

說明

user_id

long

使用者ID,主鍵

username

text

使用者名稱

region

text

使用者所在地區,如hangzhou、shanghai、beijing

email

text

使用者郵箱

age

long

使用者年齡

INNER JOIN

查詢已完成訂單(status為completed)對應的杭州地區(region為hangzhou)使用者資訊。

* | SELECT o.order_id, o.status, o.amount, u.username, u.region
    FROM (
        SELECT * FROM orders.log
        WHERE search('status: completed')
    ) o
    JOIN (
        SELECT * FROM users.log
        WHERE search('region: hangzhou')
    ) u
    ON o.user_id = u.user_id
    ORDER BY o.order_id

LEFT JOIN

保留所有已完成訂單,僅匹配上海地區的使用者。未匹配到使用者的訂單,使用者相關欄位顯示為null。

* | SELECT o.order_id, o.status, u.username, u.region
    FROM (
        SELECT * FROM orders.log
        WHERE search('status: completed')
    ) o
    LEFT JOIN (
        SELECT * FROM users.log
        WHERE search('region: shanghai')
    ) u
    ON o.user_id = u.user_id
    ORDER BY o.order_id

自串連(Self-Join)

同一LogStore的自串連,對不同別名的子查詢分別應用不同的查詢條件。

假設員工表(employees LogStore)Schema如下:

欄位名

欄位類型

說明

employee_id

long

員工ID

employee_name

text

員工姓名

department

text

部門,如engineering、finance

level

text

職級,如junior、senior

manager_id

long

上級經理的employee_id

查詢engineering部門員工及其senior層級的經理資訊:

* | SELECT e.employee_name AS employee, e.department,
           m.employee_name AS manager, m.level AS manager_level
    FROM (
        SELECT * FROM employees.log
        WHERE search('department: engineering')
    ) e
    JOIN (
        SELECT * FROM employees.log
        WHERE search('level: senior')
    ) m
    ON e.manager_id = m.employee_id
    ORDER BY e.employee_name

使用限制

限制項

說明

單一實例限制

每個子查詢(底層SELECT)中只能使用一個search()函數。如需多個查詢條件,請將條件合并到一個search()調用中,例如search('error AND timeout')

OR操作符限制

search()函數不能與SQL層的OR操作符組合使用。在search函數內部可以使用OR,例如search('error OR warning')是允許的。

掃描模式限制

掃描模式下不支援search函數。

查詢文法輸入衝突

當查詢文法輸入包含實際過濾條件時,不能使用search函數。查詢文法輸入為空白或為*時允許使用。

參數類型

search函數的參數只能是字串字面量,不支援列引用、變數或函數運算式等動態值。

組合用法限制

情境

是否允許

樣本

單個search函數

允許

WHERE search('error AND timeout')

search + AND + SQL條件

允許

WHERE search('error') AND status = 500

search + AND + (c1 OR c2)

允許

WHERE search('error') AND (status = 500 OR status = 502)

search內部使用OR

允許

WHERE search('error OR warning')

多表JOIN各子查詢含search

允許

每個子查詢獨立使用,互不影響

同一子查詢中多個search

不允許

WHERE search('error') AND search('timeout'),應改為WHERE search('error AND timeout')

search + OR + SQL條件

不允許

WHERE search('error') OR status = 500

最佳實務

  • 合并查詢條件:將所有全文檢索索引條件合并到一個search()調用中,避免使用多個search()函數。

  • 使用欄位限定查詢:盡量使用field: value格式而非全文檢索查詢,提高查詢精度和效能。

  • 利用數實值型別:long、double類型的欄位使用範圍查詢(field in [min max])而非文本匹配。

  • JSON欄位使用子欄位路徑:查詢JSON類型欄位時,使用精確的子欄位路徑(如content.status),避免在父欄位層級進行模糊比對。

  • 合理組合SQL謂詞:search函數適合用於全文檢索索引和索引下推過濾,SQL謂詞適合用於精確的數值比較和條件判斷。二者通過AND組合使用,可以兼顧效能和靈活性。

常見問題

報錯key (xxx) is not config as key value config

查詢的欄位未在索引中配置為欄位索引。請檢查索引配置,確認該欄位已建立欄位索引。

報錯Multiple search() functions in a single query are not supported

同一個子查詢中使用了多個search函數。請將多個查詢條件合并為一個search調用,例如將search('error') AND search('timeout')改為search('error AND timeout')

報錯The search() function cannot be combined with OR operator

search函數與其他條件使用了OR串連。請將OR邏輯移到search函數內部,例如將search('error') OR status = 500改為search('error OR status: 500')

報錯The search() function is not supported in scan mode

當前處於掃描模式,該模式不支援search函數。請切換為索引模式使用。