クエリの子の中からの親のデータの参照について

お世話になります。質問させてください。

has_childの中で親のデータを参照した計算をしたいと考えています。

has_childの中からhas_parentをすると重たくなる印象があります。
多くのフィールドを参照したいのですが、stored fieldはやりすぎない方がいい印象があります。
script fieldなど動的なフィールドをhas_child内部から参照させるのもできないのかなと感じています。
painlessで参照できる方法があればいいなと思ったのですがうまくいきませんでした。

上記以外の良い方法や、上記でもうまくいく可能性があるというような助言をいただければ幸いです。

よろしくお願いいたします。

どれぐらいのフィールド数があるか、データの更新パターンや全体のボリュームも分からないので何の確証もありませんが、
私なら、子データの中に、必要となる親のデータも子のフィールドに入れておきたくなります。
それで、実運用に耐えるかどうかを検証するアプローチをとります。

DBのような正規化じゃないアプローチの方が、シンプルにできると思っています。

私も他の人のご意見を聞きたいです。

2 Likes

早速のご回答ありがとうございます!参考にします。

こんにちは

私もtsgkdtさんと同じく、必要となる親のフィールドを子の方にも持たせるのが良いかなと思います。

RDBとは違いElasticsearchは正規化された構成にするよりも必要な分だけ非正規化して利用する方が得意だと思いますし、よりシンプルに使えるかなと思います。

ちょうど昨日開催のElasticsearch勉強会で親子データを取り扱っていた事例の発表がありましたので、
スピーカーの方に質問してみました。

  • 子でも必要な親の情報はそれぞれ持っている(非正規化)
  • その結果、子の方のフィールド数は1000ぐらい(でも実用に耐えているとのこと)

こちらのスライドも紹介されていました。非正規化のアプローチが書かれています。

ご参考になれば幸いです。

1 Like

ご回答ありがとうございます。
tsgkdtさんに続き、非正規化での利用についてのご意見、助かります。
参考にさせていただきます。

スライドも閲覧させてもらいました。勉強になります。
DBと即時の同期を取っている事例ですね。
データサイズと親に変更があった時に子を全て更新することになることに注意とのこと参考になります。

あとは、古いですが、このあたりのドキュメントが考え方としては参考になるかと。
https://www.elastic.co/guide/en/elasticsearch/guide/current/relations.html

2.xベースで記述されているので、クエリやマッピングについては最新版のリファレンスと合わせて読んでいただくのをお勧めします。

ありがとうございます。
フラットな特性をベースにしつつリレーショナルな対応をしているということを思い出しつつ検討します。
前述のアドバイスの非正規化についても、どのような考え方で取り入れるかの参考になります。

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.