更新elasticsearch中的索引时出现RequestError

时间:2015-02-10 14:27:00

标签: python elasticsearch

我在elasticsearch中有一个索引,带有一定的时间戳。我正在尝试使用以下代码更新记录(在python中):

from elasticsearch import Elasticsearch
from datetime import datetime
import pytz

es = Elasticsearch()
time = datetime.utcnow().replace(tzinfo=pytz.utc)
msg = {'_id': 1, 'text': 'Hello World'}
es.index(index='idx', doc_type='dtype', id=msg['_id'], body=msg, timestamp=time, ttl='30d')
msg['text'] = 'New Message'
es.update(index='idx', doc_type='dtype', id=msg['_id'], body=msg, timestamp=time, ttl='30d')  

我收到以下错误:

RequestError: TransportError(400, u'ActionRequestValidationException[Validation Failed: 1: script or doc is missing;]')

同样的原因是什么?

1 个答案:

答案 0 :(得分:13)

消息号400表示您有“错误请求”。请求正文/ URL不是预期的。

在这种情况下,这是因为您不在正文中使用脚本或文档。有关详细信息,请查看Update API documentation

以下代码解决了您的问题:

from elasticsearch import Elasticsearch
from datetime import datetime
import pytz

es = Elasticsearch()
time = datetime.utcnow().replace(tzinfo=pytz.utc)
msg = {'_id': 1, 'text': 'Hello World'}
es.index(index='idx', doc_type='dtype', id=msg['_id'], body=msg, timestamp=time, ttl='30d')
msg2 = '''{"doc": {"text": "New Message"}}'''
es.update(index='idx', doc_type='dtype', id=msg['_id'], body=msg2, timestamp=time, ttl='30d')

通过用doc标记包围您想要更改的信息,您可以告诉ElasticSearch您要将值替换为部分文档的值。