2016-10-10 243 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

相关问题