“ElasticSearch聚合分析:多桶排序(聚合后排序)”的版本间差异

来自Wikioe
跳到导航 跳到搜索
(建立内容为“category:ElasticSearch == 关于 == <syntaxhighlight lang="JSON" highlight=""> </syntaxhighlight>”的新页面)
 
无编辑摘要
第2行: 第2行:


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


== 多桶排序 ==
默认情况,ES 会根据 '''doc_count''' 文档总数,'''降序'''排序。
ES 桶聚合支持两种方式排序:
# '''内置排序'''
# '''按度量指标排序'''
=== 内置排序 ===
内置排序参数:
* '''_count''':按'''文档数'''排序;
*: 对 terms 、 histogram 、 date_histogram 有效。
* '''_term''':按'''词项的字符串值的字母顺序'''排序;
*: 只在 terms 内使用。
* '''_key''':按'''每个桶的键值数值'''排序;
*: 仅对 histogram 和 date_histogram 有效。
示例:
<syntaxhighlight lang="JSON" highlight="">
GET /cars/_search
{
    "size" : 0,
    "aggs" : {
        "colors" : { // 聚合查询名字,随便取一个
            "terms" : { // 聚合类型为: terms
              "field" : "color",
              "order": { // 设置排序参数
                "_count" : "asc"  // 根据_count排序,asc升序,desc降序
              }
            }
        }
    }
}
</syntaxhighlight>
=== 按度量指标排序 ===
通常情况下,我们根据桶聚合分桶后,都会对桶内进行多个维度的指标聚合,所以我们也可以根据桶内指标聚合的结果进行排序。
示例:
<syntaxhighlight lang="JSON" highlight="">
<syntaxhighlight lang="JSON" highlight="">
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字段平均值
                }
            }
        }
    }
}
</syntaxhighlight>
== 限制返回桶的数量 ==
如果分桶的数量太多,可以通过给桶聚合增加一个 '''size''' 参数限制返回桶的数量。


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

2021年5月21日 (五) 01:09的版本


关于

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

多桶排序

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


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

  1. 内置排序
  2. 按度量指标排序

内置排序

内置排序参数:

  • _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降序
              }
            }
        }
    }
}

按度量指标排序

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


示例:

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字段平均值
                }
            }
        }
    }
}

限制返回桶的数量

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


示例:

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