Elasticsearch Field Collapsing

elastic_search

Elasticsearch Field Collapsing

Elasticsearch 5.3 がリリースされましたね。今回はその New feature の中で、Field Collapsing について紹介したいと思います。

Field collapsing と言えば、Top hits aggregation が思い浮かぶ方も多いかと思いますが、今回リリースされた New Field collapsing の機能は Aggregation ではなく、検索結果そのものを折りたたむことができます。

検索系の機能名称では、Collapse Search / Field collapsing / Result grouping と言ったりしますが、一般的に日本語では何って呼ばれてるのだろう?折りたたみ検索? 指定されたフィールドの値を使って、検索結果の重複を排除するような機能です。

ユースケース例

例えば、EC サイトの商品検索で、カラーやサイズなどの単品単位で検索結果を表示することもあれば、 カラー・サイズは違っても同じ素材・スタイルは同一商品として品目単位で検索結果を表示したいと言うニーズは多々あります。

単品単位で検索結果を表示していれば、1ページ内に同じ商品が並ぶ可能性が高くなります。 他の品目を見たい場合は、ページングして2ページ目、3ページ目を表示することになります。 このようなユースケースでは、旧来のオフセットベースのページングはあまり使いやすいとは言えません。

ユースケースに合わせて単品単位で表示したり、品目単位で表示したりできれば便利ですよね? Field Collapsing はこのようなユースケースに対応することができます。

Field Collapsing

まずは、折りたたまずに普通の検索です。1ドキュメント単品単位でインデックスされている想定です。 title が "メンズ" を含む商品を検索し、人気順 (スキ数の多い順) でソートした結果を返します。 この時の検索結果の単位は、1結果単品単位で結果が返されます。

GET /item/items/_search
{
  "query": {
    "match": {"title": "メンズ"}
  },
  "sort": ["likes"]
}

これを品目で折りたたんで見ましょう。item_group_id は品目単位でユニークな値がストアされているフィールドです。 1結果品目単位で結果を返すように指定するには、先ほどの検索条件に collapse を追加して、item_group_id を指定します。

GET /item/items/_search
{
  "query": {
    "match": {"title": "メンズ"}
  },
  "collapse": {             // 品目単位で検索結果を折りたたむ指定。
    "field": "item_group_id"
  },
  "sort": ["likes"]
}

この検索条件の結果は、人気順で品目単位でベストな単品情報が1件づつ結果として返却されます。 非常に簡単に利用することができますね。

さらに、inner_hits を使って、折りたたまれている検索結果を拡張することもできます。

オフセットベースのページングもできるが注意が必要

Field Collapsing は、検索結果を折りたたむ機能のため、折りたたまれた検索結果は from size パラメータを使用して、通常の検索結果同様にページングすることができます。

ただし、検索結果合計数は折りたたまれる前のドキュメント数のため、オフセットベースのページングを実装する場合は注意が必要です。

また、Aggregation も集計されるドキュメント数は、折りたたまれる前のドキュメント数です。

新しいページングスタイルとしての可能性

旧来のオフセットベースのページングスタイルは、ユーザーの購買行動に合わせたパースナライズや、ユースケースに対応した検索結果を提供することはできません。

先ほどは、品目単位で折りたたむ話だけでした。例えば、item_group_by_color_id フィールドを用意して、カラーバリエーション別や、スペック別など想像次第でいろんな検索結果のバリエーションをユーザーに提供することが可能です。

Field Collapsing を新しいページングスタイルとしてサイトの UX を設計することで、小難しい技術を使わなくても、ユースケースに合わせた検索結果を提供できるようになるのです。

旧来のページングは捨てて、Field Collapsing ベースのページングスタイルを導入してみたはどうだろうか?

Field Collapsing vs Top Hits Aggregation

かなり似たような機能なので、完全に使い分けるのは難しいかもしれません。 ただ、それぞれの機能は、特徴や制限が異なります。

本当に個人的な感想ですが、強いて使い分けるなら

Field Collapsing は新しいページングスタイルとして、ユーザーのユースケースに合わせて検索結果をダイナミックに提供するための機能。

Top Hits Aggregation は、「〇〇別商品トップ10」などのように、ユーザー共通の静的な情報として検索結果を提供するための機能。折りたたむ単位をダイナミックに変更すると言うよりは、検索結果を俯瞰するために利用する?

こんな感じでしょうか?

さいごに

最後まで読んでいただいてありがとうございます。

実は今日、最終出社日です。

このブログもクラスメソッド社員としては最後の記事になります。 1年2ヶ月と短い期間でしたが、振り返ればなかなか密度の濃い1年でした。 チームメンバーはじめ、他の部署、お客様など、いろいろな方にお世話になり、大変感謝しております。 クラスメソッド卒業後も、ここで得た知識や経験を生かして、頑張りたいと思います。

またどこかでお会いしましょう!(ここかもしれないけどw)