在Elasticsearch中更新索引文档

时间:2013-03-30 18:52:09

标签: elasticsearch full-text-search

我试图了解如何在Elasticsearch中更新索引文档。我不明白它是如何工作的? API所指的ctx是做什么的?假设您有一个包含嵌套文档的文档,您需要做些什么来更新它?

删除文档然后索引“更新”版本与普通更新之间有什么区别?

2 个答案:

答案 0 :(得分:35)

更新请求从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是源的可写版本。您可以在脚本中修改此文档,修改后的源将作为新版本的文档保留。

答案 1 :(得分:0)

以下是在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的更改方式与您执行脚本的方式以及数组可以执行的操作相同(+=不起作用)。