如果字段不存在,则 Elasticsearch 更新 API

Posted

技术标签:

【中文标题】如果字段不存在,则 Elasticsearch 更新 API【英文标题】:Elasticsearch Update API if a field does not exist 【发布时间】:2013-04-12 09:32:51 【问题描述】:

upsert 的例子是:

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

如果该文档以前不存在,则有效。

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

我该怎么做?

【问题讨论】:

【参考方案1】:

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

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
    
'

【讨论】:

太棒了!您是否碰巧知道是否有一些网站可以真正解释 MVEL 语言?我尽力学习它,但找不到任何像样的资源。 mvel.codehaus.org/Language+Guide+for+2.0 太可怕了,几乎什么都没有 这是我所知道的最好的资源。我的建议是安装 javascript plugin 并切换到 javascript 作为您的脚本语言。 来自 elasticsearch 关于脚本语言的文档:The scripting module uses by default groovy (previously mvel in 1.3.x and earlier)

以上是关于如果字段不存在,则 Elasticsearch 更新 API的主要内容,如果未能解决你的问题,请参考以下文章

如果字段存在必须为真,但如果不存在则必须像真一样通过

ElasticSearch 字段数据存在,但用term查询搜索不到指定的数据

如果不存在,则追加 mysql json 字段

django - 如果一个或多个字段不存在则不断言的 Q 对象

Elasticsearch 更改已有字段的数据类型,清洗数据

Elasticsearch忽略字段格式类型(ignore_malformed)