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

如何在Elasticsearch Painless Lab中定义JSON对象数组进行测试?

Painless Lab 定义测试用JSON对象数组的正确方式

Painless 没有JS风格的JSON对象字面量语法,也默认不开放JSONObject类的导入权限,所有JSON结构都通过原生Map(对应JSON对象)、List(对应JSON数组)实现:

基础写法

// 单个JSON对象等价写法(Map字面量)
def singleDoc = ['id': 1, 'name': 'Apple']

// JSON对象数组等价写法(List嵌套Map)
def docs = [
    ['id': 1, 'name': 'Apple', 'stock': 120],
    ['id': 2, 'name': 'Banana', 'stock': 89],
    ['id': 3, 'name': 'Orange', 'stock': 201]
]

嵌套结构写法

如果需要测试带嵌套属性的文档,按层级嵌套Map即可:

def docs = [
    [
        'id': 1,
        'name': 'Apple',
        'spec': ['weight': '200g', 'origin': 'Shandong'],
        'tags': ['fruit', 'fresh']
    ]
]

测试示例

定义完成后可以直接用和正式环境一致的语法操作文档,以下是完整测试用例:

// 定义测试文档数组
def docs = [
    ['id': 1, 'name': 'Apple', 'price': 23.5],
    ['id': 2, 'name': 'Banana', 'price': 9.9],
    ['id': 3, 'name': 'Orange', 'price': 12.8]
]

// 测试逻辑:筛选单价大于10的水果,拼接输出信息
def output = []
for (def item : docs) {
    if (item.price > 10) {
        output.add("商品:" + item.name + ",单价:" + item.price)
    }
}

return output

之前报错的原因

  1. 第一种写法用了{ "id":1 }的JS风格对象字面量,Painless不支持该语法,Map字面量必须使用['key': value]的格式
  2. 第二种写法用到的JSONObject不属于Painless默认允许导入的类,无法直接使用,也没有必要使用,原生Map/List完全覆盖JSON结构的操作需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:09:05