Elasticsearch系列---增量更新原理及优势 (2)

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架构社区

Java架构社区

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzfzz.html