如何在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
之前报错的原因
- 第一种写法用了
{ "id":1 }的JS风格对象字面量,Painless不支持该语法,Map字面量必须使用['key': value]的格式 - 第二种写法用到的
JSONObject不属于Painless默认允许导入的类,无法直接使用,也没有必要使用,原生Map/List完全覆盖JSON结构的操作需求
内容的提问来源于stack exchange,提问作者orszaczky
相关产品推荐
相关产品推荐

