マルチテナント Web アプリ用のElasticSearchマッピングの考案を始めたところです。このアプリには、サイト ID:s とページ ID:s があります。ページ ID: はサイトごとに一意で、ランダムに生成されます。ページには子ページを含めることができます。
最高のもの:
1) サイト + ページ ID:s で複合キーを使用しますか? そのようです:
"sitePageIdPath": "(siteID):(grandparent-page-ID).(parent-page-ID).(page-ID)"
また:
2) サイト ID とページ ID に別々のフィールドを使用しますか? そのようです:
"siteId": "(siteID)",
"pageIdPath": "(grandparent-page-ID).(parent-page-ID).(page-ID)"
?
サイト ID とページ ID を 1 つのフィールドにマージすると、ElasticSearch はそのフィールドのみを処理する必要があると考えています。これは、 2 つのフィールドを使用するよりも、インデックス作成と検索の両方でパフォーマンスが向上するはずです。また、必要な保管スペースも少なくて済みます。
しかし、おそらく私が気付いていないいくつかの欠点がありますか?したがって、この質問。
いくつかの詳細: 1) 私は単一のインデックスを使用しており、「ユーザー」データ フロー パターンを使用するときに提案されているように、シャード (100 シャード) を過剰に割り当てています。2) インデックス付けされたドキュメントのsiteIdフィールドでは&routing=site-ID
なく、URL (つまり ) でルーティング パラメータを明示的に指定しています。
7 時間後に更新:
1) すべてのクエリは、サイト ID (つまり、テナント ID) でフィルタリングする必要があります。サイト ID をページ ID と組み合わせる場合は、プレフィックス フィルターを使用してサイト ID をフィルター処理できると思います。これは、単一の専用のsiteIdフィールドでフィルタリングするのと同じくらい高速になるのでしょうか(たとえば、結果をキャッシュできますか)。
2) クエリの例: 全文検索。すべてのユーザーを一覧表示します。すべてのページを一覧表示します。特定のページのすべての子/後続ページを一覧表示します。( _source経由で) 単一のページを読み込みます。
22 時間後に更新:
3) ページ ID で検索でき_id
ます(site-ID):(page-ID)
。したがって、ページ ID がpageIdPathの最後の要素として「隠されている」ことは問題ではありません。別のページ ID フィールドがあることを先に述べておくべきだったかもしれませんが、質問は簡潔にしましょう。
4)index: not_analyzed
これらの ID フィールドに使用します。