如果字段不存在,则为Elasticsearch Update API

时间:2013-04-12 09:32:52

标签: elasticsearch

upsert的例子是:

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
    "script" : "ctx._source.counter += count",
    "params" : {
        "count" : 4
    },
    "upsert" : {
        "counter" : 1
    }
}'

如果以前不存在该文档,则可以使用。

假设我想要更新不一定存在的字段,但文档存在。 例如,该文档可能还没有计数器字段。

我该怎么做?

2 个答案:

答案 0 :(得分:11)

您可以使用更新脚本检查字段是否存在:

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
    "script" : "if( ctx._source.containsKey(\"counter\") ){ ctx._source.counter += count; } else { ctx._source.counter = 1; }",
    "params" : {
        "count" : 4
    },
    "upsert" : {
        "counter" : 1
    }
}'

答案 1 :(得分:0)

  

最简单的更新请求形式接受部分文档   doc参数,只是与现有文档合并。   对象合并在一起,现有的标量字段被覆盖,   并添加了新字段。见Partial Updates to Documents

例如,

(1)创建一个新文档,只有一个字段field1

curl -XPOST localhost:9200/myidx/mytp/myid?pretty -d '{
    "field1" : 1
}'

您的文件是,

"_source" : {
    "field1" : 1
}

(2)部分更新不存在的字段field2

curl -XPOST localhost:9200/myidx/mytp/myid/_update?pretty -d '{
    "doc" : {
        "field2" : 2
    }
}'

您的文件是,

"_source" : {
    "field1" : 1,
    "field2" : 2
}

(3)当然,您可以同时更新现有和不存在的字段

curl -XPOST localhost:9200/myidx/mytp/myid/_update?pretty -d '{
    "doc" : {
        "field2" : 200, 
        "field3" : 3
    }
}'

您的文件是,

"_source" : {
  "field1" : 1,
  "field2" : 200,
  "field3" : 3
}