之前没有用过es直接上手的 如若有错误请指正
背景:新增数据界面可以单个录入,也可以批量录入。同事图简单,数据录入后,无论单个录入还是批量录入都使用BulkProcessor 进行批量处理
BulkProcessor bulkProcessor = esProcessor.getBulkProcessor();
bulkProcessor.add(new IndexRequest(esname_EN).source(JSONObject.toJSonString(data), XContentType.JSON));
。该方法确实没问题,但是代码执行后会有几秒的反应时间,用户体验不是很好。于是更改了需求,数据插入更新,界面需要实时显示。
开始:
插入更新使用同一个方法,所以一开始查看了官网的方法。
IndexRequest indexRequest = new IndexRequest("index", "type", "1")
.source(jsonBuilder()
.startObject()
.field("name", "Joe Smith")
.field("gender", "male")
.endObject());
new 部分可以封装成:
XContentBuilder builder = XContentFactory.jsonBuilder().startObject();
//document是新增或者修改该条数据的全量数据
Map
//for循环将所有字段加入builder
for (String key : document .keySet()) {
builder.field(key, document .get(key));
}
builder.endObject();
// index指esdb,type指_doc,1指_id,官网写法
//IndexRequest indexRequest = new IndexRequest("index", "type", "1");
//但是在我的项目中实际是IndexRequest indexRequest = new IndexRequest("esdb", "_doc", "ev2_K30BoZQ27hu-lMdk");
//id这里有坑,后面再说
IndexRequest indexRequest = new IndexRequest("index", "type", "1");
indexRequest .source(builder);
UpdateRequest updateRequest = new UpdateRequest("index", "type", "1");
updateRequest .doc(builder).upsert(indexRequest);
//发送请求
restHighLevelClient.update(updateRequest , RequestOptions.DEFAULT);
该方法确实可以立马更新数据,但是无法自由自动新增!
IndexRequest indexRequest = new IndexRequest("index", "type", "ev2_K30BoZQ27hu-lMdk");
第三个参数id必须指定!这就很不科学了,索引id一般自动生成,也可以自己定义id自增规则,但是除了特殊要求,一般用自带的就行了。
因为无法自由自动新增就舍弃了这个方法。
换为:先删除,再新增:代码如下:
ids用于查询数据库数据,arcTableName是该条数据的表名。
restHighLevelClient框架自动配置好了
public AjaxResult updateByIdsAndTablename2(Listids, String arcTableName) { AjaxResult res = new AjaxResult(); res.put("message", "更新成功!"); res.put("code", 0); List



