“ElasticSearch聚合分析:多桶排序(聚合后排序)”的版本间差异
跳到导航
跳到搜索
(建立内容为“category:ElasticSearch == 关于 == <syntaxhighlight lang="JSON" highlight=""> </syntaxhighlight>”的新页面) |
小无编辑摘要 |
||
(未显示同一用户的1个中间版本) | |||
第1行: | 第1行: | ||
[[category: | [[category:ElasticSearch教程]] | ||
== 关于 == | == 关于 == | ||
类似 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> |
2023年3月31日 (五) 22:02的最新版本
关于
类似 terms、histogram、date_histogram 这类桶聚合都会动态生成多个桶,如果生成的桶特别多,我们如何确定这些桶的排序顺序,如何限制返回桶的数量。
多桶排序
默认情况,ES 会根据 doc_count 文档总数,降序排序。
ES 桶聚合支持两种方式排序:
- 内置排序
- 按度量指标排序
内置排序
内置排序参数:
- _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个桶
}
}
}
}