使用Elasticsearch Rest High Level Client批量插入遇type缺失验证错误
解决Elasticsearch批量插入时的"type is missing"验证错误
问题背景
使用Elasticsearch Rest High Level Client执行批量插入操作时,触发type is missing的验证错误,当前使用ES版本为7.15.2,Spring Boot版本2.6.9。
依赖配置
pom.xml中的相关依赖如下:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.9</version> <relativePath/> </parent> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-elasticsearch</artifactId> <version>4.3.5</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.15.2</version> </dependency>
批量插入代码片段
BulkRequest request = new BulkRequest(); ObjectMapper objectMapper = new ObjectMapper(); list.forEach(data -> { IndexRequest indexRequest = new IndexRequest("index2", "_doc").source(objectMapper.convertValue(data, Map.class)); request.add(indexRequest); }); BulkResponse bulkResponse = esClient.bulk(request, RequestOptions.DEFAULT);
错误信息
org.elasticsearch.ElasticsearchStatusException: Elasticsearch exception [type=action_request_validation_exception, reason=Validation Failed: 1: type is missing;] at org.elasticsearch.rest.BytesRestResponse.errorFromXContent(BytesRestResponse.java:176) ~[elasticsearch-7.15.2.jar:7.15.2] at org.elasticsearch.client.RestHighLevelClient.parseEntity(RestHighLevelClient.java:2011) ~[elasticsearch-rest-high-level-client-7.15.2.jar:7.15.2] at org.elasticsearch.client.RestHighLevelClient.parseResponseException(RestHighLevelClient.java:1988) ~[elasticsearch-rest-high-level-client-7.15.2.jar:7.15.2] at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1745) ~[elasticsearch-rest-high-level-client-7.15.2.jar:7.15.2] at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1702) ~[elasticsearch-rest-high-level-client-7.15.2.jar:7.15.2] at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1672) ~[elasticsearch-rest-high-level-client-7.15.2.jar:7.15.2] at org.elasticsearch.client.RestHighLevelClient.bulk(RestHighLevelClient.java:577) ~[elasticsearch-rest-high-level-client-7.15.2.jar:7.15.2]
已执行操作
通过reindex命令将index1中类型为user的数据迁移到index2,统一设置类型为_doc:
curl --location --request POST '{baseServerurl}/_reindex' \ --header 'Content-Type: application/json' \ --header 'Cache-Control: no-cache' \ --data-raw '{ "source": { "index": "index1", "type": "user" }, "dest": { "index": "index2", "type": "_doc" } }'
已移除代码映射中的显式类型声明,符合ES7的规范要求。
解决方案
1. 使用无type参数的IndexRequest构造方法
ES7及以上版本官方推荐不再指定文档类型,即使是默认的_doc也可以省略,直接使用仅指定索引名的构造方法:
IndexRequest indexRequest = new IndexRequest("index2").source(objectMapper.convertValue(data, Map.class));
2. 确保客户端与服务端版本一致
检查Elasticsearch服务端版本是否为7.15.2,版本不匹配可能引发这类兼容性验证错误。
3. 检查目标索引的配置
通过以下命令查看index2的映射配置,确认索引结构是否正常:
curl -XGET '{baseServerurl}/index2/_mapping'
如果映射存在异常,可重新创建index2:
curl -XPUT '{baseServerurl}/index2' \ --header 'Content-Type: application/json' \ --data-raw '{ "mappings": { "properties": { # 填写你的字段映射定义 } } }'
内容的提问来源于stack exchange,提问作者Ayesha
相关产品推荐
相关产品推荐

