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

elasticsearch-java 8.10.4下划线字段转Java驼峰属性问题求助

解决方案

针对你使用elasticsearch-java 8.10.4(JDK 1.8环境)时,索引下划线字段无法映射到Java驼峰属性的问题,以下是几种可行的解决方式:

1. 字段级注解映射(快速适配单个类)

利用Jackson的@JsonProperty注解,在Java对象的驼峰属性上显式指定对应的索引下划线字段名,这是最直接的方式:

普通Java类示例

public class User {
    private String userId;
    private String model;

    // 为userId属性指定索引中的user_id字段
    @JsonProperty("user_id")
    public String getUserId() {
        return userId;
    }

    @JsonProperty("user_id")
    public void setUserId(String userId) {
        this.userId = userId;
    }

    // 简单属性无需额外配置
    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }
}

Lombok简化示例

如果使用Lombok,可以直接在字段上添加注解,省去手动编写getter/setter:

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

@Data
public class User {
    @JsonProperty("user_id")
    private String userId;
    private String model;
}

2. 全局配置Jackson命名策略(批量适配所有类)

通过自定义ObjectMapper开启下划线转驼峰的全局命名策略,避免每个字段都加注解:

步骤1:创建自定义ObjectMapper

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;

ObjectMapper customMapper = new ObjectMapper();
// 设置下划线转驼峰的命名策略
customMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
// 可添加其他必要配置,比如日期格式、空值处理等

步骤2:配置ElasticsearchClient使用自定义Mapper

将自定义的ObjectMapper传入JacksonJsonpMapper,再配置到客户端中:

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientTransport;
import org.elasticsearch.client.json.jackson.JacksonJsonpMapper;
import org.elasticsearch.client.transport.ElasticsearchClient;

// 初始化RestClient
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();

// 使用自定义ObjectMapper创建JacksonJsonpMapper
JacksonJsonpMapper jsonpMapper = new JacksonJsonpMapper(customMapper);

// 构建ElasticsearchClient
ElasticsearchClient client = new ElasticsearchClient(
    new RestClientTransport(restClient, jsonpMapper)
);

配置完成后,客户端会自动将索引中的下划线字段映射到Java对象的驼峰属性。

3. 手动解析Source Map(兜底方案)

如果上述自动映射方式都不适用,可以手动从SearchHit中取出source数据,手动赋值给Java对象:

import org.elasticsearch.client.core.SearchResponse;
import org.elasticsearch.client.core.SearchHit;

SearchResponse<User> response = client.search(
    s -> s.index("your_index_name").query(q -> q.matchAll(m -> m)),
    User.class
);

for (SearchHit<User> hit : response.hits().hits()) {
    // 获取索引返回的原始字段Map
    Map<String, Object> source = hit.source();
    User user = new User();
    // 手动将下划线字段赋值给驼峰属性
    user.setUserId((String) source.get("user_id"));
    user.setModel((String) source.get("model"));
    // 其他属性同理处理
}

内容的提问来源于stack exchange,提问作者Hsu Demon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:22:31