是时候用 ES 拯救发际线啦

es 将默认的日期匹配设置为seconds-since-the-epoch

Elasticsearch | 作者 shwtz | 发布于2017年12月26日 | 阅读数:8893

根据官网的对于date类型的解释,默认情况下,es能够解析以下两种类型的数据匹配成date类型:
"strict_date_optional_time||epoch_millis"
前者是严格的日期格式字符串,后者是13位的long型毫秒数。
 
而如果不指定该字段为date类型,貌似只能动态匹配严格日期格式的字符串。

如何修改默认的动态匹配,让整型的秒数(seconds-since-the-epoch)也能被识别成为date类型呢?

原本想利用
{
"mappings": {
"_default_": {
"dynamic_date_formats": "epoch_second"
}
}
}

发现dynamic_date_formats仅仅是这对字符串的格式有效的,无法指定数字。
但是如果使用
"mappings": {
"_default_": {
"dynamic_templates": [
{
"DateTime": {
"match": "*Time",
"match_mapping_type": "long",
"mapping": {
"type": "date",
"format": "epoch_second"
}
}
}
]
}
}

则会把不想变成date型的数值型,比如1位整数,5位整数也变成date,这样也不对。

我只想改变10位的整数,识别成date。
已邀请:

shwtz - 学物理想做演员的IT男

赞同来自:

问题算是解决了,至少自己弄清楚怎么解决。
 
其实问题提的不对,或者说我当时对mappings的机制还不是很理解。
 
其实只要在mapping中定义了字段的类型和格式,那么es识别的时候肯定会按照定义好的mapping去识别。前提就是:插入的数据确实是往定义了mapping的index中插入!
也就是说:如果你的数据确实是插入到定义了mapping的index中,所有的mapping一定会起作用。
 
问题在于,在动态索引插入数据时,尚不能确定该数据要插入哪一个index,也许动态生成的索引并没有已经定义的mapping,所以看上去mapping就没用。
我的情况就是我用了一个dataTime字段,10位整数,我按照这字段动态生成index,也就是每次的index都是xxx_YYYY.MM.dd的格式,为了识别dataTime,我定义mapping为 "dataTime": {"type": "date"},这样显然是无效的。因为mapping要生效,首先要确定是不是同一个index。我的dataTime不是日期型,无法转化成年月日的形式,也就无法对应到我定义了mapping的index(xxx_YYYY.MM.dd),无法识别该类型,有点本末倒置了。
 
所以归根结底,当你要进行mapping定义的字段刚好是动态索引的来源时,mapping往往还没生效,就报错了。因为你的动态索引在识别该字段类型的时候找不到index的mapping。

要回复问题请先登录注册