项目背景
最近在某项目开发中遇到一个高版本ES创建索引时指定index和type问题。
项目中的ES使用了阿里云上的ES,版本为7.4。
通过ES官网对各版本type的演变如下:
- 在5.X版本中,一个index下可以创建多个type
- 在6.X版本中,一个index下只能存在一个type
- 在7.X版本中,一个index下只能存在一个type,创建index时可不指定type
项目中spring-boot版本为2.0.4.RELEASE,操作ES使用了spring-data-elasticsearch
框架,
引入了它的starter,spring-boot-starter-data-elasticsearch
,版本为2.3.3.RELEASE,
这个版本依赖的spring-data-elasticsearch
版本为3.2.1.RELEASE,elasticsearch
版本为6.8.4。
项目中ES索引实体类配置如下:
@NoArgsConstructor
@AllArgsConstructor
@Data
@EqualsAndHashCode(callSuper = false)
@Document(indexName = "xxx_eo", type = "xxx_eo", shards = 1)
public class PromotionActiveInfoEo extends Eo {
...
}
@Document
是spring-data-elasticsearch
提供的注解,里面indexName
指定索引名,type
指定类型名。
项目中的实体2个属性都配置了,并且indexName
与type
配置的一致。
在ES 7.4中,一般通过脚本人工创建索引,不指定type
例:
PUT /xxx_eo_v1
{
"aliases": {
"xxx_eo": {}
},
"settings": {
...
},
"mappings": {
"properties": {
...
}
}
}
创建出来的索引名为xxx_eo_v1
,别名为xxx_eo
,类型名没有指定,即为默认的_doc。
这样会导致和项目中注解配置的不一致,因为项目中指定了type
类型名,跟索引名相同。
解决方法
-
通过
spring-data-elasticsearch
框架里提供的注解(@Document、@Id、@Field)配置,在项目启动时自动创建索引 -
人工通过脚本创建索引,注意在创建时设置include_type_name=true,并在mappings里指定类型名
例:
PUT /xxx_eo_v1?include_type_name=true
{
"aliases": {
"xxx_eo": {}
},
"settings": {
...
},
"mappings": {
"xxx_eo": {
"properties": {
...
}
}
}
}
参考
- ElasticSearch 7.X索引创建mapping时指定type https://blog.csdn.net/Mr_Air_Boy/article/details/122412269
- Elasticsearch 为何要在7.X版本中去除type的概念 https://www.cnblogs.com/miracle-luna/p/10998670.html