Elasticsearchのグルーピング結果をさらにまとめるSecond level of collapsing

こんにちは。ニフティライフスタイルの中野です。

この記事はニフティグループ Advent Calendar 2018の7日目の記事です。

昨日は @hicka04 さんで「社内で勉強会をやるときに気をつけていること」でした!

ニフティのWEBサービスでは、一部サービスのサイト内検索やログ可視化などで Elasticsearch を利用しています。

以前投稿した ElasticsearchのField Collapsingで検索結果をグルーピングする について、Elasticsearch 6.4 から Second level of collapsing という機能が追加されていましたので使ってみたいと思います。

elastic

Field Collapsing はその名のとおり検索結果を「折りたたんで」くれる機能で、検索結果をグルーピングして SQL の GROUP BY のような操作をすることができます。

Elasticsearch 6.4 から追加された Second level of collapsing では、グルーピング結果をさらにもう一段階まとめて取得することができるようです。

まずはサンプルをみてみましょう。

サンプル

データ

サンプルデータとして、青空文庫さんの作品リストcsvを使用させて頂いています。

このデータを Elasticsearch に投入し、Field Collapsing でグルーピングした検索結果と、さらに Second level of collapsing を使った検索結果を比較してみます。

Field Collapsing の検索結果

作品リストを著者ごとにまとめたサンプルです。
それぞれの著者の下に inner_hits として作品が並んでいます。

Second level of collapsing の検索結果

作品リストを著者ごとにまとめたあとに、Second level of collapsing でさらに出版社ごとにまとめたサンプルです。
それぞれの著者の下にある inner_hits が、さらに出版社ごとにまとまっています。

使い方

次に、ドキュメント に従って Second level of collapsing の使い方を確認したいと思います。

Second level of collapsing

グルーピング結果をさらにグルーピングするためには、collapse 句内の inner_hits に collapse 句を追加します。
追加した collapse 句の中では、通常の Field Collapsing と同じように、グルーピングのキーとなるフィールド名を filed に指定します。

下記のクエリでは、aozora というインデックスを検索条件なしで取得して、検索結果を author というフィールドの値ごとにグルーピングし、それをさらに publisher でグルーピングしています。

グループの展開

通常の Field Collapsing では inner_hits 句を追加することで、各グループに含まれるレコードを検索結果に含めることができましたが、残念ながら Second level of collapsing でさらにグルーピングした内容を inner_hits で取得することはできないようです。

Second level of collapsing の基本的な使い方については、以上となります。

まとめ

Second level of collapsing はいかがでしたでしょうか。
二重にグルーピングすることで、WEBサイトやECサービスでの検索結果の一覧性向上や、Kibanaでのログ可視化にも役立てることができそうですね。

弊社の提供するニフティ不動産ニフティアルバイト等の横断検索サービスでも、Elasticsearchの便利な検索機能を活用して利用者様に想像以上の体験を提供できるよう、改善していきたいと思います。

明日は @kanishionori さんがinput要素をCSSだけでいじり倒してくれるそうです!お楽しみに!