Elasticsearch Java API Client聚合键返回字符串而非数值的问题
Elasticsearch Java API Client聚合键类型问题
字段映射
"departmentId": { "type": "integer" }
对该字段执行terms聚合查询。
预期行为
从Elasticsearch原始JSON响应中,期望聚合桶的键为数值类型:
"key": 1
实际行为
使用以下两种方式调用客户端:
SearchResponse<JsonData> response = esClient.search(request, JsonData.class);
或者:
SearchResponse<Map> response = esClient.search(request, Map.class);
得到的聚合键均为字符串类型:
"key": "1"
观察结果
- 该问题仅出现在聚合中,
_source字段无此问题 - 调试Java客户端后发现:
- 聚合使用
TypedKeysDeserializer解析 - 桶键通过
JsonpDeserializer.STRING反序列化 - 内部调用
parser.getString(),该方法会将VALUE_NUMBER类型转换为字符串
- 聚合使用
问题
- 这是Elasticsearch Java API Client的预期行为吗?
- 是否可以配置客户端让聚合键返回数值类型而非字符串?
- 或者手动转换是唯一推荐的方式?
环境信息
- Elasticsearch版本:
7.17.9 - Elasticsearch Java Client版本:
7.17.9 - Java版本:17
解答
是预期行为。在Elasticsearch Java API Client的7.x版本中,terms聚合的桶键默认会被反序列化为字符串类型。这是因为聚合键存在多态性可能,客户端为了兼容性统一采用字符串解析逻辑。
无法直接配置客户端改变此行为。当前版本客户端没有提供开关或配置项修改聚合键的反序列化逻辑,
TypedKeysDeserializer和JsonpDeserializer.STRING的解析逻辑为硬编码实现,无暴露可配置入口。手动转换是当前推荐的方式。获取聚合结果后,可将字符串类型的键转换为对应数值类型,示例代码:
// 假设获取到聚合桶的键为String类型 String keyStr = bucket.getKeyAsString(); Integer departmentId = Integer.parseInt(keyStr);
可增加类型校验逻辑,避免转换异常。
内容的提问来源于stack exchange,提问作者Kalavena Dharaneshwar
相关产品推荐
相关产品推荐

