ES BulkRequest 写入索引数据失败排查和解决

问题场景:1,使用BulkRequest写入索引数据不生效,接口正常返回,索引没有数据。

先看原始代码:

@Override
    public ResultMsg<String> saveRealtimeMsg(IMRealTimeMessageDTO imRealTImeMessageDTO) {

        try {
            //1.创建批量导入数据
            BulkRequest bulkRequest = new BulkRequest();
            String index = elasticSearchConfig.getImRealtimeIndex();
            //2.将数据批量添加
            for(IMRealTimeMessageEntity entity : imRealTImeMessageDTO.getResult()){
                entity.setId(RandomUtil.randomString(elasticSearchConfig.getUuIdStr(), 18));
                if (StringUtils.isEmpty(entity.getSessionId())) {
                    String sessionId = (String) JSONPath.read(entity.getCloudCustomData(), "sessionID");
                    if (StringUtils.isNotBlank(sessionId)) {
                        entity.setSessionId(sessionId);
                    }
                }

                bulkRequest.add(
                        new IndexRequest(index)
                                //不填id时将会生成随机id
                                .id(UUID.randomUUID().toString())
                                .source(JSON.toJSONString(entity), XContentType.JSON).type("_doc")
                );
            }
            //3.执行请求
            BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
            if(bulkResponse.status() != null && bulkResponse.status().getStatus()== HttpServletResponse.SC_OK){
                log.info("实时聊天消息es写入成功");
                return ResultMsg.ok("es数据同步!!!");
            }
            return ResultMsg.failed("es数据同步失败",bulkResponse.buildFailureMessage());

        } catch (Exception e) {
            e.printStackTrace();
            log.info("es data 同步失败:{}",e.getMessage());
            return ResultMsg.failed("es数据同步失败:{}",e.getMessage());
        }
    }

从代码层面来看写入数据是一点问题都没有的,我们接口也是200

 通过kinbana查看数据

数据也是没有的执行了操作也是没有反应。那怎么解决这个问题?

1,查看我们的索引mapping有没有问题,是不是索引的数据格式导致我们数据写入不进去,基本上百分之九十就是这个问题,但是我们的并不是。

 GET 索引/_mapping

如果上面没有问题我们就看代码的配置。

 经过断点调试查看代码:

我们的日期格式在es是yyyymmdd hhmmss格式但是这里是个时间蹉格式,肯定就不对了,但是你会说我jsonfamart也不行吗?

 

这样也不行,我序列化的时候tostring不行吗,答案是不行的,只有在序列化的时候转换一下。

2,注意这种方式是判断不了es写入成功失败,不能按照http方式去获取成功失败(底层也是通过http方式写入数据)

 

 
            BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
            if(bulkResponse.status() != null && bulkResponse.status().getStatus()== HttpServletResponse.SC_OK){
                log.info("实时聊天消息es写入成功");
                return ResultMsg.ok("es数据同步!!!");
            }
            return ResultMsg.failed("es数据同步失败",bulkResponse.buildFailureMessage());

正确的方式:

  
            BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
            if(bulkResponse.hasFailures()){
                log.info("数据写入失败:{}",bulkResponse.buildFailureMessage());
                return ResultMsg.failed("es数据同步失败",bulkResponse.buildFailureMessage());
            }else {
                log.info("实时聊天消息es写入成功");
                return ResultMsg.ok("es数据同步成功!!!");
            }

错误日志:

 {"index":"im_realtime_message","type":"_doc","id":"eebeb54a-00fd-4998-9783-0c42eea3e492","cause":{"type":"exception","reason":"Elasticsearch exception [type=mapper_parsing_exception, reason=failed to parse field [insertTime] of type [date] in document with id 'eebeb54a-00fd-4998-9783-0c42eea3e492'. Preview of field's value: '1660835342572']","caused_by":{"type":"exception","reason":"Elasticsearch exception [type=illegal_argument_exception, reason=failed to parse date field [1660835342572] with format [yyyy-MM-dd HH:mm:ss]]","caused_by":{"type":"exception","reason":"Elasticsearch exception [type=date_time_parse_exception, reason=date_time_parse_exception: Text '1660835342572' could not be parsed at index 0]"}}},"status":400}

这个错就很明显了我们的时间格式不对对不对,咋解决呢? 

 我们在写入时间的时候格式化一下就搞定了

bulkRequest.add(
        new IndexRequest(index)
                //不填id时将会生成随机id
                .id(UUID.randomUUID().toString())
                .source(
                            JSONObject.toJSONStringWithDateFormat(entity, "yyyy-MM-dd HH:mm:ss", SerializerFeature.WriteDateUseDateFormat)
                     //   JSON.toJSONString(entity)
                        , XContentType.JSON).type("_doc")
);

3,如果还是写入不了数据,那就从新删除索引然后通过kinbana put数据方式及可。 

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ElasticSearch能够支持的索引字段数量和索引大小是有限制的,如果索引的字段数量或索引大小过大,会影响搜索性能。因此,减少索引的字段数据索引大小是非常重要的。 以下是一些减少索引的字段数据索引大小的方法: 1. 选择合适的字段进行索引:只对必要的字段进行索引,可以减少索引的大小和搜索的时间。不需要搜索的字段可以不进行索引,以减少索引的大小。 2. 优化字段的数据类型:ElasticSearch支持多种数据类型,不同的数据类型会对索引的大小有影响。优化字段的数据类型,可以减少索引的大小。例如,使用整数类型代替字符串类型可以减少索引的大小。 3. 索引数据的分片:将索引数据分成多个分片,可以减少单个分片的大小,从而提高搜索性能。同时,将分片存储在多个节点上,可以提高数据的可靠性和可用性。 4. 压缩索引数据:ElasticSearch支持在索引和搜索时使用数据压缩。压缩可以减少磁盘和网络带宽的使用,从而提高性能。 5. 关闭不必要的索引功能:ElasticSearch支持多种索引功能,例如,停用分析器、停用自动补全等功能可以减少索引的大小和搜索的时间。 综上所述,减少索引的字段数据索引大小是非常重要的,可以提高搜索性能。以上是一些减少索引的字段数据索引大小的方法,希望对您有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小杨互联网

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值