在Elasticsearch中建立索引时映射异常

时间:2014-08-12 05:58:12

标签: java elasticsearch

当我尝试索引文档时,我收到以下异常。

Caused by: org.elasticsearch.index.mapper.MapperParsingException: failed to parse date field [J], tried both date format [dateOptionalTime], and timestamp number with locale []

这一切都是正确的,但是可以忽略异常并将其余字段编入索引吗?

2 个答案:

答案 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

  • 您有时会有日期值,有时是字符串值:如果它符合您的需要,您可以将映射设置为字符串以防止发生此异常。您不会解析异常,因为它不会被解析为日期,但例如,无法在此字段上执行范围查询。