Библиотека Python Elasticsearch, обновите, если она существует

avatar
Pavan Bahuguni
8 апреля 2018 в 11:54
2103
1
3

Я хочу обновить документ в индексе, если этот документ присутствует, op_type="update" в действиях массовой операции завершается с ошибкой. Я не уверен, что при выполнении операции обновления документ уже присутствует в индексе. Разрешается ли op+type="update" только в том случае, если документ уже существует в индексе?

Источник

Ответы (1)

avatar
Ryan Walker
8 апреля 2018 в 19:10
3

Да, op_type=update вызовет исключение document_missing_exception, если документ, который вы хотите обновить, еще не существует в индексе. Однако вы можете проигнорировать это исключение, передав raise_on_error=False помощнику массовой загрузки python. Но обязательно обработайте возвращаемое значение массового запроса на случай непредвиденной ошибки индексации.

Вот пример:

from elasticsearch.helpers import bulk
from elasticsearch import Elasticsearch

URL = "http://localhost:9200"
ES = Elasticsearch(URL)

# drop index if it exists
ES.indices.delete("twitter", ignore=400)

# create the index
ES.indices.create("twitter", {
    "settings" : {
        "number_of_shards" : 1
    },
    "mappings" : {
        "tweet" : {
            "properties" : {
                "text" : { "type" : "text" }
            }
        }
    }
})

# define the actions
actions = [
    {
        '_op_type': 'create',
        '_index': 'twitter',
        '_type': 'tweet',
        '_id': "A",
        'doc': {'text': 'test it!!!!'}
    },
    {
        '_op_type': 'create',
        '_index': 'twitter',
        '_type': 'tweet',
        '_id': "B",
        'doc': {'text': 'test it, B!' }
    },
    {
        '_op_type': 'update',
        '_index': 'twitter',
        '_type': 'tweet',
        '_id': "A",
        'doc': {'text': 'update it!'}
    },
    {
        '_op_type': 'update',
        '_index': 'twitter',
        '_type': 'doc',
        '_id': "C",
        'doc': {'text': 'Update should fail, this doc has not been created yet'}
    }
]

# bulk update the index.  Set raise_on_error=False to avoid raising the "document_missing_exception"
# CAUTION! you'll want to carefully parse the output of this in case an unexpected exception is thrown
result = helpers.bulk(ES, actions, raise_on_error=False)

# parse the return result of bulk to account for all errors.