聚合 #
Easysearch 不仅用于搜索。聚合功能利用 Easysearch 强大的分析引擎来分析数据并从中提取统计信息。
Easysearch 可以在毫秒内对海量数据集进行聚合。与查询相比,聚合会消耗更多的 CPU 周期和内存。
关于文本字段上的聚合 #
默认情况下,Easysearch 不支持对文本字段进行聚合。因为文本字段会被分词,所以对文本字段进行聚合时必须将分词过程逆向转换回原始字符串,然后基于此进行聚合。这种操作会消耗大量内存并降低集群性能。
虽然可以通过在映射中将 fielddata 参数设置为 true 来启用对文本字段的聚合,但这些聚合仍然基于分词后的单词,而不是原始文本。
我们建议保留文本字段的原始版本作为 keyword
字段,以便进行聚合。
在这种情况下,可以对 title.raw 字段进行聚合,而不是对 title 字段进行聚合:
PUT movies
{
"mappings": {
"properties": {
"title": {
"type": "text",
"fielddata": true,
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
聚合的基本结构 #
聚合查询的结构如下:
GET _search
{
"size": 0,
"aggs": {
"NAME": {
"AGG_TYPE": {}
}
}
}
如果只对聚合结果感兴趣,而不关心查询结果,则将 size
设置为 0。
在 aggs
属性(如果想使用的话,可以使用 aggregations
)中,可以定义任意数量的聚合。每个聚合由其名称和 Easysearch 支持的一种聚合类型定义。
聚合的名称有助于在响应中区分不同的聚合。 AGG_TYPE
属性用于指定聚合的类型。
聚合类型 #
主要有三种聚合类型:
- 指标聚合 - 计算数值字段上的指标,如 sum 、 min 、 max 和 avg 。
- 分组聚合 - 根据某些标准将查询结果分组分组。
- 管道聚合 - 将一个聚合的输出作为另一个聚合的输入。
嵌套聚合 #
嵌套聚合或子聚合是指在聚合内部进行的聚合。
指标聚合生成简单的结果,不能包含嵌套聚合。
分组聚合生成文档的组,可以在其他聚合中嵌套。通过在分组聚合内部嵌套指标和分组聚合,可以对数据进行复杂的分析。
通用的嵌套聚合语法 #
{
"aggs": {
"name": {
"type": {
"data"
},
"aggs": {
"nested": {
"type": {
"data"
}
}
}
}
}
}
内层 aggs
关键字开始一个新的嵌套聚合。父聚合和嵌套聚合的语法相同。嵌套聚合在前一个父聚合的上下文中运行。
还可以将聚合与搜索查询配对,以便在聚合之前缩小分析范围。如果不添加查询,Easysearch 会隐式使用 match_all 查询。
限制 #
由于聚合器会使用 double
数据类型处理所有值, long
值在 2^53 及以上均为近似值。