id即创建脚本时的music-likes,params是固定写法,里面的参数为new_likes,执行后再查看document信息,可以看到likes field的值按传入的值进行累加,结果符合预期。
查看脚本命令:
GET _scripts/music-likes斜杠后面的参数即脚本ID
删除脚本命令:
DELETE _scripts/music-likes斜杠后面的参数即脚本ID
脚本注意事项ES检测到新脚本时,会执行脚本编译,并将它存储在缓存中,编译比较耗时。
脚本的编写能参数化的,就不要硬编码,提高脚本的复用性。
短时间内太多的脚本编译,如果超出了ES的承受范围,ES直接报circuit_breaking_exception错误,这个范围默认是15条/分钟。
脚本缓存默认100条,默认不设过期时间,每个脚本最大字符65535字节,想自行配置的话可以改script.cache.expire、script.cache.max_size和script.max_size_in_bytes参数。
一句话,提高脚本的复用性。
upsert语法像刚刚的案例,实现的是一个播放计数器的功能,目前这个计数器是与内容存储在一起,如果计数器单独存储,可能会出现新上架的一首歌,但计数器的document可能还不存在,试图对它做更新操作会报document_missing_exception错误,这种场景我们需要使用upsert语法:
POST /music/children/3/_update { "script" : "ctx._source.likes++", "upsert": { "likes": 0 } }如果id为3的记录不存在,第一次请求时,执行upsert里面的JSON内容,初始化一个新文档,ID为3,likes值为0;第二次请求时,文档已经存在,此时做script脚本的更新操作,likes自增。
小结本篇简单介绍了增量更新的过程与原理,并与全量替换做了简单的对比,针对一些简单的计数场景,引入脚本的实现方式案例,脚本可以实现很丰富的功能,具体可以查看官网对Painless的介绍。
专注Java高并发、分布式架构,更多技术干货分享与心得,请关注公众号:Java架构社区