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

Elasticsearch 8 Java客户端获取映射:返回ES7风格精简结果方法

Elasticsearch 8 Java客户端获取精简索引映射(兼容ES7格式)

问题场景

在Elasticsearch 7中,通过RestHighLevelClient获取索引映射的代码及结果如下:

GetMappingsResponse mapping = restHighLevelClient.indices().getMapping(getMappingsRequest, RequestOptions.DEFAULT);   
mapping.mappings().entrySet().iterator().next().getValue().getSourceAsMap();

返回的精简映射结果:

"properties": {
    "words": {
        "index": false,
        "type": "keyword"
    },
    "fileIndex": {
        "type": "long"
    }
}

切换到Elasticsearch 8新Java客户端后,使用以下代码获取映射:

GetMappingRequest getMappingsRequest = new GetMappingRequest.Builder().index(indexName).build();
var mapping = elasticsearchClient.indices().getMapping(getMappingsRequest);
Map<String, Property> map = mapping.result().entrySet().iterator().next().getValue().mappings().properties();

得到的结果会列出所有可能的字段类型(仅目标类型标记为true),冗余信息过多,无法直接得到ES7格式的精简映射。

解决方案

要获取和ES7一致的精简映射,需对Property对象解析,提取有效字段属性:

1. 解析字段类型

Property是密封类,可通过_kind().jsonValue()直接获取字段类型名称:

String fieldType = property._kind().jsonValue();

2. 提取index属性

不同字段类型的index属性需针对性获取,示例如下:

Boolean index = null;
if (property instanceof KeywordProperty keywordProp) {
    index = keywordProp.index();
} else if (property instanceof LongProperty longProp) {
    index = longProp.index();
}
// 其他字段类型(如text、date等)可添加对应判断分支

3. 封装为精简格式Map

将解析后的字段信息封装成ES7风格的结构:

Map<String, Object> simplifiedMappings = new HashMap<>();
Map<String, Object> properties = new HashMap<>();

for (Map.Entry<String, Property> entry : map.entrySet()) {
    String fieldName = entry.getKey();
    Property property = entry.getValue();
    
    Map<String, Object> fieldProps = new HashMap<>();
    // 添加字段类型
    fieldProps.put("type", property._kind().jsonValue());
    
    // 添加index属性(仅当属性存在且非默认值时)
    if (property instanceof KeywordProperty keywordProp) {
        fieldProps.put("index", keywordProp.index());
    } else if (property instanceof LongProperty longProp && longProp.index() != null) {
        fieldProps.put("index", longProp.index());
    }
    // 扩展其他字段类型的属性提取逻辑
    
    properties.put(fieldName, fieldProps);
}

simplifiedMappings.put("properties", properties);

4. (可选)序列化为JSON

若需要输出JSON字符串,可使用Jackson完成序列化:

ObjectMapper objectMapper = new ObjectMapper();
String jsonResult = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(simplifiedMappings);

输出结果将与ES7返回的格式完全一致。

说明

Elasticsearch 8新客户端采用强类型设计,Property对象包含全量字段类型标识,需手动解析提取有效信息;若涉及更多字段类型,只需补充对应instanceof判断分支即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:40:57