Elasticsearch ES|QL 入門:ログ分析をもっとスマートに

BLOG

Elasticsearch は、ログやメトリクスの検索・分析に広く使われている分散型検索エンジンです。これまでの検索には Lucene ベースの DSL が広く使われてきましたが、2023年に登場した新しいクエリ言語「ES|QL(Elasticsearch Query Language)」によって、より柔軟で強力な分析が可能になりました。

概説

ES|QL とは?

ES|QL は、Elasticsearch に特化した新しいクエリ言語で、パイプ構文を使って複数の処理を直感的に記述できるのが特徴です。UNIX のパイプ(|)のように、クエリの各ステップをつなげてデータを変換・整形・集計していくスタイルは、ログ分析やセキュリティ監視において非常に有効です。

例:

FROM kibana_sample_data_logs
| STATS count = COUNT() by clientip
| SORT count DESC
| LIMIT 10

このように、clientip ごとのアクセス数を集計し、降順に並べる処理をシンプルに記述できます。

※ES|QLの文法の詳細については、公式ドキュメントを参照してください。

ES|QL の主な特徴

  • パイプ構文:複数の処理を直列につなげて記述できる
  • 高速実行:Elasticsearch の分散処理と統合されており、大量データでも高速
  • 直感的な構文:SQL に似た構文で学習コストが低い
  • 一貫した操作:フィルタ・集計・変換が一貫して可能(WHERE、STATS、KEEP など)

ユースケース

ES|QL は特に以下のようなユースケースで威力を発揮します:

  • セキュリティログの異常検知
  • アプリケーションログのエラーパターン分析
  • メトリクスの時系列集計と可視化
  • Kibana でのダッシュボード作成やアラート設定

ES|QL を使うには?

ES|QL は、Elasticsearch 8.11 以降で正式に利用可能です。Kibana の Discover や Dev Tools から直接クエリを実行できるほか、API 経由でも利用できます。

POST /_query
{
  "query": "FROM kibana_sample_data_logs | STATS count = COUNT() by clientip | SORT count DESC | LIMIT 10"
}

サンプル実行

ここからは、実際に ES|QL を試してみましょう。

1. 準備:環境

  • Elasticsearch 8.11 以降 (筆者は、Elasticsearch 9.1.4 で検証)
  • ES|QLを利用可能な場所:
    • Kibana の Discover
    • Kibana の Dev Tools
    • Kibana の Dashboard
    • API 経由

※Elastic Security の detection rule でも利用可能ですが、本記事では割愛します。詳しく知りたい方は公式ドキュメントを参照してください。

2. サンプルデータの準備

Kibana には、3種類のサンプルデータが用意されています。今回は、そのうちの kibana_sample_data_logs を利用します。

手順:

  • 2.1. Kibana にログインし、Home 画面を表示します。
  • 2.2. Home 画面から Try sample data をクリックします。
  • 2.3. Sample data タブの > Other sample data sets を展開します。
  • 2.4. Sample web logs の [Add data] をクリックします。
  • 2.5. しばらく待ちます。
  • 2.6. [View data] と表示されれば、サンプルデータの取り込み完了です。

3. 基本のクエリ

まずは kibana_sample_data_logs インデックスからデータを取得してみましょう。

  • 3.1. Analytics / Discover 画面に遷移します。
  • 3.2. 画面上部の [Try ES|QL] をクリックします。

ES|QL を入力する画面に切り替わります。

  • 3.3. クエリーの入力欄に次の ES|QL クエリーを入力し、 [▶ Run] を押します。
FROM kibana_sample_data_logs
| LIMIT 5
  • 3.4. 最初の5件がリストに表示されます。

表示されない場合は、対象となる期間を調節してみてください。(Last 1 year など)

4. 条件で絞り込む

response が “200” でないドキュメントだけを抽出するには WHERE を使います。

