Подтвердить что ты не робот

Обновление индексированного документа в Elasticsearch

Я пытаюсь понять, как вы обновляете индексированный документ в Elasticsearch. Я не понимаю, как это работает? Что такое ctx, что API имеет в виду? Скажем, у вас есть документ с вложенными документами, что вам нужно сделать, чтобы его обновить?

В чем разница между удалением документа и индексированием "обновленной" версии, а также простого обновления?

4b9b3361

Ответ 1

Запрос на обновление получает источник от Elasticsearch, модифицирует его и индексирует обратно в Elasticsearch. Если у вас уже есть копия документа, использовать обновление не имеет смысла. Как правило, было бы быстрее просто индексировать новую версию. Однако, если у вас нет готового документа, но вы знаете, какие изменения вы хотите внести в документ, может быть более эффективно использовать обновление.

Например, если у меня нет копии автомобильного документа, но я хочу добавить нового создателя, я могу сделать что-то вроде этого:

curl -XDELETE localhost:9200/test

curl -XPUT localhost:9200/test -d '{
    "settings": {
        "index.number_of_shards": 1,
        "index.number_of_replicas": 0
    },
    "mappings": {
        "car": {
            "properties": {
                "creators" : {
                    "type": "nested",
                    "properties": {
                        "name": {"type":"string"}
                    }
                }
            }
        }
    }
}
'

curl -XPOST localhost:9200/test/car/1 -d '{
    "creators": [{
        "name": "Steve"
    }]
}
'

echo
curl -XPOST localhost:9200/test/car/1/_update -d '{
    "script" : "ctx._source.creators += new_creator",
    "params" : {
        "new_creator" : {"name": "John"}
    }
}'

echo
curl "localhost:9200/test/car/1?pretty=true"
echo

В скрипте обновления ctx есть специальная переменная, которая позволяет вам получить доступ к источнику объекта, который вы хотите обновить. ctx._source является записываемой версией источника. Вы можете изменить этот документ в сценарии, и измененный источник будет сохранен как новая версия документа.

Ответ 2

Вот как обновить документ с вложенными документами клиентов в ElasticSearch 7.3:

POST /myindex/_doc/mypartid/_update
{
    "script" : {
        "source": "ctx._source.customers.add(params.newcust)",
        "params" : {
            "newcust" : {"customer": "cust3"}
        }
    }
}

Результаты:

GET /myindex/_doc/mypartid
{
    "_index": "myindex2",
    "_type": "_doc",
    "_id": "mypartid",
    ...
    "_source": {
        "part": "my part",
        "customers": [
            {"customer": "cust1"},
            {"customer": "cust3"}
        ],
        "machines": [
            {"machine": "mach7"},
            {"machine": "mach2"}
        ]
    }
}

Итак, для ES7+ URL-адрес изменился, так же, как вы выполняете сценарии и какие операции может выполнять массив (+= не работает).