Elasticsearch で複数のインデックスを検索する方法
はじめに
Elasticsearch は複数のインデックスを横断して検索するための強力な機能を提供しており、さまざまなソースから同時にデータを取得できます。このチュートリアルでは、効果的なセットアップ方法とクエリの実行方法を解説します。
(Optional, string) Comma-separated list of data streams, indices, and index aliases to search. Wildcard (*) expressions are supported.
Elasticsearch を起動する
まず、公式の Docker image を使用して、ローカル環境に Elasticsearch クラスター を起動します。以下はクラスターを構成して起動するための docker-compose.yml
ファイルの例です。
version: '3'
services:
elasticsearch:
image: elasticsearch:7.10.1
container_name: elasticsearch
environment:
- discovery.type=single-node
- bootstrap.memory_lock=true
ports:
- 9200:9200
以下のコマンドでクラスターを起動します。
docker-compose up -d
データの準備
複数のインデックスを試すために、以下の curl
コマンドを使って users-2020-11
と users-2020-12
にデータをインデックス化します。
curl -X POST -H 'Content-Type: application/json' -d '{"name": "hoge"}' localhost:9200/users-2020-11/_doc/
curl -X POST -H 'Content-Type: application/json' -d '{"name": "fuga"}' localhost:9200/users-2020-12/_doc/
これにより、テスト用のデータを含む 2 つのインデックスが作成されます。
データを検索する
ワイルドカードを使用した検索
ワイルドカード を使用して複数のインデックスからデータをクエリすることができます。
curl localhost:9200/users-2020-*/_search | jq .hits.hits
このクエリのレスポンスは users-2020-11
と users-2020-12
の両方のデータを含みます。
[
{
"_index": "users-2020-11",
"_type": "_doc",
"_id": "PNQ3tXYBKT-fwQ71grcz",
"_score": 1,
"_source": {
"name": "hoge"
}
},
{
"_index": "users-2020-12",
"_type": "_doc",
"_id": "PdQ3tXYBKT-fwQ71p7cy",
"_score": 1,
"_source": {
"name": "fuga"
}
}
]
CSV フォーマットを使用した検索
もう一つの検索方法として、複数のインデックスを CSV で指定する方法があります。
curl localhost:9200/users-2020-11,users-2020-12/_search | jq .hits.hits
このクエリのレスポンスも users-2020-11
と users-2020-12
の両方のデータを含みます。
[
{
"_index": "users-2020-11",
"_type": "_doc",
"_id": "PNQ3tXYBKT-fwQ71grcz",
"_score": 1,
"_source": {
"name": "hoge"
}
},
{
"_index": "users-2020-12",
"_type": "_doc",
"_id": "PdQ3tXYBKT-fwQ71p7cy",
"_score": 1,
"_source": {
"name": "fuga"
}
}
]
まとめ
Elasticsearch で複数のインデックスを検索することは、複雑なアプリケーションでデータを取得する際に柔軟性と効率性を提供します。ワイルドカード や CSV フォーマット を活用することで、クエリを効率的に実行できます。
詳細については、Elasticsearch Search API Documentation をご参照ください。
Happy Coding! 🚀