すべてのプロダクト
Search
ドキュメントセンター

Simple Log Service:search() 関数を使用した全文検索

最終更新日:Feb 27, 2026

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 > 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() 関数を 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

ユーザーが所在するリージョン (例: 杭州、上海、北京)

email

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_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

自己結合

同じ 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 文) には、search() 関数を 1 つしか含めることができません。複数のクエリ条件を適用するには、それらを単一の search() 呼び出しにマージします。たとえば、search('error AND timeout') を使用します。

OR 演算子の制限

search() 関数は、SQL レベルで OR 演算子と組み合わせることはできません。OR 演算子は search 関数内でサポートされています。たとえば、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 = 500search('error OR status: 500') に変更します。

エラー:The search() function is not supported in scan mode

現在のモードはスキャンモードであり、search() 関数をサポートしていません。この関数を使用するには、インデックスモードに切り替えてください。