-1

ここに記載されているように、フィルタリングされたエイリアスを使用する予定です - https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-aliases.html

入力データは、ES に保存したいオブジェクトに対応するストリームの各行を持つストリームになります。

各オブジェクトには、ルーティングとフィルタリングに使用する「id」が含まれています。

質問 - どうすれば効率的にエイリアスとインデックス データを作成できますか?

-- すべてのデータにインデックスを付け、すべての一意の「ID」を追跡し、最後にフィルタリングされたエイリアスを作成しますか? また

-- オブジェクトごとに、その「id」のエイリアスが存在するかどうかを確認します。作成しない場合は?

私は最初のアプローチに傾いています。2番目のアプローチと比較した場合、それは賢明でパフォーマンスが高いですか?

ティア。

4

1 に答える 1

2

上記の議論に基づいて、あなたが投稿したブログ記事を一瞥した後、あなたの場合、エイリアスはまったく必要なく、ルーティング キーで十分であると確信しています。繰り返しますが、インデックスが 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>(特定のシャードがさまざまな顧客のドキュメントをホストできるため)。検索は、指定されたルーティング キーによって識別されるシャードに直接行われるため、指定された顧客からのデータのみが取得されます。

これにフィルタリングされたエイリアスを使用しても、取得されたドキュメントはルーティング キーによって既に "フィルタリング" (一種) されているため、エイリアス定義に含めるフィルタとルーティング キーは何も追加されないため、何ももたらされません。これは、エイリアスが存在するかどうかを (インデックス化する新しいドキュメントごとに) 検出し、存在しない場合は作成するよりもはるかに簡単です。

アップデート:

フィルタリングされたエイリアスを絶対に作成する/作成したい場合は、最初に言及した方法がよりパフォーマンスの高い方法になります。

  1. 最初に毎日のデータにインデックスを付けます
  2. 次に、十分に高いフィールドでterms集計を実行します(つまり、フィールドのカーディナリティよりも高く、この場合は ~100 でした)、すべての一意の顧客 ID を取得してエイリアスを作成するようにします。customer_idsize
  3. すべてのバケットをループして、すべての一意の顧客 ID を取得します
  4. それぞれに1 つを使用して、 1 つのショットですべてのエイリアスを作成します。actioncustomer_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" } }
            }
        },
        ...
    ]
}'

エイリアスが既に存在するかどうかを心配する必要はないことに注意してください。コマンド全体が失敗することはなく、既存のエイリアスは黙って無視されます。

このコマンドを実行すると、一意のインデックスにすべてのエイリアスが作成され、フィルターとルーティング キーで適切に構成されます。

于 2015-05-28T07:10:19.960 に答える