对ES官网的reference的翻译,同时也是备忘,ES版本为7.5

下面是正文翻译,附上原文链接:

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-scripted-metric-aggregation.html

==================================================================================================

脚本式指标聚合

使用脚本来提供指标输出的指标聚合。

例子(init_script为可选参数,其他参数都是必须填写的):

curl http://host_ip:host_port/ledger/_search?pretty
-H 'content-type: application/json'
-d '{"size": 0,"query": {"match_all": {}}"aggs": {"profit":{"scripted_metric": {"init_script" : "state.transactions = []", "map_script" : "state.transactions.add(doc.type.value == 'sale' ? doc.amount.value : -1 * doc.amount.value)","combine_script" : "double profit = 0; for (t in state.transactions) { profit += t } return profit","reduce_script" : "double profit = 0; for (a in states) { profit += a } return profit"}}}
}'

上面的聚合证实了我们可以如何使用脚本聚合从销售额和开销中计算总盈利。

上面的聚合的响应:

{"took": 218,..."aggregations": {"profit": {"value": 240.0}}
}

上面的例子也能使用保存的脚本(init、map和combine脚本用到的参数必须要在全局的params对象中指明,这样能够保证参数可以在脚本之间共享):

curl http://host_ip:host_port/ledger/_search?pretty
-H 'content-type: application/json'
-d '{"size": 0,"aggs": {"profit": {"scripted_metric": {"init_script" : {"id": "my_init_script"},"map_script" : {"id": "my_map_script"},"combine_script" : {"id": "my_combine_script"},"params": {"field": "amount" },"reduce_script" : {"id": "my_reduce_script"}}}}
}'

关于脚本更多详细的内容可以参考脚本文档。

允许的返回类型

尽管在单个脚本内可以使用任意有效的脚本对象,但脚本在state对象中返回或存储的必须是以下类型:

1)原始类型

2)字符串

3)map(只包含列举在此处的4种类型的key和value)

4)array(只包含列举在此处的4种类型的元素)

脚本的范围

脚本式指标聚合在它执行过程的4个阶段中使用下面几类脚本:

init_script

在文档的任意collection开始之前执行。允许聚合建立任意初始状态。

在上面的例子中,init_script在state对象中创建了一个array transactions

map_script

对每个被收集的文档都执行一次,该脚本为必备脚本。如果没有定义combine_script,由map_script生成的结果需要被存储在state对象中。

在上面的例子中,map_script检查type字段的值,如果type的值为sale,那么amount字段的值被添加到transaction数组中,如果type的值不是sale,那么amount字段的负值被添加到transaction数组中。

combine_script

当文档收集过程完成之后,每个分片都会执行一次combine_script.这个脚本是必须的,它允许聚合合并从每个分片返回的状态。

在上面的例子中,combine_script遍历所有存储好的transactions中并将profit变量中的值累加最终返回profit。(可以理解为上面三个script都是在分片内部进行的,但map_script都是针对文档的粒度,而combine_script是聚合分片内部每个文档的结果)

reduce_script

当所有的分片都返回结果之后会在coordinating节点执行一次reduce_script,这个脚本是必须的。reduce_script对变量states拥有访问权限,states变量是保存有每个分片combine_script结果的数组。

在上面的例子中,reduce_script遍历由每个分片返回的profit并在返回最终的profit值(会在聚合的响应中返回)之前对这些返回值进行累加。

例子

想象你把下面的文档存储到有2个分片的索引:

curl -X PUT "host_ip:host_port/transactions/_bulk?refresh&pretty"
-H 'Content-Type: application/json'
-d'{"index":{"_id":1}}{"type": "sale","amount": 80}{"index":{"_id":2}}{"type": "cost","amount": 10}{"index":{"_id":3}}{"type": "cost","amount": 30}{"index":{"_id":4}}{"type": "sale","amount": 130}
'

假如文档1和3在分片A上,文档2和4在分片B上,下面是每个阶段的聚合结果的具体分析。

在init_script之前

state被初始化为新的空对象:

"state": {}

在init_script之后

在每个分片上,文档收集过程执行之前,init_script都会运行一次,我们在每个分片上都会有一个拷贝:

分片A:

"state" : {"transactions" : []
}

分片B:

"state" : {"transactions" : []
}

在map_script之后

每个分片会收集文档并在每个收集的文档上运行map_script:

分片A:

"state" : {"transactions" : [ 80, -30 ]
}

分片B:

"state" : {"transactions" : [ -10, 130 ]
}

在combine_script之后

当文档收集过程完成之后,combine_script在每个分片上执行,并通过把transaction数组中的值累加来把所有的transactions降维成单个profit数字传递给coordinating节点:

分片A

50

分片B

120

在reduce_script之后

reduce_script接收states数组(由每个分片的conbine script的结果组成):

"states" : [50,120
]

