Elasticsearchのcollapseって?
本日は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に対しては注意が必要です。
このように、各カテゴリごとの上位(下位)アイテムを抽出したいといったユースケースで便利な機能になりますので、みなさんも使ってみてはいかがでしょうか💡
最後に
スペースマーケットでは、一緒にサービスを成長させていく仲間を探しています。
ビジネスサイド、エンジニアメンバー共に話しやすいメンバーが多く非常に働きやすい環境だと思います!
ご興味ある方ぜひ見てみて下さい!
スペースを簡単に貸し借りできるサービス「スペースマーケット」のエンジニアによる公式ブログです。 弊社採用技術スタックはこちら -> whatweuse.dev/company/spacemarket
Discussion