2013-11-01 1 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

배열과 마찬가지로 전체 배열이나 전체 필드를 매우 간단하게 업데이트 할 수 있습니다. 다음 단계를 따르십시오.

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