如何将动态日期格式应用于 Elasticsearch 中的多种类型?

How can I apply dynamic date formats to multiple types in Elasticsearch?

我正在尝试让 Elasticsearch 将 yyyy-MM-dd HH:mm:ss 格式的字符串识别为日期字段。我创建了一个动态日期格式并将其应用于默认映射。当我索引我的第一种类型的文档时,它工作得很好——任何数据采用这种格式的新字段都被初始化为日期字段。

当我尝试创建新类型的文档时出现问题,但日期格式字段的名称与我的第一个类型中的名称相同。这些失败并出现 格式错误的日期错误

下面是一组用于演示的 Kibana 命令示例:

DELETE /datetest

PUT /datetest

PUT /datetest/_mapping/_default_
{
  "dynamic_date_formats" : ["yyyy-MM-dd HH:mm:ss"]
}

PUT /datetest/doc/1
{
  "date" : "2015-01-01 12:00:00"
}

# This one works fine
PUT /datetest/otherdoc/1
{
  "otherdate" : "2015-01-01 12:00:00"
}

# This one does not
PUT /datetest/otherdoc/2
{
  "date" : "2015-01-01 12:00:00"
}

最后一条命令给出了这个错误: "Invalid format: \"2015-01-01 12:00:00\" is malformed at \" 12:00:00\""

我知道不同类型的同名字段必须具有相同的数据类型,但在这种情况下,我希望它们具有相同的数据类型——日期。我可以为每个新类型手动创建映射,但我希望它自动支持添加到我的源数据中的新类型。这似乎是动态日期格式应该做的。我是不是做错了什么?

我会创建一个自定义动态模板。像这样:

PUT /datetest/_mapping/_default_
{
    "date_detection" : true,
    "dynamic_templates" : [
        {
            "dates" : {
               "match" : ".*date.*",
                "mapping" : {
                    "type" : "date",
                    "format" : 'yyyy-MM-dd HH:mm:ss'
                }
            }
        }
    ]
}

刚刚试过了。它似乎工作。我希望这会有所帮助:)

我能想到的就是添加动态模板:

PUT /datetest
{
  "mappings": {
    "_default_": {
      "date_detection": false,
      "dynamic_templates": [
        {
          "dates": {
            "match": ".*Date|date",
            "match_pattern": "regex",
            "mapping": {
              "type": "date",
              "format": "yyyy-MM-dd HH:mm:ss||dateOptionalTime"
            }
          }
        }
      ]
    }
  }
}

所有三个语句都 运行 就好了:

PUT /datetest/doc/1
{ "date" : "2015-01-01 12:00:00" }
PUT /datetest/otherdoc/1
{ "otherdate" : "2015-01-01 12:00:00" }
PUT /datetest/otherdoc/2
{ "date" : "2015-01-01 12:00:00" }

动态模板将尝试根据基本模式匹配您的字段名称。他们需要以 dateDate.

结尾

我知道您只需要 yyyy-MM-dd HH:mm:ss 格式,但我还添加了默认格式,以便 Elasticsearch 可以从多个格式中选择一个。