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
相关产品推荐
相关产品推荐

