我有一个针对酒店位置的Elasticsearch索引,其时区详细信息如下
{
"location":"1",
.
.
.
"timezone": {
"timeZoneName": "Eastern Daylight Time",
"rawOffset": -18000,
"timeZoneId": "America/New_York",
"dstOffset": 3600,
"status": "OK"
}
}
我正在使用Elasticsearch脚本中的时区详细信息来过滤文档。
def current_date = new Date();
def loc_date = current_date.setZone(org.joda.time.DateTimeZone.forID(doc['timezone.timeZoneId'].value));
def day=loc_date.format('EEEE').toString().toLowerCase();
当我在Elasticsearch脚本(Groovy)中使用时区详细信息时,它会抛出错误以下消息
"type": "script_exception",
"reason": "failed to run indexed script [uc-time-test38] using lang [groovy]",
"caused_by": {
"type": "illegal_argument_exception",
"reason": "The datetime zone id 'america' is not recognised"
}
看起来像 doc ['timezone.timeZoneId']。value 的只是返回美国,而不是美国/纽约
试图将 doc ['timezone.timeZoneId']。value 转换为字符串 doc ['timezone.timeZoneId']。value.toString(),但问题仍然存在保持不变。
我的Elasticsearch版本是2.3
使用America/New_York
搜索时,索引查询也不给出结果
以下查询将返回所有结果
{
"query": {
"bool": {
"must": {
"term": {
"timezone.timeZoneId": "america"
}
}
}
}
}
但这给出了0个结果
{
"query": {
"bool": {
"must": {
"term": {
"timezone.timeZoneId": "America/New_York"
}
}
}
}
}
ES映射
.
.
.
"timezone": {
"properties": {
"timeZoneName": {
"type": "string"
},
"rawOffset": {
"type": "long"
},
"timeZoneId": {
"type": "string"
},
"dstOffset": {
"type": "long"
},
"status": {
"type": "string"
}
}
},
.
.
.
答案 0 :(得分:0)
@Grab(group='joda-time', module='joda-time', version='2.9.9')
import org.joda.time.DateTimeZone
//this line prints America/New_York
println DateTimeZone.forID('America/New_York')
//this one throws exception
//java.lang.IllegalArgumentException: The datetime zone id 'America' is not recognised
println DateTimeZone.forID('America')
所以问题出在数据的某处
答案 1 :(得分:0)
解决了。问题在于保存的时区ID。分析了timeZoneId字段,这就是为什么假设字符串America/New_York
为两个单独的关键字America
和New_York
。
我做了
doc['timezone.timeZoneId'].value
在脚本中返回America/New_York
希望这可以帮助其他人。感谢您的讨论。