当我尝试索引文档时,我收到以下异常。
Caused by: org.elasticsearch.index.mapper.MapperParsingException: failed to parse date field [J], tried both date format [dateOptionalTime], and timestamp number with locale []
这一切都是正确的,但是可以忽略异常并将其余字段编入索引吗?
答案 0 :(得分:9)
我认为这可以通过在字段映射中添加“ignore_malformed”标志而无需重新索引来完成。这是我尝试过的,它起作用了:
POST events
{
"mappings" : {
"dates" : {
"properties" : {
"lenient_date" : {
"type" : "date"
}
}
}
}
}
PUT events/dates/1
{
"lenient_date" : "1/32/2014"
}
结果:解析错误(如预期的那样)
{
"error": "MapperParsingException[failed to parse [lenient_date]]; nested: MapperParsingException[failed to parse date field [1/32/2014], tried both date format [dateOptionalTime], and timestamp number with locale []]; nested: IllegalArgumentException[Invalid format: \"1/32/2014\" is malformed at \"/32/2014\"]; ",
"status": 400
}
获取活动/日期/ 1 结果:找不到日期(按预期)
{
"_index": "events",
"_type": "dates",
"_id": "1",
"found": false
}
PUT events/dates/_mapping
{
"dates" : {
"properties" : {
"lenient_date" : {
"type" : "date",
"ignore_malformed" : true
}
}
}
}
PUT events/dates/1
{
"lenient_date" : "1/32/2014"
}
GET events/dates/1
Result: now works
{
"_index": "events",
"_type": "dates",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"lenient_date": "1/32/2014"
}
}
我正在运行ES版本1.3.2。我还没有检查更新的映射如何影响排序和过滤。
答案 1 :(得分:1)
实际上,您可以获得此异常,因为您将此字段映射为日期,或者ElasticSearch将此字段动态标识为日期(您用于创建索引的第一个文档具有此字段的日期值)。
您不能忽略此异常并将其他信息编入索引,因为该文档与定义的映射不匹配。
有几种情况:
事实上,您在此字段中没有日期值:您可以将映射修复为您真正需要的内容。
您在此字段中有日期值,但根据弹性搜索日期格式,它不是有效日期:您可以将此格式添加到默认使用的格式(使用dynamic_date_formats)或定义特定日期该字段format。
您有时会有日期值,有时是字符串值:如果它符合您的需要,您可以将映射设置为字符串以防止发生此异常。您不会解析异常,因为它不会被解析为日期,但例如,无法在此字段上执行范围查询。