1、什么是partial update
put /index/_doc/id 进行创建文档和替换文档,就是一样的语法,
在对应的应用程序中,每次执行的流程是这样的
- 应用程序发起get请求,获取document在页面中展示,供用户查看和修改
- 在页面中修改数据,发送到后台
- 将用户在页面中修改的数据在内存中执行,然后封装好全量数据
- 让后发送put请求到es中进行全量替换
- es将老的document 标记为deleted ,然后重新创建一个新的document
partial updata就是post
POST /liang/_update/1{"doc": {"filed": "test2" #需要修改的filed,不需要全量的数据}}{"_index" : "liang","_type" : "_doc","_id" : "1","_version" : 7,"result" : "updated","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 6,"_primary_term" : 1}
2、partial update的实现原理和优点
partial updata 和全量替换相比较的优点
1、所有的查询,修改和写回操作,都发生在es的内部,避免了网络传输数据的开销,大大提升性能
2、减少了查询和修改中的时间间隔,可以有效减少并发冲突的情况
3、基于painless实现partial update操作
es存在内置脚本支持,可以基于groovy脚本实现各种各样复杂的操作的 ~~基于groovy脚本如何执行partial update~~
基于painless实现partial update操作
(1)内置脚本
(1)准备数据PUT /partial/_doc/1{"num": 0,"tags":[]}(2)内置脚本(将字段num+1)POST /partial/_update/1{"script": "ctx._source.num+=1"}GET /partial/_doc/1{"_index" : "partial","_type" : "_doc","_id" : "1","_version" : 2,"_seq_no" : 1,"_primary_term" : 1,"found" : true,"_source" : {"num" : 1,"tags" : [ ]}}(3)外部脚本在es的_script创建ecommerce_add_tagsPOST _scripts/ecommerce_add_tags{"script":{"lang":"painless","source":"ctx._source.num += params.new_num"}}GET _scripts/ecommerce_add_tags #查询脚本使用id引用外部脚本更新documentPOST /partial/_update/1{"script": {"id":"ecommerce_add_tags","params": {"new_num":3}}}(4)用脚本删除文档POST _scripts/delete_document{"script":{"lang": "painless","source": "ctx.op = ctx._source.price == params.num ? 'delete' : 'none'"}}POST /partial/_update/1{"script": {"id":"delete_document","params": {"new_num":3}}}(5)upsert如果指定的document不存在,就执行upsert中的初始化操作;如果指定的document存在,就执行doc或者script指定的partial update操作
4、partial update乐观锁并发控制

