😊

Elasticsearchのcollapseって?

2024/01/23に公開

スペースマーケットにてバックエンドエンジニアをしている やまもと です。
本日はElasticsearchのcollapseについてです。

collapseとは

Elasticsearchのドキュメントには下記のような旨の説明があります。
「collapseパラメータを使用すると、フィールド値に基づいて検索結果を折りたたむことができます。折りたたみは、折りたたみキーごとにソートされた上位のドキュメントのみを選択することで行われます。」
はい、わかりませんね。

具体例で説明すると、、、
下記のような作曲家、楽曲名、知名度のデータがあるとします。
※ 以下わかりやすさのため、使うデータは表形式で説明します

作曲家(composer) 曲名(music) 知名度(popularity)
ワーグナー ワルキューレ 6
ベートーヴェン 運命 10
チャイコフスキー くるみ割り人形 8
ワーグナー マイスタージンガー 2
ベートーヴェン エリーゼのために 9
ワーグナー ローエングリン 5
チャイコフスキー 白鳥の湖 7

このデータから各作曲家の一番知名度の高い曲を取得したいといったユースケースでcollapseを使うことができます。

GET /music/_search
{
  "query": {
    "match_all": {}
  },
  "collapse": {
    "field": "composer" // 作曲家field
  },
  "sort": [
      {
        "popularity": {
          "order": "desc"
	     }
      }
   ]
}

上記のクエリで以下のような結果を取得することができます。

作曲家(composer) 曲名(music) 知名度(popularity)
チャイコフスキー くるみ割り人形 8
ベートーヴェン 運命 10
ワーグナー ワルキューレ 6

さらに各作曲家の有名曲TOP3を取得したいといった場合はinner_hitsを使うと

GET /music/_search
{
  "query": {
    "match_all": {}
  },
  "collapse": {
    "field": "composer", // 作曲家field
    "inner_hits": [
      {
        "name": "popular_music",
        "size": 3,
        "sort": [
          {
            "popularity": {
              "order": "desc"
            }
          }
        ]
      }
  	]
  },
  "sort": [
      {
        "popularity": {
          "order": "desc"
	     }
      }
   ]
}
作曲家(composer) 曲名(music) 知名度(popularity)
ベートーヴェン 運命 10
ベートーヴェン エリーゼのために 9
チャイコフスキー くるみ割り人形 8
チャイコフスキー 白鳥の湖 7
ワーグナー ワルキューレ 6
ワーグナー ローエングリン 5
ワーグナー マイスタージンガー 2

のように取得できます。

非常に便利な機能ですが、グループ数が多いとその分リソース大量消費することになります。
上記の例ではグルーピングのキーとなっている作曲家数は3なので問題になりませんが、ここが増えていくとリソース消費量も比例して増えていくことになります。
なのでグループ数が無限に増えていくようなfieldに対しては注意が必要です。

このように、各カテゴリごとの上位(下位)アイテムを抽出したいといったユースケースで便利な機能になりますので、みなさんも使ってみてはいかがでしょうか💡

最後に

スペースマーケットでは、一緒にサービスを成長させていく仲間を探しています。

ビジネスサイド、エンジニアメンバー共に話しやすいメンバーが多く非常に働きやすい環境だと思います!
ご興味ある方ぜひ見てみて下さい!

https://spacemarket.co.jp/recruit/engineer/
https://www.wantedly.com/projects/1113544
https://www.wantedly.com/projects/1113570
https://www.wantedly.com/projects/1061116

スペースマーケット Engineer Blog

Discussion