SpringBoot与es(elasticsearch)整合问题集锦

项目场景:

在springboot项目中,针对elasticsearch读取及写入遇到的问题.


问题描述及解决方案

1.WRITE

1.springboot不同版本与其对应的es版本也不同,使用的部分API有所变化,详情见下方

1.更新es数据所使用的UpdateQuery构建方式不同
2.elasticsearchRestTemplate()传参不同

springboot-2.3.2.RELEASE版本(使用的版本)
在这里插入图片描述
构建方式如下:
在这里插入图片描述
在这里插入图片描述

springboot-2.2.2.RELEASE版本
在这里插入图片描述
构建方式如下:
在这里插入图片描述
在这里插入图片描述

注:如果在2.2.2版本中使用2.3.2版本API构建方式会报空指针异常


2.es不同版本导致索引类型‘type’不同

es旧版本支持自定义索引类型,比如type=”User”
es新版本之后索引类型均为“_doc”
因此需要在实体类上通过Document注解进行指明,否则索引类型会自动生成,为实体类类名小写格式如:User->user,不指明会因为数据类型问题报错

在这里插入图片描述


3.在实体中指明es索引字段数据类型使其生效的问题-@Field注解

场景描述:实体字段amount(举例)为BigDecimal类型,es本应该自动映射为double类型或float类型,但插入es的第一条数据amount值为整数导致es映射为long型,之后再插入带有小数点的数据也能插入成功,但进行sum统计时小数点后边的小数es会对其进行忽略,不进行计算。

问题解决:

之前也标注了@Field注解但并没有生效,查阅多方资料说是spring-data-elasticsearch根本没有使用该标签。按网上的解决方法是使用mappingPath(指明属性类型的配置文件路径)标签,不指明mappingPath才会根据@Field注解指明的类型
最终解决步骤如下:
1.在实体类上标注@Mapping注解
2.在实体中amount字段上标注@Field注解
3.如果该字段是’实体中的实体’的字段属性(company.user.setAmount),需要在Company的user属性上标注@Field(type=FieldType.Object)
4.在插入数据之前执行putMapping操作

Company实体类:
在这里插入图片描述
User实体类:
在这里插入图片描述
数据写入:
在这里插入图片描述


4.由于数据字段个数达到上限,默认为1000个,导致数据插入失败,报错如下:
在这里插入图片描述

问题解决:

在建索引时指定字段个数上限

PUT /索引名/_settings
{
"index.mapping.total_fields.limit": 2000
}

5.字段映射问题

在es建索引时不用指明数据具体字段名及数据类型,直接put /索引名建个索引就可以,es会自动映射出该索引的属性及数据类型,但出现了一些属性的映射有问题,比如某些字段为字符串类型,而第一条数据存的却是整数值,因此在es将该字段映射为long类型,导致再插入带有字母的数据时报错

问题解决:

将数据插入之前将该字段转化为String类型,这样在es会映射为keyword类型


6.批量插入es捕获到失败数据id报空指针异常

插入es失败的数据,ElasticsearchException会把失败数据的id写入到FailedDocument(Map)的key上,由于springboot版本问题可能会对ElasticsearchException进行封装后再抛出,以至于直接取捕获到异常里的FailedDocument报空指针(封装后的异常可能没有该Map集合)

问题解决:

更换springboot版本:2.2.2更换为2.3.2


2.READ

1.判断条件tremsQuery

tremsQuery类似于sql in,所以传参可以是list集合
QueryBuilders.termsQuery(字段,集合),需要该字段的type为keyword


记得点赞收藏奥,后续开发遇到问题会实时更新,关注不迷路~


版权声明:本文为weixin_45943866原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。