[英]In Elasticsearch, how can I apply a timezone to a scripted date operation?
通过下面的聚合并使用ES5,我想根据给定的时区(作为TZ数据库中的标识符提供)获取dayOfWeek和hourOfDay。
如何编辑"doc['created'].date.dayOfWeek'
来调整偏移量?
aggs: {
dayOfWeek: {
terms: {
script: {
inline: "doc['created'].date.dayOfWeek",
lang: 'painless',
},
},
aggs: {
hourOfDay: {
terms: {
script: {
inline: "doc['created'].date.hourOfDay",
lang: 'painless',
},
},
},
},
},
},
找到使用无痛的解决方案。 因为他们正在将弹性搜索从Joda迁移到本机java.time,所以对Joda的支持并不好无痛。
{
"size": 0,
"aggregations": {
"dayOfWeek": {
"terms": {
"script": {
"inline": "Instant.ofEpochMilli(doc.created.date.millis).atZone(ZoneId.of(params.tz)).dayOfWeek",
"params": {
"tz": "Europe/London"
}
}
},
"aggs": {
"hourOfDay": {
"terms": {
"script": {
"inline": "Instant.ofEpochMilli(doc.created.date.millis).atZone(ZoneId.of(params.tz)).hour",
"params": {
"tz": "Europe/London"
}
}
}
}
}
}
}
}
这样的事情应该有效:
{
"size": 0,
"aggregations": {
"dayOfWeek": {
"terms": {
"script": {
"inline": "doc['created'].date.setZone(org.joda.time.DateTimeZone.forID(tz)); doc['created'].date.dayOfWeek",
"lang": "groovy",
"params": {
"tz": "Europe/London"
}
}
},
"aggs": {
"hourOfDay": {
"terms": {
"script": {
"inline": "doc['created'].date.setZone(org.joda.time.DateTimeZone.forID(tz)); doc['created'].date.hourOfDay",
"lang": "groovy",
"params": {
"tz": "Europe/London"
}
}
}
}
}
}
}
}
您可能需要通过将script.engine.groovy.inline.aggs: on
添加到elasticsearch.yml文件来为groovy启用内联脚本。 请参阅: 此讨论 。
注意。 以上内容不适用于无痛,因为它被锁定并且不允许您编辑白名单。 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.