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

时间:2013-11-01 09:29:53

标签: elasticsearch mvel

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

这是我目前正在尝试的。但它不起作用。

  

{“error”:“ElasticSearchIllegalArgumentException [无法执行   脚本];嵌套:PropertyAccessException [[错误:无法访问   property(Timestamp)in:java.lang.Long] \ n [near:{... Timestamp   ....}] \ n ^ \ n [Line:1,Column:1]]; ”, “状态”:400}

如何访问Timestamp字段(通过映射成功创建)

  {
  "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 个答案:

答案 0 :(得分:1)

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

步骤-1 放一个数据。

    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"}
}