聚合操作 #
Easysearch 不仅仅是为了搜索。通过聚合,您可以利用 Easysearch 强大的分析引擎来分析数据并从中提取统计数据。
聚合的用例各不相同,从实时分析数据以采取某些操作,到使用 INFINI Console 来创建可视化仪表板。
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
属性是你指定聚合类型的地方。
用法举例 #
我们以电子商务数据和网络日志数据举例。
avg #
要找到 taxful_total_price
字段的平均值:
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"aggs": {
"avg_taxful_total_price": {
"avg": {
"field": "taxful_total_price"
}
}
}
}
返回示例 #
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4675,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"avg_taxful_total_price": {
"value": 75.05542864304813
}
}
}
响应中的聚合块显示了 taxful_total_price
字段的平均数值。
聚合类型 #
有三种主要的聚合类型:
- 指标 - 在数值字段上计算度量,如
sum
,min
,max
, 和avg
. - 分桶聚合 - 根据一些标准将查询结果分类到组。
- 管道聚合 - 将一个聚合的输出作为另一个聚合的输入。
嵌套聚合 #
聚合中的聚合被称为嵌套或子聚合。
指标聚合产生简单的结果,不能嵌套其他聚合
分桶聚合产生的文档子集桶,你可以嵌套在其他聚合中。你可以通过在分桶聚合中嵌套指标聚合和其它分桶聚合来对你的数据进行复杂分析。
嵌套聚合语法 #
{
"aggs": {
"name": {
"type": {
"data"
},
"aggs": {
"nested": {
"type": {
"data"
}
}
}
}
}
}
内部的 aggs
关键字开始一个新的嵌套聚合。父聚合和嵌套聚合的语法是一样的。嵌套聚合在前面的父聚合的上下文中运行。
你也可以将聚合与搜索一起使用,以缩小在聚合之前的分析范围。如果你不添加查询, Easysearch 会隐含地使用 match_all
查询。