Elasticsearch在聚合列表中进行两级排序

时间:2014-10-16 09:02:55

标签: search lucene elasticsearch full-text-search

目前我正在按文档分数对聚合进行排序,因此大多数相关项目首先出现在聚合列表中,如下所示:

{
            'aggs' : {
                'guilds' : {
                    'terms' : {
                        'field' : 'guilds.title.original',
                        'order' : [{'max_score' : 'desc'}],
                        'aggs' : {
                            'max_score' : {
                                'script' : 'doc.score'
                            }
                        }
                    }
                }
            }
        }

我想在我的JSON中为订单条款订单数组添加另一个排序选项。但是当我这样做时:

{
        'order' : [{'max_score' : 'desc'}, {"_count" : "desc"},
    }

第二种不起作用。例如,当所有分数相等时,则应根据查询进行排序,但不起作用。

2 个答案:

答案 0 :(得分:8)

作为对Andrei答案的修正...按多个标准订购聚合,您必须创建一个数组,如Terms Aggregation: Order所示,你必须是使用ElasticSearch 1.5或更高版本。

因此,对于Andrei的回答,更正是: "order" : [ { "max_score": "desc" }, { "_count": "desc" } ]

正如Andrei所说,ES不会抱怨,但使用“order”元素中列出的最后一项。

答案 1 :(得分:7)

我不知道你的' aggs'甚至工作,因为我尝试了它,我在三个地方解析错误:" order"不允许有这种阵列结构,你的第二个" aggs"应放在第一个"术语之外#34; aggs,最后是" max_score" aggs应该有一个" max" " aggs"的类型。在我的情况下,为了使它工作(并且它确实正确地命令),它应该如下所示:

  "aggs": {
    "guilds": {
      "terms": {
        "field": "guilds.title.original",
        "order": {
          "max_score": "desc", 
          "_count": "desc"
        }
      },
      "aggs": {
        "max_score": {
          "max": {
            "script": "doc.score"
          }
        }
      }
    }
  }