You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 12:36:18