Elasticsearchの親子関係でのパフォーマンス

この投稿では、ホストされたElasticsearchを使用します。Qbox.io.ここでクラスターをサインアップまたは起動するか、ヘッダーナビゲーションの”Get Started”をクリックします。 設定のヘルプが必要な場合は、”Qbox Elasticsearchクラスターのプロビジョニング”を参照してください。”

ネストされたオブジェクトに対する親子の利点は次のとおりです:

  • 親ドキュメントは、子ドキュメントのインデックスを再設定せずに更新できます。
  • 子ドキュメントは、親または他の子に影響を与えることなく、追加、変更、または削除できます。 これは、子ドキュメントの数が多く、頻繁に追加または変更する必要がある場合に特に便利です。
  • 子ドキュメントは、検索要求の結果として返すことができます。

親子関係は、ネストされたモデルと本質的に似ています。 違いは、ネストされたオブジェクトでは、すべてのエンティティが同じドキュメント内に存在し、親子では親と子が完全に別々のドキュメントである ただし、

親子の制限

  • 親と子の型が異なるか、同じ型のドキュメント間で親子の関係を確立できない必要があります。
  • _parent.type設定は、まだ存在しない型のみを指すことができます。 これは、型が作成された後は、型が親型になることができないことを意味します。
  • 親ドキュメントと子ドキュメントは、同じシャードに索引付けする必要があります。 親IDは、子のルーティング値として使用され、子が親と同じシャードで索引付けされるようにします。 これは、子ドキュメントを取得、削除、または更新するときに同じ親値を提供する必要があることを意味します。

親子関係とネストされた関係の主な違いは、次のように要約することができます:

ネストされたオブジェクト 親子
1. ネストされたオブジェクトは、同じドキュメントに保存されます。 親オブジェクトと子オブジェクトは、別々のドキュメントに別々に保存されます。
2. 子オブジェクトは、複数の親オブジェクトを持つことができます。 子オブジェクトは複数の親オブジェクトを持つことはできません。
3. クエリは比較的高速です。 子と親が別々に格納されているため、クエリが遅くなります。
4. 複数のネストされたレベルを簡単に維持できます。 複数のネストされたレベルを維持するのは難しい。
5. ネストされたレベルのクエリは明確に定義されており、任意の数のネストされたオブジェクトに使用するのは簡単です。 また、クエリ文字列は、ネストされたオブジェクトを照会するために使用することができます。 複数の親子関係が存在する場合、クエリは複雑になります。
6. 彼らは同じオブジェクトに存在しているので、すべてのデータを取得することができます。 は、単一のクエリで子ドキュメントと親ドキュメントの両方を取得できません。
7. ネストされたオブジェクトは、親オブジェクトごとに複製されます。 関係が正規化されているため、データの重複は関係しません。
8. ネストされたオブジェクトが変更された場合は、すべての親オブジェクトのインデックスを再作成する必要があります。 親の間には接続のみが維持されるため、親のインデックスを再作成する必要はありません。

ネストされたオブジェクトは、次の理由により、関連付けを処理するために親子よりも優先される可能性があります:

  • データベースモデルに複数のレベルに複数のネストされた関連付けが含まれている場合。 したがって、ネストされたオブジェクトのアプローチで簡単に処理できます。
  • 親子アプローチでは、子オブジェクトは複数の親オブジェクトを持つことはできません。
  • ネストされたクエリは、ネストされたオブジェクトアプローチで実行する方が簡単です。
  • 単一のクエリで子フィールドと親フィールドの両方を取得できません。

パフォーマンス上の考慮事項:グローバル序数

グローバル序数は、fielddataおよびdoc valuesの上にあるデータ構造で、辞書式順序で一意の用語ごとに増分番号付けを維持します。 各用語には一意の番号があり、用語Aの数は用語Bの数よりも少ない。 グローバル序数は、テキストフィールドとキーワードフィールドでのみサポートされます。

Fielddata値とdoc値にも序数があり、これは特定のセグメントとフィールド内のすべての用語に対して一意の番号付けです。 グローバル序数は、セグメント序数とグローバル序数の間のマッピングを提供することによって、この上に構築されます。

グローバル序数は、ソートや用語aggregationなどのセグメント序数を使用して実行時間を短縮する機能に使用されます。 Terms集計では、シャードレベルで集計を実行するためにグローバル序数のみに依存し、異なるシャードからの結果を結合する最終的なreduceフェーズでのみグローバル序数を実項に変換します。

Enterprise Kubernetes Support

Parent-childはグローバル序数を使用して結合を高速化します。 グローバル序数は、シャードを変更した後に再構築する必要があります。 親id値がシャードに格納されるほど、_parentフィールドのグローバル序数を再構築するのに時間がかかります。インデックスが変更されている場合、_parentフィールドのグローバル序数はrefreshの一部として再構築されます。

フィールドのグローバル序数は、refreshの一部として再構築されます。

フィールドのグローバル序数は、refreshフィールドの一部として再構築されます。 これにより、更新にかなりの時間がかかる可能性があります。 それ以外の場合は、最初の親子クエリまたは集計が使用されたときにグローバル序数が再構築されます。 これは、多くの書き込みが発生しているときに、_parentフィールドの複数のグローバル序数が単一の更新間隔内に再構築される可能性があるため、通常はこれ

親/子が頻繁に使用されず、書き込みが頻繁に発生する場合は、eager loadingを無効にすることが理にかなっているかもしれません。

グローバル序数で使用されるヒープ:

  • あなたが持っているより多くの結合、悪いパフォーマンスになります。
  • 親の各世代には、文字列_idフィールドがメモリに格納されている必要があり、多くのRAMを消費する可能性があります。

あなたの関係スキームと親子があなたのために右であるかどうかを検討するように、親子関係についてのこのアドバイスを検討してください:

  • 親と子の関係は控えめに使用し、親よりも多くの子供がいる場合にのみ使用してください。
  • 単一のクエリで複数の親子結合を使用しないでください。
  • has_childフィルタを使用するか、score_modeをnoneに設定したhas_childクエリを使用してスコアリングを回避します。
  • 親Idを短くしておくと、doc値の圧縮が良くなり、一時的にロードされたときのメモリ使用量が少なくなります。

それを旋回を与えます!

47のRackspace、Softlayer、またはAmazonデータセンターのいずれかで、標準のホストされたElasticsearchクラスターを簡単にスピンアップできます。 また、Qbox Private Hosted Elasticsearchで独自のAWSクレジットをプロビジョニングできるようになりました。

私達にノートを落とせば、私達は敏速な応答を得ます。

QboxでホストされたELK-stack enterprise searchの利点をまだ享受していませんか? 今日はアカウントを作成し、クラウドホスティングサービスでElasticsearch環境を管理および拡張するのがいかに簡単かを発見することをお勧めします。

コメントを残す

メールアドレスが公開されることはありません。