reduce_script将每个分片的响应减少为一个最终的profit值(通过累加响应值)并将最终的这个profit值作为聚合的结果返回:

{..."aggregations": {"profit": {"value": 170}}
}

其他的参数

params

可选参数。params对象的内容会作为变量传递给init_script, map_script和combine_script。这种用途能够允许用户控制聚合的行为以及保存脚本间的状态。如果params没有定义的话,默认行为表示如下:

"params" : {}

空的桶

如果脚本式指标聚合的父桶没有收集任何文档的话,空的聚合响应(null值)会从分片中返回。在这种情况下,reduce_script的states变量会包含null作为从这个分片返回的响应。因此reduce_script应该预料并处理null响应的情况。

ES官网reference翻译文章(19)—Scripted Metric Aggregation相关推荐

  1. Away3D 4.0官网教程(翻译)

    使用Away3D 4.Stage3D 创建3D游戏和应用程序 (此帖每天都会更新,一定让大家完全的搞明白) 补充区:        'vase.awd' 可以使用 Prefab3D打开(在帖子后面回复 ...

  2. Godot官网新闻翻译 - 2014年

    本文是"Godot官网新闻翻译"系列的第1篇,该系列旨在翻译和汇总Godot官网所发布的所有新闻.让更多英文不好的童鞋可以领悟官方新闻中的重要信息和真谛. 官网新闻地址:https ...

  3. 举个栗子说明elasticsearch 的 scripted metric aggregation

    说明scripted metric aggregation 的用法. POST /dd/doc/_bulk?refresh {"index":{"_id":1} ...

  4. spark官网首页翻译

    官网:http://spark.apache.org/ Download(下载)   Libraries(SQL And DataFrame.Spark Streaming.MLlib.Third-P ...

  5. Python3数据分析——NumPy快速入门教程(官网教程翻译)

    目录 一.基础篇 1.创建数组 2.打印数组 3.基本运算 4.通用函数(ufunc) 5.索引,切片和迭代 二.形状操作 1.更改数组的形状 2.组合(stack)不同的数组 3.将一个数组分割(s ...

  6. 谷歌补丁Android官网,谷歌已发布 19年12月 Android 安全补丁

    中关村在线消息:今日据悉,谷歌已为最新版的 Android 10 移动操作系统系列发布了 2019 年 12 月的 Android 安全补丁,解决一些最关键的安全漏洞. 谷歌已发布 19年12月 An ...

  7. Jackson——来自官网的翻译

    2019独角兽企业重金招聘Python工程师标准>>> 在Java平台(StAX, JAXB等)XML处理质量和多样化的激励下,Jackson为多功能的Java JSON处理包其目标 ...

  8. android之Fragment(官网资料翻译)三

    与Activity通信 尽管Fragment被实现为一个独立于Activity的对象,并且可以在多个activity中使用,但一个给定的fragment实例是直接绑定到包含它的activity的. 特 ...

  9. OSG官网——GettingStarted翻译

    Getting Started开始 Follows is a quick step by step guide to helping new OpenSceneGraph users get up t ...

最新文章

  1. Plugin with id 'com.novoda.bintray-release' not found.的解决方案
  2. python难不难学-超级适合新手学习的python教程,入门其实不难?
  3. 使用squid配置透明代理并对上网行为进行控制
  4. Python编程核心内容 ---- Function(函数)
  5. SQL update select结合语句详解及应用
  6. gitkraken把github上的东西clone到本地
  7. python可以自学编程吗-编程学习第一步,让你20天搞定Python编程
  8. 46.网络安全与主机基本防护:限制端口、网络升级与 SELinux
  9. 学习Linux的决心书
  10. 《纳什均衡与博弈论》纳什博弈论及对自然法则的研究
  11. 如何对工厂设备进行精准化管理?
  12. 品牌对比 | 佰草集 VS 膜法世家
  13. 机器学习对我们生活的改变
  14. C语言二级题库(卷一)
  15. 一文详解窄脉冲LIV测试系统的特点和功能
  16. Map--HashMap实现分析
  17. s7300的db块详细说明_西门子db数据块详解
  18. 使用java的milo框架访问OPCUA服务的方法
  19. HTTP常见状态码:400\500 错误代码
  20. 华为手机配什么蓝牙耳机好?适合华为手机的蓝牙耳机推荐

热门文章

  1. 计算机网络 常见网卡信息
  2. 深度视觉基础(一)——RGB-D
  3. 基于计算的蛋白质复合物预测方法综述
  4. solidity学习记录4 (函数的初步入门)
  5. 慕课张鑫旭,笔记之line-height的定义
  6. C++8种常见类类型
  7. 教你如何下载win10和win11离线更新包,方便快捷并且是官方网站
  8. android 6 videoview,Android使用VideoView进行视频播放
  9. calicoctl命令简介
  10. 从零开始搭建轻量级个人XSS平台(BlueLotus_XSSReceiver-master蓝莲花)