elasticsearch - 如何在Elasticsearch中使用MVEL访问/更新嵌套字段的属性

标签 elasticsearch mvel

我想在Elasticsearch中向文档添加一些数据,并使用MVEL设置时间戳。

这是我目前正在尝试的。但这是行不通的。

{"error":"ElasticSearchIllegalArgumentException[failed to execute script]; nested: PropertyAccessException[[Error: could not access property (Timestamp) in: java.lang.Long]\n[Near : {... Timestamp ....}]\n ^\n[Line: 1, Column: 1]]; ","status":400}



我如何访问时间戳字段(通过映射成功创建)
  {
  "script": "
            valueSet.Timestamp = time();
            if (ctx._source[\"values\"] == null) { ctx._source.values = valueSet} else {ctx._source.values += valueSet}
            ",
  "params": {
    "valueSet": 
    [ 
    {
      "Timestamp": "",
      "value": "100.00"
    } 
   ]
  }
}

更新:

了解如何访问valueSet
  {
  "script": "
            valueSet[0].value = 'test';
            if (ctx._source[\"values\"] == null) { ctx._source.values = valueSet} else {ctx._source.values += valueSet}
            ",
  "params": {
    "valueSet": 
    [ 
    {
      "Timestamp": "",
      "value": "100.00"
    } 
   ]
  }
}

以上将覆盖“100.00”到“测试”。

最佳答案

我能够像数组一样非常简单地更新整个数组或整个字段。
请按照下列步骤。

步骤-1 放置一个smaple数据。

    PUT /1/user/1
    {
        "userId":2,
        "sid":1,
             "1": [
                    "24 hrs left!"
                ]
            ,
            "2": 9
            ,
             "32": "2014-08-01T00:00:00"
            ,
             "evant": [

        {
            "name": "2",
            "count": 9,
            "first_date":"2014-08-01T00:00:00",
            "last_date":"2014-08-01T00:00:00",
            "_date":["2014-08-01T00:00:00",
            "2014-08-01T00:00:00",
            "2014-08-01T00:00:00"]
        },
        {
            "name": "3",
            "count": 9,
            "first_date":"2014-08-01T00:00:00",
            "last_date":"2014-08-01T00:00:00",
            "_date":["2014-08-01T00:00:00",
            "2014-08-01T00:00:00",
            "2014-08-01T00:00:00"]
        }]
}

步骤2 。更新任何嵌套的字段值。
POST  /1/user/1/_update
{
  "script": "foreach (item : ctx._source.evant) { if (item['name'] == name) { item['name'] =  item['name']==null?\"none\": 'myname'; } }",
  "params": {"name": "abc"}
}

步骤3 。添加任何新字段。
POST  /1/user/1/_update
{
  "script": "foreach (item : ctx._source.evant) { if (item['name'] == name) { item['Fname']='zyz'; } }",
  "params": {"name": "abc"}
}

关于elasticsearch - 如何在Elasticsearch中使用MVEL访问/更新嵌套字段的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19724047/

相关文章:

scala - 嵌入式ES实例中的完成搜索

elasticsearch - 如何在弹性脚本中使用特殊文档字段?

android - 错误 : expected receiver of type com. MyApp.Main,但得到了 java.lang.Class<com.MyApp.Main>

elasticsearch - 将 mvel 脚本转换为 groovy 时出错

elasticsearch - 嵌套的Mvel脚本更新

amazon-web-services - AWS ElasticSearch Client SDK

python - 仅搜索混合字段中的数字(elasticsearch)

java - 等级评价

json - 从 mule esb 中的 JSON 中提取所有特定字段

typescript - @types/elasticsearch SearchResponse 类型错误