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 之前减少秒和毫秒。
在我们的项目中,我们使用 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 之前减少秒和毫秒。