在SQL分析語句中,您可以使用search函數對日誌資料執行全文檢索索引。本文介紹search函數的使用樣本、使用限制、最佳實務建議和常見問題。
前提條件
已建立Standard LogStore。具體操作,請參見管理LogStore。
已採集日誌。具體操作,請參見資料擷取概述。
已建立索引,且非掃描模式。
使用樣本
與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 > 50search函數與其他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 |
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_idLEFT 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)中只能使用一個 |
OR操作符限制 |
|
掃描模式限制 | 掃描模式下不支援search函數。 |
查詢文法輸入衝突 | 當查詢文法輸入包含實際過濾條件時,不能使用search函數。查詢文法輸入為空白或為 |
參數類型 | search函數的參數只能是字串字面量,不支援列引用、變數或函數運算式等動態值。 |
組合用法限制
情境 | 是否允許 | 樣本 |
單個search函數 | 允許 |
|
search + AND + SQL條件 | 允許 |
|
search + AND + (c1 OR c2) | 允許 |
|
search內部使用OR | 允許 |
|
多表JOIN各子查詢含search | 允許 | 每個子查詢獨立使用,互不影響 |
同一子查詢中多個search | 不允許 |
|
search + OR + SQL條件 | 不允許 |
|
最佳實務
合并查詢條件:將所有全文檢索索引條件合并到一個
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函數。請切換為索引模式使用。