ElasticSearch 映射:是否可以自动截断日期以适合其格式?

ElasticSearch Mapping: is it possible to auto-truncate a date to fit it's format?

在我们的项目中,我们使用 NEST 将数据插入 ElasticSearch (1.7)。我们希望能够强制 ES 将所有日期截断为映射格式。

映射示例:

"dateFrom" : { 
  "type": "date",
  "format": "dateHourMinute" // Or yyyy-MM-dd'T'HH:mm
}

数据示例:

{
  "dateFrom" : 2015-12-21T15:55:00.000Z
}

插入此数据会引发 IllegalArgumentException:

Invalid format: "2015-12-21T15:55:00.000Z" is malformed at ":00.000Z"

显然我们不需要日期的最后一部分。我们不能将 ES 配置为只截断它而不是出错吗?

请记住,我们现在使用的是 1.7,因为日期格式在最近的版本中似乎发生了变化...

为了让数据正确索引,我可以将数据类型更改为 date_optional_time(在 1.7 中支持)

PUT my_index
{
  "mappings": {
    "my_type": {
      "properties": {
        "date": {
          "type":   "date",
          "format": "date_optional_time"
        }
      }
    }
  }
}

这将允许您提供可选的日期和时间。

如:

PUT /my_index/my_type/1
{
   "date": "2015-12-21"
}

或者如你所愿

PUT /my_index/my_type/2
{
   "date": "2015-12-21T15:55:00.000Z"
}

两者现在都是有效的提交。我不知道 ES 中有任何转换方法来支持索引时字段数据的截断或转换。我想如果你想解析数据并删除提交前的时间,你需要在创建 JSON 对象时在 ES 之外执行此操作。

ES 目前似乎无法通过自定义映射编辑日期。我们最终使用 JsonConverters(如 this)在将它们插入 ES 之前减少秒和毫秒。