【问题标题】:Elasticsearch two level sort in aggregation list聚合列表中的 Elasticsearch 二级排序
【发布时间】:2014-12-11 13:52:54
【问题描述】:

目前我正在按文档分数对聚合进行排序,因此最相关的项目排在聚合列表的首位,如下所示:

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

我想在我的 JSON 中向 order terms order 数组添加另一个排序选项。但是当我这样做时:

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

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

【问题讨论】:

    标签: search lucene elasticsearch full-text-search


    【解决方案1】:

    作为对 Andrei 答案的更正...要按多个标准对聚合进行排序,您必须创建一个数组,如 Terms Aggregation: Order 所示,并且您必须使用 ElasticSearch 1.5 或更高版本。

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

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

    【讨论】:

      【解决方案2】:

      我什至不知道你的 'aggs' 是如何工作的,因为我试过了,我在三个地方遇到了解析错误:“order”不允许有那个数组结构,你的第二个“aggs”应该放在外面第一个 "terms" 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"
                }
              }
            }
          }
        }
      

      【讨论】:

      • Andrei - 在尝试您上面的建议时,我发现 ES 只是根据“order”元素中的最后一项执行排序。对于我的场景,我想对“排名”字段(其中术语之间会有“关系”)进行排序,然后我想按最佳平均文档分数在这些字段中进行子排序。我最后指定的这两个“命令”中的哪一个都是它使用的。我没有看到任何对条款进行子排序的方法。
      • @ThomasDoman :我有完全相同的问题 - 排序发生在 rder 列表中的最后一项的基础上。你找到解决问题的方法了吗?谢谢!
      • @UD1989 - 我确实做到了,我的答案在下面以更正安德烈答案的形式出现。请务必点赞,谢谢!
      • @ThomasDoman:谢谢。不幸的是,我们的 elasticsearch 是一个托管应用程序,运行在 1.3.4 版本 sigh
      猜你喜欢
      • 2021-02-11
      • 2015-01-23
      • 2016-04-12
      • 2022-01-26
      • 2021-09-19
      • 2015-08-25
      • 1970-01-01
      • 2016-04-13
      • 2015-11-06
      相关资源
      最近更新 更多