关于elasticsearch5.6版本的upsert文档操作总结
一.upser在ealsticsearch中的概念
1.elasticsearch中upsert文档和其他数据库相同,当文档存在时只更新修改的数据,而做到不影响其他字段的值,索引中不存在该文档时就生成文档
二.curl请求直接操作elasticsearch中文档示例
curl --location --request POST 'http://ip:port/{indexName}/{type}/{id}/_update' \
--header 'Content-Type: application/json' \
--data-raw '{
"doc": {
"mobile-ngram": "13113605053",
"userStatus": "APPLY",
"nickName": "谭军",
"userRealName": "谭军",
"mobile": "13113605053",
"userName": "谭军",
"userId": "b8bd202b-add9-11e4-9273-dc8e3044c615",
"network": "13568333",
"createTime": "2015-02-06 16:55:16",
"personId": "5ef2f78f9e2c49c8d3c24507",
"id": "5ef2f78f9e2c49c8d3c24507",
"userType": "COMMON",
"networkType": "COMPAsNY",
"status": "s44"
},
"doc_as_upsert": true
}'
ip | elasticsearch集群地址中的一个 |
---|---|
port | elasticseasrch集群http端口 |
indexName | 索引名 |
type | 文档类型,elasticsearch7.0后默认_doc |
id | 文档id |
doc_as_upsert | 文档是否为存在更新,不存在修改 |
上述文档最重要的一点就是将操作的字段用doc封装起来,然后在请求体外标明是否存在更新,不存在修改。
三.单条upsert更新java代码示例
1.创建一个indexRequest对象指定索引名,类型,和文档id
IndexRequest indexRequest = new IndexRequest(index, type, id);
2.将需要修改的字段放进source里面,这里的ma可以是map,json,string,以及xtContentBuilder对象
indexRequest.source(map);
3.创建一个updateRequest对象指定索引名,类型,id,然后将indexRequest传入upsert方法中
UpdateRequest updateRequest = new UpdateRequest(index, type, id).upsert(indexRequest);
4.再将indexRequest放入doc中,猜测实际做了两次修改
updateRequest.doc(indexRequest);
5.最后发送请求
UpdateResponse updateResponse= esClient.update(updateRequest).get();
四.批量upsert更新java代码示例,此方法和http请求一致
1.创建updateRequest请求,设置索引名和元素类型还有id,将修改的字段放进doc中,此处json为一map
UpdateRequest updateRequest = new UpdateRequest(index, type, id).doc(json);
2.设置updateRequest不存在创建,存在修改为true
updateRequest.docAsUpsert(true);
3.创建一个批量提交的执行器省略回调方法
BulkProcessor bulkprocessor=BulkProcessor.builder(esClient, new BulkProcessor.Listener());
4.向批量执行器中添加请求
bulkprocessor.add(updateRequest);
五.总结
由于公司存在一种场景修改部分字段,但是不能影响到原有的字段,如果不存在的话就创建,存在就更新传递过来的字段,当时试错好多种没有找到合适的方式,老是报错,后面在google上搜索然后调试出来,由于资料较少,特编写文档,一起进步