【发布时间】:2016-04-03 10:08:32
【问题描述】:
以下简单的 ES Groovy 脚本采用带有订单数据 (orderItem) 的 Python 字典,并将其附加到 Elasticsearch 中的订单列表中。然后包含所有 orderItems 的列表位于 _source.Orders 下
"script": "if (ctx._source.containsKey(\"Orders\")) {ctx._source.Orders += orderItem;} else {ctx._source.Orders = [orderItem]}; "
"params":{"orderItem": orderItem}
在我的用例中,订单来自不同的商店,并希望它们进入 _source.Orders.Shop5Hgk、_source.Orders.Shop86hG、_source.Orders.Shop5G60 等下的列表结构。商店名称是动态的。
无论如何,我尝试什么,ES 都会抛出异常,抱怨 Orders 显然是空的。
GroovyScriptExecutionException[NullPointerException[无法设置 空对象上的属性“Shop5Hgk”]
那么,首先创建 Orders 字段,然后是商店名称字段,然后将 orderItems 附加到该字段的正确常规语法是什么?
更新:完整的 python 函数(不工作)
def updateLastOrdersElasticsearch(self,data):
es = elasticsearch.Elasticsearch(timeout=500)
actions = []
for shopName,orderList in data.items():
for orderItem in orderList:
sku = orderItem['SKU']
action = {
"_index": "myindex",
"script": "if (ctx._source.containsKey(\"Orders\")) {if (ctx._source.containsKey(shopName)){ctx._source.Orders."+shopName+" += Orders;}} else {ctx._source.Orders = []; ctx._source.Orders."+shopName+" = [Orders]}; ctx._source.TimestampUpdated = TimestampUpdated",
"_type": "items",
'_op_type': 'update',
"_id": sku,
"params":{"shopName":shopName,"Orders": orderItem, "TimestampUpdated":datetime.now().isoformat()}
}
actions.append(action)
return helpers.bulk(es, actions)
【问题讨论】:
标签: python python-2.7 elasticsearch groovy