在 Elasticsearch 中,其实是有个内置的脚本支持的,可以基于 groovy 脚本实现各种各样的复杂操作,我们只需要将脚本放在 Elasticsearch 的 script 目录下。
同时,Elasticsearch 的 groovy 脚本还支持内置脚本和外置脚本两种形式,但高版本的 Elasticsearch 已经将外置脚本的方式去除了,因此,不推荐使用。
POST indexname/_update/id { "script" : "ctx._source.field = value" }
参数 | 描述 |
---|---|
indexname | 需要更新的索引名 |
id | 需要更新的文档 id |
script | 说明我们使用内置脚本 |
ctx | 固定的语法 |
_source | 代表源数据的集合 |
field | 需要更新的字段 |
value | 需要将字段设置的值 |
这是内置脚本固定的写法,ctx 代表上下文,_source 代表数据源对象,我们通过该对象可以获取整个数据源,filed 是我们需要修改的字段,value 是我们需要更新的值。
POST indexname/_update/id { "script": { "lang": "groovy", "file": "script-filename", "params": { "key": "value" } } }
参数 | 描述 |
---|---|
indexname | 需要更新的索引名 |
id | 需要更新的文档 id |
lang | 通过 lang 指定脚本类型 |
file | 脚本名 |
value1 | 将字段更新为的值 |
params | 指定脚本需要使用的参数列表 |
key | 参数的键 |
value | 参数的值 |
通过 lang 指定了我们使用的脚本语言,通过 file 指定脚本路径,通过 params 指定脚本使用的参数。同时,我们需要将脚本放在 es 的安装目录的 script 目录下。
我们在 Kibana 的控制台上,输入以下代码,新建一个文档:
PUT haicodernet/_doc/1 { "index":"www.haicoder.net", "name" : "javascript", "desc" : "javascript module", "categorys" : 5, "view_num":100, "author" : "jobs steven", "tags": [ "javascript", "vue" ] }
输入完成后,我们点击运行按钮,输出了最终的运行结果,如下图所示:
我们看到,此时我们创建文档成功了,现在,我们使用全局内置 groovy 脚本的方式,更新文档,具体代码如下:
POST haicodernet/_update/1 { "script" : "ctx._source.view_num += 1" }
更新成功后,如下图所示:
现在,我们查看该文档的内容,具体命令如下:
GET haicodernet/_doc/1
更新成功后,如下图所示:
我们看到,此时 view_num 字段的值已经被加上了 1,即,我们使用内置脚本的方式修改了数据。
我们在 Kibana 的控制台上,输入以下代码,新建一个文档:
PUT haicodernet/_doc/2 { "index":"www.haicoder.net", "name" : "javascript", "desc" : "javascript module", "categorys" : 5, "view_num":100, "author" : "jobs steven", "tags": [ "javascript", "vue" ] }
输入完成后,我们点击运行按钮,输出了最终的运行结果,如下图所示:
我们看到,此时我们创建文档成功了,现在,我们使用外置 groovy 脚本的方式,更新文档,我们首先在 Elasticsearch 安装目录的 script 路径下新建一个 update-2.groovy 的脚本,默认 script 目录不存在,我们使用 mkdir 命令创建该目录,具体命令如下:
mkdir /usr/local/elk/es/script
接着,我们使用 echo 命令,新建一个 update-2.groovy 脚本,并输入脚本内容,具体命令如下:
echo "ctx._source.view_num+=1" > /usr/local/elk/es/script/update-2.groovy echo "ctx._source.name=JavaScript" >> /usr/local/elk/es/script/update-2.groovy
执行完毕后,如下图所示:
现在,我们使用外置脚本,开始执行更新操作,具体命令如下:
POST haicodernet/_update/2 { "script": { "lang": "groovy", "file": "update-2", "params": { } } }
此时,就可以成功更新文档。
在 Elasticsearch 中,其实是有个内置的脚本支持的,可以基于 groovy 脚本实现各种各样的复杂操作,我们只需要将脚本放在 Elasticsearch 的 script 目录下。
同时,Elasticsearch 的 groovy 脚本还支持内置脚本和外置脚本两种形式,但高版本的 Elasticsearch 已经将外置脚本的方式去除了,因此,不推荐使用。