179

MVC パターンを使用して開発されたアプリケーションがあり、その複数のモデルにインデックスを付けたいと考えています。これは、各モデルが異なるデータ構造を持つことを意味します。

  • モデルごとに 1 つずつ複数のインデックスを使用するか、モデルごとに同じインデックス内に型を使用する方がよいでしょうか? どちらの方法でも、別の検索クエリが必要になると思います。私はこれを始めたばかりです。

  • データセットが小さいか巨大な場合、両方の概念の間にパフォーマンス上の違いはありますか?

誰かがその目的のためにいくつかの良いサンプルデータを私に勧めることができれば、私は2番目の質問を自分でテストします.

4

4 に答える 4

200

両方のアプローチには異なる意味があります。

Elasticsearch のデフォルト設定を使用していると仮定すると、モデルごとに 1 つのインデックスを使用すると、シャードの数が大幅に増加します。1 つのインデックスで 5 つのシャードが使用され、5 つのデータ モデルで 25 のシャードが使用されるからです。1 つのインデックスに 5 つのオブジェクト タイプがある場合でも、5 つのシャードを使用することになります。

各データ モデルをインデックスとして持つことの意味:

  • 異なるインデックスに分散されているため、各シャードのデータ量が少なくて済むため、インデックス内で効率的かつ高速に検索できます。
  • 2 つ以上のインデックスからデータ モデルの組み合わせを検索すると、オーバーヘッドが発生します。これは、インデックス全体でより多くのシャードにクエリを送信し、コンパイルしてユーザーに送り返す必要があるためです。
  • 追加のシャードが作成されるたびにストレージが増え、パフォーマンスの向上はわずかであるため、データ セットが小さい場合はお勧めしません。
  • データ セットが大きく、クエリの処理に時間がかかる場合に推奨されます。これは、専用のシャードが特定のデータを格納しており、Elasticsearch での処理が容易になるためです。

各データ モデルをインデックス内のオブジェクト タイプとして持つことの意味:

  • インデックスの 5 つのシャード内により多くのデータが格納されます。つまり、異なるデータ モデル間でクエリを実行する場合のオーバーヘッドの問題は少なくなりますが、シャード サイズは大幅に大きくなります。
  • シャード内のデータが増えると、フィルタリングするドキュメントが増えるため、Elasticsearch が検索するのに時間がかかります。
  • 1 テラバイトのデータを処理していて、Elasticsearch マッピングで異なるインデックスまたは複数のシャードにデータを分散していないことがわかっている場合は、お勧めできません。
  • 各シャードがハードウェアのスペースを占有するため、わずかなパフォーマンスの向上のためにストレージ スペースを無駄にしないため、小さなデータ セットに推奨されます。

多すぎるデータと小さいデータとは何ですか? 通常、これはハードウェアのプロセッサ速度と RAM、Elasticsearch のマッピングの各変数内に格納するデータの量、およびクエリ要件によって異なります。クエリで多くのファセットを使用すると、応答時間が大幅に遅くなります。これに対する簡単な答えはなく、必要に応じてベンチマークする必要があります。

于 2013-01-28T02:47:58.883 に答える
14

ジョナサンの答えは素晴らしいです。他に考慮すべき点をいくつか追加します。

  • シャードの数は、選択したソリューションごとにカスタマイズできます。15 個のプライマリ シャードを含む 1 つのインデックスを使用するか、5 個のシャードに対して 3 つのインデックスに分割することができます - パフォーマンスの観点は変わりません (データが均等に分散されていると仮定)
  • データの使用について考えます。すなわち。キバナを使用して視覚化する場合、特定のインデックスを含める/除外する方が簡単ですが、タイプはダッシュボードでフィルタリングする必要があります
  • データ保持: アプリケーション ログ/メトリック データの場合、別の保持期間が必要な場合は別のインデックスを使用します
于 2015-07-28T11:29:22.527 に答える
3

上記の両方の答えは素晴らしいです!

インデックスにいくつかのタイプの例を追加しています。図書館で本を検索するアプリを開発しているとします。ライブラリの所有者に尋ねる質問がいくつかあります。

質問:

  1. 何冊の本を保管する予定ですか?

  2. 図書館にはどのような本を保管しますか。

  3. どのように本を探しますか。

答え:

  1. 5万冊~7万冊(目安)の蔵書を予定しています。

  2. 技術関連の本(コンピュータサイエンス、機械工学、化学工学など)を1万5千冊~2万冊、歴史書を1万5千冊、医学書を1万冊持っています。10 k の言語関連書籍 (英語、スペイン語など)

  3. 著者名、著者名、出版年、出版社名で検索します。(これにより、インデックスに格納する必要がある情報についてのアイデアが得られます)

上記の回答から、インデックスのスキーマは次のようになるはずだと言えます。

//これは正確なマッピングではありません。例として

            "yearOfPublish":{
                "type": "integer"
            },
            "author":{
                "type": "object",
                "properties": {
                    "firstName":{
                        "type": "string"
                    },
                    "lastName":{
                        "type": "string"
                    }
                }
            },
            "publisherName":{
                "type": "string"
            }
        }

上記を実現するために、Books と呼ばれる 1 つのインデックスを作成し、さまざまなタイプを持つことができます。

索引: 本

タイプ: 科学、芸術

(または、より多くの本がある場合は、技術、医学、歴史、言語などの多くのタイプを作成できます)

ここで注意すべき重要なことは、スキーマは似ていますが、データは同一ではないということです。もう 1 つの重要な点は、保存しているデータの合計です。

上記が、インデックスで異なるタイプを使用する場合に役立つことを願っています。異なるスキーマがある場合は、異なるインデックスを検討する必要があります。少ないデータの小さなインデックス。ビッグデータのビッグインデックス:-)

于 2017-02-21T16:01:38.237 に答える