我正在尝试让Elasticsearch将\b
格式的字符串识别为日期字段。我已经创建了一个动态日期格式并将其应用于默认映射。当我索引我的第一个类型的文档时,它工作得很好 - 任何以这种格式数据的新字段都被初始化为日期字段。
当我尝试创建新类型的文档时出现问题,但日期格式字段的名称与我的第一个类型相同。这些错误导致格式错误的日期错误。
以下是一组用于演示的Kibana命令示例:
yyyy-MM-dd HH:mm:ss
最后一个命令出现此错误:
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"
}
我知道不同类型的同名字段必须具有相同的数据类型,但在这种情况下,我希望它们具有相同的数据类型 - 日期。我可以为每种新类型手动创建映射,但我希望它能自动支持添加到源数据中的新类型。它似乎是动态日期格式应该做的。我在这里做错了吗?
答案 0 :(得分:1)
我会创建一个自定义动态模板。像这样:
PUT /datetest/_mapping/_default_
{
"date_detection" : true,
"dynamic_templates" : [
{
"dates" : {
"match" : ".*date.*",
"mapping" : {
"type" : "date",
"format" : 'yyyy-MM-dd HH:mm:ss'
}
}
}
]
}
试过了。它似乎工作。我希望这会有所帮助:)
答案 1 :(得分:1)
我能想到的,就是添加动态模板:
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" }
动态模板将尝试匹配基于模式的字段名称。他们需要以日期或日期结束。
我知道您只需要yyyy-MM-dd HH:mm:ss
格式,但我也添加了默认格式,以便Elasticsearch可以从多个格式中选择一个。