2013-11-01 43 views
0

我想將一些數據附加到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" 
    } 
    ] 
    } 
} 

UPDATE:

發現瞭如何訪問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」到「測試」。

+0

您是否嘗試過使用該腳本訪問另一個字段?也許時間戳字段是一個特殊情況? – MeiSign

+0

japp!沒有成功。它無法使用上述語法從「valueSet」訪問任何字段。 – Jabb

回答

1

我能夠像數組一樣更新整個數組或整個字段。 請按照下列步驟操作。

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