关于upsert的ElasticsearchIllegalArgumentException

时间:2014-12-05 14:36:25

标签: nullpointerexception elasticsearch

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}

知道如何解决这个问题吗?

1 个答案:

答案 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对其进行初始化,然后执行增量。