3

ElasticSearch で次のことを行う方法が見つかりません。

  • ElasticSearch で 2,000,000 個のアイテムのインデックスが作成されています
  • MySQL に 30,000 人のプレイヤーが保存されています

すべてのアイテムには属性としてプレイヤーの名前があります。これらのプレーヤーのオンライン ステータスは 15 分ごとに変化し、(当然のことながら) true または false になります。

オンラインプレイヤー向けのアイテムのみを表示できるようにしたいと考えています。

オンライン ステータスは頻繁に変更されるため、アイテムのオンライン ステータスをインデックス化できないと思います。非常に多くのオンライン プレーヤーの ID を取得してフィルターとして使用することはできません。

エラスティックサーチでもプレイヤーをインデックス化するのに役立ちますか? JOIN別のインデックスである種のことを行うことは可能ですか?

編集: ES でジョインを行う方法を詳しく調べた後、ES でプレーヤーをインデックス化すると、has_child で実際に可能であることがわかりました。タイヤには の方法がありませんがhas_child、既存の DSL で可能ですか?

4

1 に答える 1

2

親ドキュメントの全文検索が必要ない場合でも、プレーヤーとアイテム間の親子関係に適しているようです。理由は次のとおりです。

  1. 各アイテムはプレイヤーのものです
  2. それらには独立した更新ライフサイクルがあります。プレーヤーが変更されたときに、すべてのアイテムのインデックスを再作成する必要はありません
  3. 親にフィルターを適用して、子のみを返したいとします。

アイテムと同じインデックスで、別のタイプ内でプレーヤーをインデックス化することもできます。プレイヤー タイプがアイテム タイプのであることをマッピングで宣言する必要があります。

{
  "item":{
    "_parent":{
      "type" : "player"
    }
  }
}

その後、プレーヤーのインデックスを作成し、アイテムでそれぞれの親プレーヤー ID を指定します。

次に、アイテムに対して全文検索を実行し、次のhas_parent フィルターを使用してそれらをフィルター処理できます。

{
    "has_parent" : {
        "parent_type" : "player",
        "query" : {
            "term" : {
                "status" : true
            }
        }
    }
}

この方法では、アクティブなプレーヤーに属するアイテムのみをクエリして、最終的に返します。

プレーヤーを更新するには、更新 APIを使用できます。スクリプトを使用して、ドキュメント全体の再送信を回避することもできます。いずれにせよ、ドキュメントは内部で削除され、再インデックスされることに注意してください。これが lucene の仕組みです。

Elasticsearch のドキュメント間の関係についてさらに例を見たい場合は、次の記事をご覧ください。

必要なクエリの種類によっては、制限が発生する可能性がありますが、あなたが書いたものを考えると、これが私がすることです. Elasticsearch は、親子の使用時に関連するすべての ID を含む結合テーブルをメモリに保持するため、ノードに十分なメモリがあることを確認してください。

于 2013-04-20T16:38:20.950 に答える