ElasticSearch版本:6.3
映射定义:
ES_DOCTYPE = {
"properties": {
"UsageEndDate": {"type": "date", "format": "YYYY-MM-dd HH:mm:ss"},
"UsageStartDate": {"type": "date", "format": "YYYY-MM-dd HH:mm:ss"}
}
}
json数据:
{
'UsageEndDate': '2018-08-01 02:00:00',
'UsageStartDate': '2018-08-01 01:00:00'
}
{
'UsageEndDate': '2018-08-02 02:00:00',
'UsageStartDate': '2018-08-02 01:00:00'
}
创建索引:
es.index(index="test", doc_type='test', body=ES_DOCTYPE)
发送数据:
helpers.streaming_bulk(es, documents(), index="test", doc_type='test', chunk_size=1000)
嗨我做了我的工作谷歌搜索周围,但也许关键字太一般,所以我没有得到太多。
当我阅读文档时,ES应该能够自动找到日期格式,但即使我添加了映射定义,当我在Kibana中查看它们时,那些UsageStartDate
或UsageEndDate
仍显示为string
。
有什么我想念的吗?
非常感谢你 :)
我自己弄清楚了,
dynamicTemplate = {
"properties": {
"UsageEndDate": {"type": "date", "format": "YYYY-MM-dd HH:mm:ss"},
"UsageStartDate": {"type": "date", "format": "YYYY-MM-dd HH:mm:ss"}
}, "dynamic_templates": [
{
"notanalyzed": {
"match": "*",
"match_mapping_type": "string",
"mapping": {
"type": "string",
"index": "not_analyzed"
}
}
}
]
}
首先放置映射定义,然后将数据发送到ElasticSearch
es.indices.put_mapping(index="test", doc_type='test', body={'test': dynamicTemplate})
es.index(index='test-index', doc_type='tweet', body=ES_DOCTYPE)
According to the docs ElasticSearch以下列方式与date
一起使用。在内部,它将它们存储为一个长数字,表示自那个时代以来的毫秒数。对于输出日期将始终呈现为字符串。
从文档中引用:
JSON没有日期数据类型,因此Elasticsearch中的日期可以是:
- 包含格式化日期的字符串“2015-01-01”或“2015/01/01 12:10:30”。
- 一个代表毫秒以来的长数字。
- 表示自纪元以来秒数的整数。
在内部,日期转换为UTC(如果指定了时区)并存储为表示自纪元以来毫秒的长数。
日期查询在内部转换为此长表示的范围查询,聚合和存储字段的结果将转换回字符串,具体取决于与字段关联的日期格式。