美文网首页
Elasticsearch 聚合后排序 --- 2022-04-

Elasticsearch 聚合后排序 --- 2022-04-

作者: 一位先生_ | 来源:发表于2022-05-30 23:05 被阅读0次

    类似terms、histogram、date_histogram这类桶聚合都会动态生成多个桶,如果生成的桶特别多,我们如何确定这些桶的排序顺序,如何限制返回桶的数量。

    1.多桶排序

    默认情况,ES会根据doc_count文档总数,降序排序。

    ES桶聚合支持两种方式排序:

    • 内置排序
    • 按度量指标排序

    1.1. 内置排序

    内置排序参数:

    • _count - 按文档数排序。对 terms 、 histogram 、 date_histogram 有效
    • _term - 按词项的字符串值的字母顺序排序。只在 terms 内使用
    • _key - 按每个桶的键值数值排序, 仅对 histogram 和 date_histogram 有效

    例子:

    GET /cars/_search
    {
        "size" : 0,
        "aggs" : {
            "colors" : { // 聚合查询名字,随便取一个
                "terms" : { // 聚合类型为: terms
                  "field" : "color", 
                  "order": { // 设置排序参数
                    "_count" : "asc"  // 根据_count排序,asc升序,desc降序
                  }
                }
            }
        }
    }
    

    1.2. 按度量排序

    通常情况下,我们根据桶聚合分桶后,都会对桶内进行多个维度的指标聚合,所以我们也可以根据桶内指标聚合的结果进行排序。

    例子:

    GET /cars/_search
    {
        "size" : 0,
        "aggs" : {
            "colors" : { // 聚合查询名字
                "terms" : { // 聚合类型: terms,先分桶
                  "field" : "color", // 分桶字段为color
                  "order": { // 设置排序参数
                    "avg_price" : "asc"  // 根据avg_price指标聚合结果,升序排序。
                  }
                },
                "aggs": { // 嵌套聚合查询,设置桶内聚合指标
                    "avg_price": { // 聚合查询名字,前面排序引用的就是这个名字
                        "avg": {"field": "price"} // 计算price字段平均值
                    }
                }
            }
        }
    }
    

    2.限制返回桶的数量

    如果分桶的数量太多,可以通过给桶聚合增加一个size参数限制返回桶的数量。

    例子:

    GET /_search
    {
        "aggs" : {
            "products" : { // 聚合查询名字
                "terms" : { // 聚合类型为: terms
                    "field" : "product", // 根据product字段分桶
                    "size" : 5 // 限制最多返回5个桶
                }
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Elasticsearch 聚合后排序 --- 2022-04-

          本文链接:https://www.haomeiwen.com/subject/hinfsrtx.html