複数の 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/データの検索
ワイルドカードによる検索
ワイルドカード式を使うと、単一のクエリで複数のインデックスにまたがるデータにマッチさせられます。
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 形式による検索
もう一つの方法は、複数のインデックスをカンマ区切りのリストで指定する方法です。
この方法を使う場合は、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 をクエリする
Gremlin によるグラフトラバーサルの例と、Neptune の読み取り・更新クエリにおけるトランザクション分離レベルの違い。
MySQL 5.7で地理座標間の距離を計算する
MySQL 5.7で追加されたST_Distance_Sphere関数を使うと、2つの地理座標間の大圏距離を自前実装なしで計算できる。
Cognito User PoolsとOIDCでSlackサインインを実装する
Cognito user poolをOIDC経由でSlackと連携させ、"Sign in with Slack"をAmplifyでNext.jsアプリに組み込みます。
Lambda Web AdapterでFastAPIをAWS Lambdaにデプロイする
Lambda Web Adapterを使うと、FastAPIで書いたAPIバックエンドをコンテナのまま単一のLambda関数にデプロイできます。
API Gateway WebSocket:モック統合の実装
バックエンドのLambdaを一切使わず、モック統合のみでAPI Gateway WebSocket APIを構築し、あらかじめ用意されたレスポンスを返します。
