Skip to content

Instantly share code, notes, and snippets.

@shoito
Last active August 29, 2015 14:04
Show Gist options
  • Save shoito/7bd8800d40d3a5b3da13 to your computer and use it in GitHub Desktop.
Save shoito/7bd8800d40d3a5b3da13 to your computer and use it in GitHub Desktop.
ElasticsearchでField Collapsing/Combining http://qiita.com/shoito/items/e56aba6c76f27e16167b
{
"size": 0,
"query": {
"match": {
"title": "ほげ"
}
},
"aggs": {
"hits": {
"terms": {
"field": "gid",
"order": {
"top_hit": "desc"
}
},
"aggs": {
"top": {
"top_hits": {
"sort": [
{
"released_at": {
"order": "desc"
}
}
],
"size": 1
}
},
"top_hit": {
"max": {
"field": "downlaod_count"
}
}
}
}
}
}

この例だと13行目でorderにtop_hitを指定して、downlaod_count(数値のmax)でソートしてるけど、title.raw(※やりたかったのはgroup_name.rawでした)のようにタイトル(文字列)順でソートしたい...。例では、gidでグルーピングし、グループ毎に新しい順(released_at)で上位1件取得。

@johtani
Copy link

johtani commented Jul 23, 2014

いくつか質問が。

  • gidの中には複数タイトルが入ってます?
  • gidごとのデータを現状は、ヒット件数の降順でソートしてるけど、タイトルの昇順?降順?でリストをソートしたい?

@shoito
Copy link
Author

shoito commented Jul 23, 2014

gidの中には複数タイトルが入ってます?

各documentはtitleとgroup_name, gidを持ってます。
titleはdocument毎にバラバラ、group_nameはgidと1:1です。

gidごとのデータを現状は、ヒット件数の降順でソートしてるけど、タイトルの昇順?降順?でリストをソートしたい?

すいません、正確にはタイトルではないですね。
group_nameの昇順と降順でソートしようとしています。

top_hits aggsを試すために、まずは数値型でソートしてみた次第です。

@johtani
Copy link

johtani commented Jul 23, 2014

一番単純な感じだと、gidじゃなくてgroup_nameをキーにしてみて、_termで並べる感じでしょうか。
その場合は、gidが取れないけど。

@shoito
Copy link
Author

shoito commented Jul 23, 2014

ほぼ、それでOKだと思うんですがgroup_nameは異なるgidで被ることも...(くっ

@shoito
Copy link
Author

shoito commented Jul 24, 2014

johtaniさんのヒントにscriptを使ってみたけど、こうかな!?

      "terms": {
        "script": "doc['group_name.raw'].value + "doc['gid'].value"",
        "order": {
          "_term": "asc"
        }
      },

パフォーマンス的にどうなんだろう...

@johtani
Copy link

johtani commented Jul 24, 2014

事前にソート用かaggs用にそのデータを入れておくと幸せかもですね。
良さそうな手を思いつかなくて。。。

@shoito
Copy link
Author

shoito commented Jul 25, 2014

おぉー、ありがとうございます。
確かに事前にソート兼aggs用のフィールドを作っておくのがベターな気がしますね。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment