故事是这样开始~~~
发现数据从消息队列里能看到,但是并没有存入ES。
于是去查看ES日志,果真有报错,报错如下:
elasticsearch.index.mapper.MapperParsingException: failed to parse field [aaa] of type [date] in document with id '1'……
看到
failed to parse field [aaa] of type [date]
于是去es中查询查看test_20200409的mapping信息
GET test_20200409/test/_mapping
aaa的类型就是date
再查看前一天的索引mapping信息
GET test_20200408/test/_mapping
前一天aaa的类型就是text
然后查询了ES相关知识
Mapping,就是对索引库中索引的字段名称及其数据类型进行定义,类似于mysql中的表结构信息。不过es的mapping比数据库灵活很多,它可以动态识别字段。一般不需要指定mapping都可以,因为es会自动根据数据格式识别它的类型,如果你需要对某些字段添加特殊属性(如:定义使用其它分词器、是否分词、是否存储等),就必须手动添加mapping。
然后用
GET _template
查看索引模板里确实提前没有定义aaa的mapping
然后想着20200409哪个日志样本先有的aaa这个字段呢?
{
"size": 0,
"aggs": {
"group_by_aaa": {
"terms": {
"field": "aaa"
}
}
}
}
然后挨个查aaa这个值的详细数据,只有三种
{
"query": {
"bool": {
"must": [
{
"term": {
"aaa": 1511481600000
}
}
]
}
}
}
发现data_1的数据00:00:02入库的,其中aaa='2020-04-07'
然后发现
插入aaa.png
{
"mappings":{
"data":{
"properties":{
"aaa":{
"type":"date"
}
}
}
}
}
然后试着bbb='2020-04-12 00:00:00'
插入bbb.png
{
"mappings":{
"data":{
"properties":{
"aaa":{
"type":"date"
},
"bbb":{
"type":"text",
"fields":{
"keyword":{
"ignore_above":256,
"type":"keyword"
}
}
}
}
}
}
}
于是去官网查了一下
image.png
然后试了一下 ccc= '2020/04/12 00:00:00'
{
"mappings":{
"data":{
"properties":{
"aaa":{
"type":"date"
},
"ccc":{
"format":"yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis",
"type":"date"
},
"bbb":{
"type":"text",
"fields":{
"keyword":{
"ignore_above":256,
"type":"keyword"
}
}
}
}
}
}
}
最后反馈给开发,由于data_1的aaa字段没什么用,就暂时不入库了。
网友评论