【问题标题】:Sort aggregation buckets by shared field values按共享字段值对聚合桶进行排序
【发布时间】:2019-02-18 02:12:30
【问题描述】:

我想根据组字段 G 对文档进行分组。我使用 Elastic 文档中描述的“字段聚合”策略按包含文档的最大分数对存储桶进行排序(在 Elastic 中称为“字段折叠示例”) doc),像这样:

{
  "query": {
    "match": {
      "body": "elections"
    }
  },
  "aggs": {
    "top_sites": {
      "terms": {
        "field": "domain",
        "order": {
          "top_hit": "desc"
        }
      },
      "aggs": {
        "top_tags_hits": {
          "top_hits": {}
        },
        "top_hit" : {
          "max": {
            "script": {
              "source": "_score"
            }
          }
        }
      }
    }
  }
}

此查询还包括每个存储桶中的热门匹配。 如果桶的最大分数不是唯一的,我想指定一个二阶列。从应用程序上下文中我知道,在存储桶内,所有文档共享字段 F 的相同值。因此,该字段应用作二阶列。

如何在 Elastic 中实现这一点?有没有办法让顶部点击子聚合中的字段在封闭聚合中可用?

有什么想法吗?非常感谢!

【问题讨论】:

    标签: elasticsearch elasticsearch-aggregation


    【解决方案1】:

    看来你可以。在这个page 中列出了术语聚合的所有排序策略。

    它们是多标准桶排序的一个例子:

    可以使用多个标准来对存储桶进行排序,方法是提供 订单条件数组,如下所示:

    GET /_search
    {
        "aggs" : {
            "countries" : {
                "terms" : {
                    "field" : "artist.country",
                    "order" : [ { "rock>playback_stats.avg" : "desc" }, { "_count" : "desc" } ]
                },
                "aggs" : {
                    "rock" : {
                        "filter" : { "term" : { "genre" : "rock" }},
                        "aggs" : {
                            "playback_stats" : { "stats" : { "field" : "play_count" }}
                        }
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 其实我的情况有点不同。定义一系列订单列很简单。我的问题:如何访问当前存储桶的所有文档中某个字段的(公共)值进行排序?在上面的示例中,您根据艺术家所在的国家/地区对歌曲进行分组。假设您有一个额外的字段 artist.countryCode 存储国家的替代表示(这意味着 countryCode 对于共享国家值的所有文档具有相同的值)。我想按这个国家代码排序。如何访问此字段?
    猜你喜欢
    • 2020-02-21
    • 2021-01-30
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 2019-09-15
    • 1970-01-01
    相关资源
    最近更新 更多