简体   繁体   English

python中的Elasticsearch更新文档

[英]Elasticsearch update document in python

I am trying to update document in elasticsearch python, 我正在尝试在Elasticsearch python中更新文档,

from elasticsearch import Elasticsearch
from datetime import datetime
from scapy.all import *
import json
# es = Elasticsearch()
es = Elasticsearch(['http://localhost:9200'])

doc = getDoc("1")
    print doc
    if doc != None:
      doc['_op_type'] = 'update'
      doc['_source']['macList'].append('new')
      helpers.bulk(es, doc, stats_only=False)

But this is not working. 但这是行不通的。 Can someone please tell me what I am doing wrong ? 有人可以告诉我我做错了吗? thanks 谢谢

This is the error: 这是错误:

Traceback (most recent call last):
  File "./req.py", line 48, in <module>
    helpers.bulk(es, doc, stats_only=False)
  File "/usr/local/lib/python2.7/dist-packages/elasticsearch/helpers/__init__.py", line 188, in bulk
    for ok, item in streaming_bulk(client, actions, **kwargs):
  File "/usr/local/lib/python2.7/dist-packages/elasticsearch/helpers/__init__.py", line 160, in streaming_bulk
    for result in _process_bulk_chunk(client, bulk_actions, raise_on_exception, raise_on_error, **kwargs):
  File "/usr/local/lib/python2.7/dist-packages/elasticsearch/helpers/__init__.py", line 89, in _process_bulk_chunk
    raise e
elasticsearch.exceptions.RequestError: TransportError(400, u'action_request_validation_exception', u'Validation Failed: 1: index is missing;2: type is missing;3: index is missing;4: type is missing;5: index is missing;6: type is missing;7: index is missing;8: type is missing;9: index is missing;10: type is missing;11: index is missing;12: type is missing;13: index is missing;14: type is missing;')

Update I have tryed this : es.update(index='macs', doc_type='users', id="1", body=doc) and I am having this error: Traceback (most recent call last): 更新我已经尝试过此方法: es.update(index='macs', doc_type='users', id="1", body=doc) ,但遇到此错误:Traceback(最近一次调用是最近一次):

  File "./req.py", line 50, in <module>
    es.update(index='macs', doc_type='users', id="1", body=doc)
  File "/usr/local/lib/python2.7/dist-packages/elasticsearch/client/utils.py", line 69, in _wrapped
    return func(*args, params=params, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/elasticsearch/client/__init__.py", line 460, in update
    doc_type, id, '_update'), params=params, body=body)
  File "/usr/local/lib/python2.7/dist-packages/elasticsearch/transport.py", line 329, in perform_request
    status, headers, data = connection.perform_request(method, url, params, body, ignore=ignore, timeout=timeout)
  File "/usr/local/lib/python2.7/dist-packages/elasticsearch/connection/http_urllib3.py", line 109, in perform_request
    self._raise_error(response.status, raw_data)
  File "/usr/local/lib/python2.7/dist-packages/elasticsearch/connection/base.py", line 108, in _raise_error
    raise HTTP_EXCEPTIONS.get(status_code, TransportError)(status_code, error_message, additional_info)
elasticsearch.exceptions.RequestError: TransportError(400, u'action_request_validation_exception', u'Validation Failed: 1: script or doc is missing;').

It is so easy with postman but I really don't understand why it is so had with Elasticsearch (python) to update doc. 使用邮递员是如此简单,但是我真的不明白为什么用Elasticsearch(python)来更新文档是如此。 Someone has an other idea to help ? 有人有其他帮助的想法吗?

Since the second argument in helpers.bulk() method is should be an iterable , try enclosing it in a list. 由于helpers.bulk()方法中的第二个参数应该是可迭代的 ,请尝试将其包含在列表中。

Also looking at your code, it seems you are expecting only one document from the getDoc() function. 还要查看您的代码,看来您只期望getDoc()函数提供一个文档。 So it would be better if you use simple es.update() method instead of using helpers.bulk() 因此,如果您使用简单的es.update()方法而不是使用helpers.bulk()会更好。

This solution did work for me. 解决方案确实为我工作。

doc= ess.get(...) 
# modify my doc and ...   
coll = Elasticsearch()
coll.update(index='stories-test',doc_type='news',id=hit.meta.id,
                    body= {"doc": doc['_source']} )

(In case someone lands up here with a similar problem,) I was getting the first error mentioned above: (以防有人在这里遇到类似问题,)我遇到了上面提到的第一个错误:

elasticsearch.exceptions.RequestError: TransportError(400, 
'action_request_validation_exception', 'Validation Failed: 
1: index is missing;2: type is missing;

and the following fixed it for me: 以下内容为我修复了此问题:

obj.to_dict(include_meta=True)

When converting the obj to dict, I added include_meta=True and it worked for me. 将obj转换为dict时,我添加了include_meta=True ,它对我include_meta=True

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM