現在Cultural Japanプロジェクトにおける検索アプリの更新を進めており、多言語データのアグリゲーションを行う必要がありました。本記事では、その方法に関する調査結果の備忘録です。
データ#
データとしては、以下のように、agential(人物を示す)フィールドに、id、ja、enの値を持つケースを想定します。
上記のデータに対して、idでフィルタリング処理などを行いつつ、言語設定に合わせてjaまたはenの値を表示することを想定します。
理想的には、aggregationの結果として、以下のようなデータを取得したいです。
(jaを指定した場合)
(enを指定した場合)
方法1: nested aggregationの利用#
以下の記事を参考に、nested aggregationを試します。
https://discuss.elastic.co/t/aggregeations-with-different-keys-and-values-label-and-id/274218
この場合、以下のような結果が返却されます。
aggregations.agentialにlabelとidが返却されますが、冗長な結果のように思われます。
方法2: 文字列の結合#
以下の記事の質問で挙げられている方法を試します。
https://stackoverflow.com/questions/70545830/aggregation-that-returns-the-users-name-and-id
fc-agentialフィールドを用意し、$$$を区切り文字として、id、ja、enの値を結合した値を入れてみました。
この場合、以下のような結果が返却されます。
nestedを使用しない分、クエリや結果は簡潔ですが、取得後にデータを修正する必要があります。
方法3: a nested top-hits aggregation?#
以下の記事の回答として挙げられている方法を試します。
https://stackoverflow.com/questions/70545830/aggregation-that-returns-the-users-name-and-id
この場合、以下のような結果が返却されます。
aggregations.agentialに結果の1例が含まれるため、そこからidとjaの関係を抽出できます。方法2に比べて、fc-agentialのような項目を用意する必要がない点が利点ですが、これも結果が冗長なように思われます。
まとめ#
Elastic Searchにおける異なるキーと値(ラベルとID)を持つアグリゲーションの調査結果をまとめました。参考になりましたら幸いです。
また、上記で挙げた3つ方法以外にも良い方法があるように思います。もしご存じの方がいらっしゃれば教えていただけますと幸いです。