Elasticsearch v.1.4.1(" lucene_version":" 4.10.2")
我有这样的文件:
$ curl 'http://localhost:9200/blog/article/1'
{
"_index":"blog",
"_type":"article",
"_id":"1",
"_version":4,
"found":true,
"_source":{
"id":"1",
"title":"First Elasticsearch doc!",
"testfield":"abcd"
}
}
我只是在这里尝试upsert示例:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-update.html#upserts
$ curl -XPOST 'http://localhost:9200/blog/article/1/_update' -d '{
> "script" : "ctx._source.counter += count",
> "params" : {
> "count" : 4
> },
> "upsert" : {
> "counter" : 1
> }
> }'
我收到此错误:
{"error":"ElasticsearchIllegalArgumentException[failed to execute script];
nested: GroovyScriptExecutionException[NullPointerException[Cannot execute null+null]]; ",
"status":400}
知道如何解决这个问题吗?
答案 0 :(得分:1)
文档中的该部分说明了以下内容:
还支持upsert。如果文档尚不存在,则upsert元素的内容将用于索引新文档:
据我所知,该示例适用于不存在的文档。如果没有,则新文档将包含值为counter
的{{1}}字段。在您的情况下,您已经有一个不包含1
的文档。这是一个问题,因为新字段不会添加到其中,这仅适用于不存在的文档。
在您的情况下,您需要在已存在的文档中包含counter
字段或执行以下操作:
counter
意思是,在您的脚本中添加新的POST /blog/article/1/_update
{
"script": "if (!ctx._source.counter) {ctx._source.counter = 1};ctx._source.counter += count",
"params": {
"count": 4
}
}
字段并使用counter
对其进行初始化,然后执行增量。