複数の Elasticsearch インデックスを横断して検索する

複数の Elasticsearch インデックスを横断して検索する

ワイルドカードパターンと明示的なカンマ区切りリストという 2 つの方法で、複数の Elasticsearch インデックスを一度にクエリします。

Takahiro Iwasa
3 min read

Elasticsearch では、ワイルドカードパターンまたは明示的なカンマ区切りリストのいずれかを使って、複数のインデックスを一度にクエリできます。

Elasticsearch の起動

以下の docker-compose.yml で、シングルノードのクラスタを構成します。

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

クラスタを起動します。

Terminal window
docker-compose up -d

データの準備

curl を使って、users-2020-11users-2020-12 の各インデックスにドキュメントを登録します。

Terminal window
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/

データの検索

ワイルドカードによる検索

ワイルドカード式を使うと、1 回のリクエストで複数のインデックスを検索できます。

Terminal window
curl localhost:9200/users-2020-*/_search | jq .hits.hits

レスポンスには users-2020-11users-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"
}
}
]

カンマ区切りリストによる検索

複数のインデックスをカンマ区切りのリストで明示することもできます。

🔥 Caution

この方法を使う場合は、URL の長さが上限を超えないように注意してください。

Terminal window
curl localhost:9200/users-2020-11,users-2020-12/_search | jq .hits.hits

レスポンスには users-2020-11users-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"
}
}
]

まとめ

ワイルドカードパターンと明示的なカンマ区切りリストのどちらを使っても、users-2020-11users-2020-12 から同じ検索結果が返されます。実用上の主な違いは、対象インデックスの指定方法と管理方法です。

users-2020-* のようなワイルドカードパターンは、月次インデックスが増えても指定文字列が変わらないため、時系列のインデックスを扱いやすくなります。一方、対象が少数で事前に分かっている場合は、カンマ区切りリストのほうが明示的です。ただし、対象が増えると URL の長さ制限に注意が必要です。

About the author

Takahiro Iwasa

Takahiro Iwasa

Software Developer

This blog shares technical notes from hands-on projects—architecture, implementation, and AWS service integrations.