探究 | Elasticsearch Painless 脚本 ctx、doc、_source 的区别
上述问题不止一次被问到,我自己在使用 painless 脚本的时候,也会遇到上述困惑。
今天,我们把这几种的区别梳理清楚。
解读如下:
上面的脚本通过 ingest painless 脚本实现了判定:
上面的例子解读如下:
如果标签字段:tags 包含:“green”,则 执行删除操作;否则保持现状。
官方文档地址:
https://www.elastic.co/guide/en/elasticsearch/painless/7.15/painless-update-context.html
如上 reindex 脚本解读如下:
如果源索引:test-04 字段 foo 内容=‘bar’,则 reindex 后删除 ‘foo’ 字段 且 views 取值加 1 。
如上search 脚本解读如下:
对观看数 views 在检索的时候加了随机值。
官方文档:
https://www.elastic.co/guide/en/elasticsearch/painless/7.15/painless-field-context.html
举例如下:求字符串中的某子串,java 语法中的 substring 还能用吗?
如果使用:ingest processor 预处理方式,怎么查官方是否支持,我相信是大家关注的问题。
因为:支不支持可以试,但试是穷举的方式,时间复杂度为 O(n);
能查看官方明确说支持,是最快的方式,时间复杂度为O(1)。
对于我们程序员来说,怎么快,我们就怎么来。
来吧,一步步走一遍,其他复杂例子原理同。
上面脚本是借助 ingest pipelie 实现:取子串内容,源串为:“hello world”,取出后的子串为:“hello”。
核心步骤再结合上面的截图解释一下:
-步骤1:确认 string 类型支持取子串;
-步骤2:找到取子串的语法:substring;
-步骤3:通过 ingest 预处理方式实现取子串,借助 ctx 组合 substring 实现。
如上实例,借助 painless 脚本实现了获取日期类型数据的年份,是借助 getYear( ) 的函数实现的。
Painless 脚本在数据预处理、更新、reindex、获取字段方面应用广泛。
因业务场景的不同,脚本使用方式也会有不同。大家使用过程中要根据使用方式的不同,来决定ctx、doc、_source 的选型。
希望本文对你的脚本实战选型有所帮助,也欢迎留言交流你的脚本使用心得......