我需要使用新字段更新特定类型的现有文档。该新字段应设置为文档中由日期时间字段给出的日期的当地日期名称。日期时间字段的格式为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”
的Java版本下运行? 1.8? –
从文档中可以看出它说Java 7更新55或更新 – InTooDeep
是的,所以它可能是Java 7或8 ...有8个比7更容易的方法 –