FROM kibana_sample_data_logs
| WHERE response != "200"
| KEEP @timestamp, response, clientip, url
| LIMIT 10

KEEP を使うと必要なフィールドだけを残せるため、ログの可読性が向上します。

5. 集計してみる

clientip ごとのアクセス数を集計してみましょう。

FROM kibana_sample_data_logs
| STATS count = count() BY clientip
| SORT count DESC
| LIMIT 10

アクセス数の多い clientip を簡単に特定できます。

6. 時系列での分析

時間ごとのアクセス数を確認するには DATE_TRUNC(), STATS, BY を組み合わせます。

FROM kibana_sample_data_logs
| EVAL hour = DATE_TRUNC(1h, timestamp)
| STATS count = count() BY hour
| SORT hour ASC

これで「1時間ごとのアクセス数」をグラフ化でき、ピーク時間帯を把握できます。

7. ダッシュボードへのグラフの追加

ES|QL の結果をグラフとしてダッシュボードへ追加するには、2つの方法があります。

7.1. Discover からダッシュボードへ追加する方法

  • 7.1.1. Discover 画面のグラフの右上のフロッピーディスクアイコンをクリックします。
  • 7.1.2. Save Lens visualization ダイアログが開くので、Title, 追加先のダッシュボード名などを入力して、[Save and go to Dashboard] をクリックします。

※注 (将来的には変わるかもしれませんが)v9.1.4 の時点では、library に追加することはできません。

  • 7.1.3. ダッシュボードへグラフが追加されます。

7.2. ダッシュボードから直接追加する方法

  • 7.2.1. ダッシュボードを新規作成します。あるいは、既存のダッシュボードを開きます。
  • 7.2.2. [ (+) Add panel ] をクリックします。
  • 7.2.3. Visualizations から ES|QL をクリックします。
  • 7.2.4. クエリーの入力欄が表示されるので、そこに実行したい ES|QL のクエリーを入力し、[ ▷ Run query ] をクリックします。
  • 7.2.5. 左側にグラフが表示されるので、それで問題なければ [Apply and close] をクリックします。
  • 7.2.6. ダッシュボードへグラフが追加されます。

8. Dev Tools からの実行

Dev Tools の Console から ES|QL で問い合わせを行うには、

POST /_query { "query": "..." }

という形式を利用します。

Dev Tools の Console を開いて、下記を実行してみてください。

POST /_query
{
  "query": """
FROM kibana_sample_data_logs
| WHERE @timestamp >= NOW() - 10d
| STATS count = COUNT() by clientip
| SORT count DESC
| LIMIT 10
"""
}

レスポンス

{
  "took": 11,
  "is_partial": false,
  "documents_found": 14024,
  "values_loaded": 0,
  "columns": [
    {
      "name": "count",
      "type": "long"
    },
    {
      "name": "clientip",
      "type": "ip"
    }
  ],
  "values": [
    [
      100,
      "30.156.16.164"
    ],
    [
      29,
      "164.85.94.243"
    ],
    [
      26,
      "50.184.59.162"
    ],
    [
      26,
      "236.212.255.77"
    ],
    [
      25,
      "16.241.165.21"
    ],
    [
      25,
      "246.106.125.113"
    ],
    [
      24,
      "111.237.144.54"
    ],
    [
      24,
      "81.194.200.150"
    ],
    [
      23,
      "56.28.213.27"
    ],
    [
      23,
      "26.131.108.13"
    ]
  ]
}

POST /_query の構文については、公式ドキュメントを参照してください。

まとめ

ES|QL の特徴は以下の通りです。:

  • パイプ構文で直感的に書ける
  • フィルタ・集計・変換を一貫して実行できる
  • ログ分析やセキュリティ監視に最適

まずはシンプルなクエリから試し、徐々に複雑な分析へと広げていくのがおすすめです。Kibana の可視化機能と組み合わせれば、リアルタイムに「気づき」を得られる強力な武器になります。