search() 関数は、SQL 分析文内でログデータに対して全文検索を実行します。このトピックでは、構文、使用例、制限事項、ベストプラクティス、およびよくある質問について説明します。
前提条件
標準 Logstore が作成されていること。詳細については、「Logstore の管理」をご参照ください。
ログデータが収集されていること。詳細については、「データ収集の概要」をご参照ください。
インデックスが作成され、スキャンモードが無効になっていること。
例
SQL 述語との組み合わせ
search() 関数を AND 演算子で標準 SQL 述語と組み合わせることで、より正確なフィルタリングが可能になります。
-- 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() 関数を 1 つしか含めることができません。複数テーブルの JOIN では、各 search() 関数が異なるサブクエリに属するため、複数の search() 関数を含めることができます。
サンプルデータ
以下の例では、orders テーブル (orders Logstore) と users テーブル (users Logstore) を使用します。
orders テーブル (orders Logstore) のスキーマ:
フィールド名 | フィールドタイプ | 説明 |
order_id | long | 注文 ID |
user_id | long | ユーザー ID、users テーブルに関連付け |
status | text | 注文ステータス (例: completed、pending、cancelled) |
amount | double | 注文金額 |
order_type | text | 注文タイプ (例: normal、vip) |
users テーブル (users Logstore) のスキーマ:
フィールド名 | フィールドタイプ | 説明 |
user_id | long | ユーザー ID、プライマリキー |
username | text | ユーザー名 |
region | text | ユーザーが所在するリージョン (例: 杭州、上海、北京) |
text | ユーザーのメールアドレス | |
age | long | ユーザーの年齢 |
INNER JOIN
杭州リージョンにいるユーザーと一致する、完了した注文 (status = completed) をクエリします。
* | 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自己結合
同じ Logstore で自己結合を行う場合、異なるエイリアスを持つサブクエリに異なるクエリ条件を適用します。
以下の例では、このスキーマを持つ employees テーブル (employees Logstore) を使用します:
フィールド名 | フィールドタイプ | 説明 |
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 + 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() 関数をサポートしていません。この関数を使用するには、インデックスモードに切り替えてください。