如何将Elasticsearch文档字段计算结果嵌入每条返回的文档中
解决方案
你当前使用的Terms聚合本质是分组统计组件,会将计算结果相同的文档归为同一个桶,天然不支持单独返回每个文档的计算值。要实现每个文档返回独立计算值并嵌入文档数据区域,改用**脚本字段(Script Field)**即可,无需使用聚合。
修改后代码示例
// 定义脚本字段,计算逻辑和原有逻辑保持一致 ScriptField priceScriptField = new ScriptField("price", new Script(ScriptType.INLINE, "painless", "int total = 0;\n" + "for (int i = 0; i < 5; ++i) {\n" + " total += doc['age'].value;\n" + "}\n" + "return total;", Collections.emptyMap()) ); NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder() .withQuery(matchAllQuery()) // 移除原有聚合配置,添加脚本字段 .withScriptField(priceScriptField) .build(); SearchHits<Stories> searchHits = elasticsearchOperations.search(nativeSearchQuery, Stories.class, IndexCoordinates.of("long_stories"));
结果合并逻辑
执行查询后,每个SearchHit对象都会携带当前文档对应脚本字段的计算结果,手动将值赋值到Stories实体的对应字段中,即可实现计算值和原文档数据合并返回:
// 遍历处理所有查询结果 List<Stories> resultList = new ArrayList<>(); for (SearchHit<Stories> hit : searchHits) { Stories content = hit.getContent(); // 从hit的fields中取出计算得到的price值 Integer price = hit.getField("price").getValue(); // 提前在Stories类中新增price字段,完成赋值 content.setPrice(price); resultList.add(content); } // 最终返回resultList即可得到每个文档带对应price值的结果
效果说明
修改后相同计算值的文档不会被合并,每个文档都会返回自己对应的计算结果,直接嵌入到原文档数据结构中,完全匹配需求。
内容的提问来源于stack exchange,提问作者Jack Nickelson
相关产品推荐
相关产品推荐

