2016-07-06 4 views
2

Я пытаюсь обновить документ в elasticsearch питона,Elasticsearch документ обновления в питона

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) 

Но это не работает. Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно? благодаря

Это ошибка:

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 Я судимое это: 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;'). 

Это так просто с почтальоном, но я действительно не понимаю, почему так было с Elasticsearch (python), чтобы обновить doc. У кого-то есть другая идея, чтобы помочь?

+0

У вас есть ошибки? – keksnicoh

ответ

2

Поскольку второй аргумент метода helpers.bulk() должен быть итерабельным, попробуйте включить его в список.

Также, глядя на ваш код, кажется, что вы ожидаете только одного документа из функции getDoc(). Так что было бы лучше, если бы вы использовали простой метод es.update() вместо использования helpers.bulk()

+0

Спасибо за ваш ответ: Я пробовал это: 'es.update (index = 'macs', doc_type = 'users', id =" 1 ", body = doc)', я получил пример из http: // stackoverflow. com/questions/30598152/how-to-update-a-document-using-elasticsearch-py стиль не работает – theCode

+0

проверьте, соответствует ли ваш идентификатор. Elasticsearch присваивает произвольный идентификатор всем документам, поэтому, если вы не вручную устанавливаете его на «1», 1 не может быть идентификатором. Кроме того, вы можете попробовать «doc_as_upsert» = «True» в разделе es.update(). Также вы можете опубликовать то, что выглядит ваш документ или, возможно, отображение – rajat

+0

Проблема в том, что обновление elasticsearch не принимает unicode dict. Есть ли обходной путь? – theCode

1

This решение действительно работало для меня.

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']}) 
0

(В случае, если кто-то попадает сюда с подобной проблемой), я получаю первая ошибка уже упоминалось выше:

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

и следующие фиксированные это для меня:

obj.to_dict(include_meta=True) 

При преобразовании obj в dict я добавил include_meta=True, и это сработало для меня.

Смежные вопросы