赞
踩
本篇开发环境基于上篇,客户端client使用rest风格的高等级(high level)API,这节我们来讲下ES的批量插入或更新操作。
这里先提个概念,存在则更新。ES是以_id来作为doc的唯一键的,等同于主键,但它没有像关系型数据库的索引,不过我们开始可以利用_id来实现我们唯一索引的目的。当有多个字段需作为唯一键时,我们可以利用hash的方式生成一个唯一id,es支持自定义id值,这样就可以实现唯一索引了。
批量操作需要使用bulk api。代码中的IndexRequest允许两张操作类型DocWriteRequest.OpType.CREATE
(新增操作)和DocWriteRequest.OpType.INDEX
(存在则替换)
@Autowired
private RestHighLevelClient highLevelClient;
public void bulkTest() throws IOException {
BulkRequest request = new BulkRequest();
request.add(new IndexRequest("posts").id("1")
.source(XContentType.JSON,"field", "foo"));
request.add(new IndexRequest("posts").id("2")
.source(XContentType.JSON,"field", "bar").opType(DocWriteRequest.OpType.CREATE));
highLevelClient.bulk(request, RequestOptions.DEFAULT);
}
由于IndexRequest不能实现我们的需求,所以存在则修改操作还需要借助UpdateRequest来实现。但是普通UpdateRequest请求只能修改存在的doc,所以还需要寻找其他方法,我们在文档中找到upsets,该方法的描述是:
If the document does not already exist, it is possible to define some
content that will be inserted as a new document using the upsert
method
所以我们可以利用这个方法来实现插入批量插入或更新。数据量较大时可以使用bulkAsync异步插入,这里演示使用同步方式。
public void bulkUpdate() throws IOException {
BulkRequest request = new BulkRequest();
request.add(new UpdateRequest("sign1","1").doc(XContentType.JSON, "name", "tom").upsert());
request.add(new UpdateRequest("sign1","1").doc(XContentType.JSON, "name", "bob", "age", 10).upsert());
highLevelClient.bulk(request, RequestOptions.DEFAULT);
}
执行后可以看到_id为1的文档,name被替换了,age也添加了
下节我们来看下最新的Elasticsearch7如果利用jdbc实现sql方式查询,网上的很多用例版本都比较久,测试起来bug也较多。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。