複数の Elasticsearch インデックスを横断して検索する
ワイルドカードパターンと明示的なカンマ区切りリストという 2 つの方法で、複数の Elasticsearch インデックスを一度にクエリします。
Elasticsearch では、ワイルドカードパターンまたは明示的なカンマ区切りリストのいずれかを使って、複数のインデックスを一度にクエリできます。
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/データの検索
ワイルドカードによる検索
ワイルドカード式を使うと、1 回のリクエストで複数のインデックスを検索できます。
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" } }]カンマ区切りリストによる検索
複数のインデックスをカンマ区切りのリストで明示することもできます。
この方法を使う場合は、URL の長さが上限を超えないように注意してください。
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" } }]まとめ
ワイルドカードパターンと明示的なカンマ区切りリストのどちらを使っても、users-2020-11 と users-2020-12 から同じ検索結果が返されます。実用上の主な違いは、対象インデックスの指定方法と管理方法です。
users-2020-* のようなワイルドカードパターンは、月次インデックスが増えても指定文字列が変わらないため、時系列のインデックスを扱いやすくなります。一方、対象が少数で事前に分かっている場合は、カンマ区切りリストのほうが明示的です。ただし、対象が増えると URL の長さ制限に注意が必要です。
Related posts
Gremlin で Amazon Neptune をクエリする
Amazon Neptune にプロパティグラフを登録し、Gremlin のトラバーサルで関係をクエリする方法を解説します。
MySQL 5.7 で地理座標間の距離を計算する
MySQL 5.7 で追加された ST_Distance_Sphere 関数を使うと、2 つの地理座標間の大圏距離を自前で実装せずに計算できます。
C4 ダイアグラムでチーム間のコミュニケーションを改善する
C4 モデルの特徴と、UML やインフラ構成図との違いを整理し、相手のロールに合った粒度でソフトウェアアーキテクチャを伝える方法を解説します。
Cognito User Pools と OIDC で Slack サインインを実装する
Cognito user pool を OIDC 経由で Slack と連携させ、"Sign in with Slack" を Amplify で Next.js アプリケーションに組み込みます。
Lambda Web Adapter で FastAPI を AWS Lambda にデプロイする
FastAPI で書いた API バックエンドをコンテナ化し、Lambda Web Adapter と AWS CDK を使って単一の Lambda 関数へデプロイします。
