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

Groovy用JsonSlurper解析Elasticsearch JSON的数据提取需求

优化后的Groovy解析方案

核心实现代码

import groovy.json.JsonSlurper

def jsonSlurper = new JsonSlurper()
def esResponse = jsonSlurper.parseText(yourEsHttpResponseText)

// 提取目标数据
def targetBits = esResponse.hits.hits._source.providers.flatten()
    .findAll { provider ->
        // 过滤掉UniqueId带_1/_2这类数字后缀的项
        !provider.UniqueId.matches(/.*_\d+$/)
    }
    .collect { [mostSigBits: it.mostSigBits, leastSigBits: it.leastSigBits] }

代码细节说明

  1. 扁平化嵌套结构:用flatten()处理多层嵌套的_source.providers,一次性遍历所有hit下的providers数组,避免多层循环嵌套。
  2. 精准后缀过滤:通过正则/.*_\d+$/直接匹配_加数字的后缀,比字符串分割、截取的方式更高效且逻辑清晰。
  3. 链式风格简化:将过滤、数据收集操作串联起来,符合Groovy脚本的简洁特性,可读性和维护性更强。

扩展场景处理

如果需要对UniqueId做去重(避免不同hit中出现重复UniqueId的项),可以在过滤前加入去重逻辑:

def targetBits = esResponse.hits.hits._source.providers.flatten()
    .unique { it.UniqueId } // 按UniqueId去重
    .findAll { !it.UniqueId.matches(/.*_\d+$/) }
    .collect { [mostSigBits: it.mostSigBits, leastSigBits: it.leastSigBits] }

兼容初始需求(提取所有_id)

如果后续仍需用到最初提取所有_id的需求,可采用简洁的链式写法:

def allIds = esResponse.hits.hits*.id // 若字段是_id则改为it._id,根据实际返回结构调整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 10:33:17