Elasticsearch Java Client复合聚合抛出x_content_parse_exception异常求助
解决方案
问题出在复合聚合sources的构建方式上:你用Map.of()把两个聚合源打包成了一个Map,导致Java客户端生成的JSON中,sources是一个只包含单个对象的数组,而这个对象里同时有strKey1和strKey2两个键。这不符合Elasticsearch复合聚合的规范——复合聚合的sources应该是一个数组,每个元素对应一个独立的聚合源(每个元素只能有一个键,对应聚合类型如terms)。
正确的代码写法
直接使用sources的构建器逐个添加聚合源:
var rqst = SearchRequest.of(b -> b .index(coords.getIndexName()) .size(1000) .query(query) .aggregations("aggre", a -> a .composite(ca -> ca .size(100) .sources(sources -> sources // 添加第一个聚合源,指定字段strKey1 .add(s -> s.terms(t -> t.field("strKey1"))) // 添加第二个聚合源,指定字段strKey2 .add(s -> s.terms(t -> t.field("strKey2"))) ) ) ) ); client.search(rqst, Void.class);
如果需要给聚合源指定自定义名称(比如和字段名区分),可以加上name()方法:
.sources(sources -> sources .add(s -> s.name("key1").terms(t -> t.field("strKey1"))) .add(s -> s.name("key2").terms(t -> t.field("strKey2"))) )
为什么手动curl能运行?
Elasticsearch的JSON解析器有一定容错能力,能处理不符合规范的单元素多键对象,但Java客户端的请求序列化逻辑和服务器的严格解析逻辑不兼容,导致抛出解析异常。按照规范构建请求后即可解决问题。
内容的提问来源于stack exchange,提问作者nukie
相关产品推荐
相关产品推荐

