上記の議論に基づいて、あなたが投稿したブログ記事を一瞥した後、あなたの場合、エイリアスはまったく必要なく、ルーティング キーで十分であると確信しています。繰り返しますが、インデックスが 1 つしかないという理由だけで、多数のインデックスがある場合、これはもはや当てはまりません!
ドキュメントのインデックス作成時に使用するルーティング キーを指定するだけです。ES 2.0 までは、ES 1.5 で廃止されましたが、その目的で_routing
フィールドを使用できますが、あなたの場合は目的を果たします。
{
"customer" : {
"_routing" : {
"required" : true,
"path" : "customer_id" <----- the field you use as the routing key
},
"properties": { ... }
}
}
次に、検索するときに、顧客 ID フィルターに加えて、検索 URL で指定するだけです&routing=<customer_id>
(特定のシャードがさまざまな顧客のドキュメントをホストできるため)。検索は、指定されたルーティング キーによって識別されるシャードに直接行われるため、指定された顧客からのデータのみが取得されます。
これにフィルタリングされたエイリアスを使用しても、取得されたドキュメントはルーティング キーによって既に "フィルタリング" (一種) されているため、エイリアス定義に含めるフィルタとルーティング キーは何も追加されないため、何ももたらされません。これは、エイリアスが存在するかどうかを (インデックス化する新しいドキュメントごとに) 検出し、存在しない場合は作成するよりもはるかに簡単です。
アップデート:
フィルタリングされたエイリアスを絶対に作成する/作成したい場合は、最初に言及した方法がよりパフォーマンスの高い方法になります。
- 最初に毎日のデータにインデックスを付けます
- 次に、十分に高いフィールドで
terms
集計を実行します(つまり、フィールドのカーディナリティよりも高く、この場合は ~100 でした)、すべての一意の顧客 ID を取得してエイリアスを作成するようにします。customer_id
size
- すべてのバケットをループして、すべての一意の顧客 ID を取得します
- それぞれに1 つを使用して、 1 つのショットですべてのエイリアスを作成します。
action
customer_id
curl -XPOST 'http://localhost:9200/_aliases' -d '{
"actions" : [
{
"add" : {
"index" : "customers",
"alias" : "alias_cid1",
"routing" : "cid1",
"filter" : { "term" : { "customer_id" : "cid1" } }
}
},
{
"add" : {
"index" : "customers",
"alias" : "alias_cid2",
"routing" : "cid2",
"filter" : { "term" : { "customer_id" : "cid2" } }
}
},
{
"add" : {
"index" : "customers",
"alias" : "alias_cid3",
"routing" : "cid3",
"filter" : { "term" : { "customer_id" : "cid3" } }
}
},
...
]
}'
エイリアスが既に存在するかどうかを心配する必要はないことに注意してください。コマンド全体が失敗することはなく、既存のエイリアスは黙って無視されます。
このコマンドを実行すると、一意のインデックスにすべてのエイリアスが作成され、フィルターとルーティング キーで適切に構成されます。