在Elasticasearch脚本中无法识别日期时间区域ID“美国”

时间:2018-07-07 04:57:47

标签: elasticsearch groovy

我有一个针对酒店位置的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"
          }
        }
      },
.
.
.

2 个答案:

答案 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为两个单独的关键字AmericaNew_York

我做了

  • 备份旧索引
  • 使用新映射创建新索引,将timeZoneId字段设置为not_analysed(关键字)
  • 将所有数据推送到新索引
  • 现在doc['timezone.timeZoneId'].value在脚本中返回America/New_York

希望这可以帮助其他人。感谢您的讨论。