关于ES只更新少量数据,不批量处理

之前没有用过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<object,object> document = esIndexApiService.getDocument(arcTableName, id);

//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(List<String> ids, String arcTableName) {
        AjaxResult res = new AjaxResult();
        res.put("message", "更新成功!");
        res.put("code", 0);
        List<Map<String, Object>> datas = new ArrayList<>();
        List<Map<String, Object>> document = null;
        List<Map<String, Object>> maps = null;
        if (ids != null && ids.size() > 0) {
            for (String id : ids) {
                // 获取数据库数据
                String sql1 = "select * from " + arcTableName + " where id=" + id;
                maps = jdbcTemplate.queryForList(sql1);
                document = esIndexApiService.getDocument(arcTableName, id);
                if (maps != null && maps.size() > 0) {
                    datas.add(maps.get(0));
                }
            }
        }
        if (datas.size() > 0) {
            if (document.size() != 0) {
                //如果该条数据在索引存在,则先删除
                DeleteRequest deleteRequest = new DeleteRequest(esname_EN, document.get(0).get("_id").toString());
                try {
                    DeleteResponse delete = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
                } catch (IOException e) {
                    res.put("message", "更新失败!");
                    res.put("code", -1);
                    res.put("data", "数据库中未找到任何数据!");
                    e.printStackTrace();
                }
            }
            for (Map<String, Object> data : datas) {
                data.put("table_name", arcTableName);
                IndexRequest source = new IndexRequest(esname_EN).source(JSONObject.toJSONString(data), XContentType.JSON);
                try {
                    IndexResponse index = restHighLevelClient.index(source, RequestOptions.DEFAULT);
                } catch (IOException e) {
                    res.put("message", "更新失败!");
                    res.put("code", -1);
                    res.put("data", "索引新增失败!");
                    e.printStackTrace();
                }
            }
        }
        return res;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值