我试图通过ES 2.1.1上的elasticsearch-py python客户端使用Update API,但我遇到了麻烦。
es.index(index='boston', doc_type='stem_map', id=111, body={'word': 'showing', 'counter': 29})
es.get(index='boston', doc_type='stem_map', id=111)
{'_id': '111',
'_index': 'boston',
'_source': {'counter': 29, 'word': 'showing'},
'_type': 'stem_map',
'_version': 1,
'found': True}
upscript = {
'script': {
'inline': 'ctx._source.counter += count',
'params': {
'count': 100
}
}
}
然后我尝试了以下两种方法:
es.update(index='boston', doc_type='stem_map', id=111, body=upscript)
es.update(index='boston', doc_type='stem_map', id=111, script=upscript)
我收到以下错误:
RequestError: TransportError(400, 'illegal_argument_exception', '[John Walker][127.0.0.1:9300][indices:data/write/update[s]]')
有人知道我做错了吗?
更新:这也不起作用
es.index(index='boston', doc_type='stem_map', id='111', body={'word': 'showing', 'counter': 29})
{'_id': '111',
'_index': 'boston',
'_shards': {'failed': 0, 'successful': 1, 'total': 2},
'_type': 'stem_map',
'_version': 1,
'created': True}
upscript = {
"script" : "ctx._source.counter += count",
"params" : {
'count': 100
}
}
es.update(index='boston', doc_type='stem_map', id='111', body=upscript)
WARNING:elasticsearch:POST /boston/stem_map/111/_update [status:400 request:0.002s]
...
RequestError: TransportError(400, 'illegal_argument_exception', '[Atum][127.0.0.1:9300][indices:data/write/update[s]]')
答案:我的错误。我没有意识到我必须首先通过更改config / elasticsearch.yml文件在ES上启用脚本。我的原始代码在启用脚本后起作用。
答案 0 :(得分:1)
我认为您的upscript
格式错误。试试这个
upscript = {
"script" : "ctx._source.counter += count",
"params" : {
'count': 100
}
}
并使用body=upscript
。
使用script=upscript
不起作用,因为这需要一个网址为ctx._source.counter += count
且网址为{"params" : { "count" : 100 }}
的网址编码字符串。
答案 1 :(得分:0)
我的错误。我没有意识到我必须首先在elasticsearch上启用脚本。我的原始代码在启用脚本后起作用。