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

Rez*_*man 4 lucene search full-text-search elasticsearch

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

{
            'aggs' : {
                'guilds' : {
                    'terms' : {
                        'field' : 'guilds.title.original',
                        'order' : [{'max_score' : 'desc'}],
                        'aggs' : {
                            'max_score' : {
                                'script' : 'doc.score'
                            }
                        }
                    }
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

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

{
        'order' : [{'max_score' : 'desc'}, {"_count" : "desc"},
    }
Run Code Online (Sandbox Code Playgroud)

第二种不起作用.例如,当所有分数相等时,它应该基于查询排序,但它不起作用.

Tho*_*man 8

作为对Andrei答案的修正......按照多个标准对聚合进行排序,您必须创建一个数组,如术语聚合:订单,您必须使用ElasticSearch 1.5或更高版本.

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

正如安德烈有它,ES不会抱怨,但将使用"命令"元素中列出的最后一个项目.


And*_*fan 7

我不知道你的'aggs'是如何工作的,因为我尝试了它并且我在三个地方解析了错误:"order"不允许有那个数组结构,你的第二个"aggs"应该放在第一个"术语"aggs,最后,"max_score"aggs应该有一个"最大"类型的"aggs".在我的情况下,为了使它工作(它确实正确地命令),它应该如下所示:

  "aggs": {
    "guilds": {
      "terms": {
        "field": "guilds.title.original",
        "order": {
          "max_score": "desc", 
          "_count": "desc"
        }
      },
      "aggs": {
        "max_score": {
          "max": {
            "script": "doc.score"
          }
        }
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

  • Andrei - 在尝试你上面的建议时,我发现ES只是根据"order"元素中的最后一项执行排序.对于我的场景,我想订购一个"排名"字段(其中术语之间将存在"联系"),然后我希望通过最佳平均doc分数对其进行子排序.我最后指定的那两个"订单"中的哪一个就是它所使用的.我没有看到任何子订单条款的方法. (2认同)