主要讲解的内容: 部分更新,包括_update和script脚本两种方式
1、基于_update的partial update
1.1、_update实战
每次就传递少数几个发生修改的field即可,不需要将全量的document数据发送过去
#伪代码
POST index/_update/id
{
"doc": {
"field":"data"
}
}
更新示例:
POST test_index/_update/7
{
"doc": {
"title":"xiaomi"
}
}
1.2、实现原理以及其优点
ES内部对partial update的实际执行,跟传统的全量替换方式,是几乎一样的
1、内部先获取document
2、将传过来的field更新到document的json中
3、将老的document标记为deleted
4、将修改后的新的document创建出来
partial update相较于全量替换的优点
1、所有的查询、修改和写回操作,都发生在es中的一个shard内部,避免了网络数据传输的开销(减少2次网络请求) , 大大提升了性能。
2.减少了查询和修改中的时间间隔,可以大大减少并发冲突的情况。
2、基于script脚本的partial update
2.1、基于内部脚本的更新字段
通过脚本更新制定字段,其中ctx是脚本语言中的一个执行对象,先获取_source,再修改price字段
POST /ecommerce/_update/1
{
"script": {
"source": "ctx._source.price += params.price",
"params": {
"price": 4
}
}
}
2.2、基于外部脚本的更新
在 ES安装目录/config/scripts目录下创建groovy文件 ( 该方法已过时了)
使用 _script在ES中创建脚本ecommerce_add_tags
POST _scripts/ecommerce_add_tags
{
"script": {
"lang": "painless",
"source": "ctx._source.price += params.price"
}
}
_scripts脚本的简单管理
查看:GET _scripts/ecommerce_add_tags
删除:DELETE _scripts/ecommerce_add_tags
使用id引用外部脚本更新document
POST /ecommerce/_update/1
{
"script": {
"id": "ecommerce_add_tags",
"params": {
"price": 6
}
}
}
添加字段
与修改字段类似
POST ecommerce/_update/1
{
"script": {
"source": "ctx._source.add=34"
}
}
删除字段
POST ecommerce/_update/1
{
"script": {
"source":"ctx._source.remove(\"add\")"
}
}
删除文档
POST /ecommerce/_update/1
{
"script": {
"source": "ctx.op = ctx._source.price == params.price ? 'delete' : 'none'",
"params": {
"price": 66
}
}
}
3、upsert 操作
如果指定的document不存在,就执行upsert中的初始化操作;
如果指定的document存在,就执行doc或者script指定的partial update操作
POST /ecommerce/_update/1
{
"doc": {
"price": 1
},
"upsert": {
"name": "jiajieshi yagao",
"desc": "youxiao fangzhu",
"price": 25,
"producer": "jiajieshi producer",
"tags": [
"fangzhu"
]
}
}
相对于之前的使用upsert中的内容添加到不存在的文档,使用doc_as_upsert可以在文档不存在的时候,把doc中的内容插入到文档中。
POST /ecommerce/_update/8
{
"doc": {
"price": 1
},
"doc_as_upsert": true
}
注意
更新操作是不支持外部版本号
partial update内置乐观锁并发控制,代码如下:
POST /ecommerce/_update/1?if_seq_no=38&if_primary_term=4
{
"script": {
"id": "ecommerce_add_tags",
"params": {
"price": 66
}
}
}
参考文章:
ES 27 - Elasticsearch的脚本使用实践 - 瘦风 - 博客园 https://www.cnblogs.com/shoufeng/p/11360177.html
Elasticsearch增删改查 之 —— Update更新 - xingoo - 博客园 https://www.cnblogs.com/xing901022/p/5330778.html
How to use scripts | Elasticsearch Reference [7.x] | Elastic https://www.elastic.co/guide/en/elasticsearch/reference/7.x/modules-scripting-using.html
Painless API Reference | Painless Scripting Language [7.x] | Elastic https://www.elastic.co/guide/en/elasticsearch/painless/7.x/painless-api-reference.html#painless-api-reference
网友评论