2016-10-10 234 views
0

我需要使用新字段更新特定類型的現有文檔。該新字段應設置爲文檔中由日期時間字段給出的日期的當地日期名稱。日期時間字段的格式爲yyyy-MM-dd'T'HH:mm:ss,以UTC格式,但沒有明確的時區代碼。Elasticsearch - 獲取Groovy腳本中的語言環境特定日期

我想用Groovy做到這一點,但沒有Java經驗。我猜我需要:

1)在這種情況下

3設置日期時間爲UTC區域

2)轉換爲本地區域設置(設置爲歐洲/倫敦))獲取日期名稱從轉換的日期,並設置新的領域(DAYNAME)值與它

如果我用下面的update_by_query:

POST /myindex/_update_by_query 
{ 
    "script": { 
    "inline": "ctx._source.dayname = Some_function(ctx._source.datetime)" 
    }, 
    "query": { 
    "term": { 
     "_type": "myDocType" 
    } 
    } 
} 

有沒有一種簡單的方法有一些Groovy的本功能來做到這一點離子(取代上面的Some_function)。

任何提示將非常感謝!

更新 - 感謝tim_yates我有以下意義控制檯代碼:

POST /rating/_update_by_query 
{ 
    "script": { 
    "inline": "ctx._source.day = Date.parse(\"yyyy-MM-dd'T'HH:mm:ss\", ctx._source.datetime, java.util.TimeZone.getTimeZone('UTC')).format('EEEE', java.util.TimeZone.getTimeZone('Europe/London'))" 
    }, 
    "query": { 
    "term": { 
     "_type": "transaction" 
    } 
    } 
} 

不幸的是這會產生以下錯誤消息:

{ 
    "error": { 
     "root_cause": [ 
     { 
      "type": "script_exception", 
      "reason": "failed to run inline script [ctx._source.day = Date.parse(\"yyyy-MM-dd'T'HH:mm:ss\", ctx._source.datetime, java.util.TimeZone.getTimeZone('UTC')).format('EEEE', java.util.TimeZone.getTimeZone('Europe/London'))] using lang [groovy]" 
     } 
     ], 
     "type": "script_exception", 
     "reason": "failed to run inline script [ctx._source.day = Date.parse(\"yyyy-MM-dd'T'HH:mm:ss\", ctx._source.datetime, java.util.TimeZone.getTimeZone('UTC')).format('EEEE', java.util.TimeZone.getTimeZone('Europe/London'))] using lang [groovy]", 
     "caused_by": { 
     "type": "missing_property_exception", 
     "reason": "No such property: java for class: 1209ff7fb16beac3a71ff2a276ac2225f7c4505b" 
     } 
    }, 
    "status": 500 
} 

雖然它的工作,如果我刪除參考getTimeZone獲取 - 精確的Sense控制檯代碼如下:

POST /rating/_update_by_query 
{ 
    "script": { 
    "inline": "ctx._source.day = Date.parse(\"yyyy-MM-dd'T'HH:mm:ss\", ctx._source.datetime).format('EEEE')" 
    }, 
    "query": { 
    "term": { 
     "_type": "transaction" 
    } 
    } 
} 

我是n確信爲什麼getTimeZone方法失敗。我試過的,而不是「java.util.TimeZone.getTimeZone」

+0

的Java版本下運行? 1.8? –

+0

從文檔中可以看出它說Java 7更新55或更新 – InTooDeep

+0

是的,所以它可能是Java 7或8 ...有8個比7更容易的方法 –

回答

0

的Groovy代碼(用於Java 7),就需要將是非常相似,這種「TimeZone.getTimeZone」:

Date.parse("yyyy-MM-dd'T'HH:mm:ss", ctx._source.datetime, TimeZone.getTimeZone('UTC')) 
    .format('EEEE', TimeZone.getTimeZone("Europe/London")) 
+0

謝謝!如果我從.parse和.format中刪除TimeZone,這將起作用。但是,如果我離開TimeZone出現錯誤,則失敗:沒有這樣的屬性:TimeZone for class:123322031df312eb7093fea2da1f852e31e1a660 – InTooDeep

+0

奇怪...嘗試'java.util.TimeZone.getTimeZone('UTC')'和'java.util.TimeZone.getTimeZone('歐洲/倫敦')' –

+0

不幸的是沒有運氣 - 我已經更新了我的問題。感謝您一直以來的幫助! – InTooDeep

0

好吧,多一點研究讓我明白tim_yates的答案是正確的,我們只需要將所需的Java類加入白名單。

納米$ JAVA_HOME/lib/security中/ java.policy中

,並補充說::我們通過這樣做

許可org.elasticsearch.script.ClassPermission 「java.util.TimeZone中」;

...然後重新啓動ES服務。

請注意,此白名單適用於所有用戶,而不僅限於ES用戶。請參閱:

https://www.elastic.co/guide/en/elasticsearch/reference/2.2/modules-scripting-security.html

相關問題