[ELK实战] 开发中的哪些坑

简介: 在Elasticsearch中,时间类型是一个非常容易踩坑的数据类型,不按照严格的时间格式,会被识别成text类型ES对时间类型的格式的要求是绝对严格的。要求必须是一个标准的UTC时间类型 必须使用yyyy-MM-ddTHH:mm:ssZ格式(其中T个间隔符,Z代表 0 时区)

方法 / 步骤

一: 优雅地解决ES字段类型错误问题

在Elasticsearch中,时间类型是一个非常容易踩坑的数据类型,不按照严格的时间格式,会被识别成text类型
ES对时间类型的格式的要求是绝对严格的。要求必须是一个标准的UTC时间类型 必须使用yyyy-MM-ddTHH:mm:ssZ格式(其中T个间隔符,Z代表 0 时区)

1.1 提前手工映射日期类型

需要通过手工映射方式在索引创建之前指定为日期类型,使用自动映射器无法映射为日期类型。

"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis",这样就可以避免因为数据格式不统一而导致数据无法写入的窘境
PUT test_index
{
  "mappings": {
    "properties": {
      "time": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
      }
    }
  }
}

如果版本在7.11.x及以上版本可以有下面的方案

1.2 runtime_fields 重新定义的字段

❗❗ 实测可用,但做聚合查询会有性能影响,推荐开始时候就定义好准确的字段

  • 在不重新索引数据的情况下向现有文档添加字段
  • 在不了解数据结构的情况下开始处理数据
  • 在查询时覆盖从索引字段返回的值
  • 为特定用途定义字段而不修改底层架构
GET task1/_search
{
  "size": 0,
  "runtime_mappings": {
    "day_of_week": {
      "type": "keyword",
      "script": "emit(doc['time'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL,Locale.ROOT))"
    },
    "time": {
      "type": "date",
      "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
    }
  },
  "aggs": {
    //1:按照周统计地震信息,也就是每周有几天地震了
    "week_agg": {
      "date_histogram": {
        "field": "time",
        "calendar_interval": "week"
      },
      "aggs": {
        "week_avg_magnitude": {
          "avg": {
            "field": "magnitude"
          }
        }
      }
    },
    //一周中的每一天的震级
    "day_of_week_magnitude":{
      "terms": {
        "field": "day_of_week"
      },
      "aggs": {
        //2: 一周中每一天的平均地震等级
        "day_of_week_avg_magnitude": {
          "avg": {
            "field": "magnitude"
          }
        }
      }
    }
  }
}

此段代码中,其核心代码如下

"runtime_mappings": {
    "day_of_week": {
      "type": "keyword",
      "script": "emit(doc['time'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL,Locale.ROOT))"
    },
    "time": {
      "type": "date",
      "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
    }
  }

其在runtime_mappings 中定义了两个“新字段”,即day_of_week和time,其中day_of_week利用运行时字段中执行脚本进行动态计算,从而得出每天分别是一周内的星期几。这种用法可用于各种其他复杂的运算。

而time字段则是对原有字段进行重新映射,改变其原有字段的类型和其他属性,如format,使其原本不支持的时间类型变为支持。

参考资料 & 致谢

[1] ES 中时间日期类型

目录
相关文章
|
数据可视化 前端开发 网络协议
分布式实战 | 第一篇 :ELK在开源全栈项目【有来商城】的应用,不仅仅是分布式日志收集(一)
分布式实战 | 第一篇 :ELK在开源全栈项目【有来商城】的应用,不仅仅是分布式日志收集(一)
|
Linux 开发工具 git
【开发专题_03】unable to access ‘https://github.com/deviantony/docker-elk.git/‘: Failed connect to github
【开发专题_03】unable to access ‘https://github.com/deviantony/docker-elk.git/‘: Failed connect to github
316 2
|
消息中间件 存储 监控
SpringCloud微服务实战——搭建企业级开发框架(三十八):搭建ELK日志采集与分析系统
一套好的日志分析系统可以详细记录系统的运行情况,方便我们定位分析系统性能瓶颈、查找定位系统问题。上一篇说明了日志的多种业务场景以及日志记录的实现方式,那么日志记录下来,相关人员就需要对日志数据进行处理与分析,基于E(ElasticSearch)L(Logstash)K(Kibana)组合的日志分析系统可以说是目前各家公司普遍的首选方案。 • Elasticsearch: 分布式、RESTful 风格的搜索和数据分析引擎,可快速存储、搜索、分析海量的数据。在ELK中用于存储所有日志数据。
746 57
SpringCloud微服务实战——搭建企业级开发框架(三十八):搭建ELK日志采集与分析系统
|
自然语言处理 Java 开发工具
实战:ELK环境部署并采集springboot项目日志
实战:ELK环境部署并采集springboot项目日志
|
消息中间件 存储 Kubernetes
干货:分享一个具有高可用性和可伸缩性的ELK架构实战案例
干货:分享一个具有高可用性和可伸缩性的ELK架构实战案例
352 0
|
前端开发 安全 Java
分布式实战 | 第一篇 :ELK在开源全栈项目【有来商城】的应用,不仅仅是分布式日志收集(二)
分布式实战 | 第一篇 :ELK在开源全栈项目【有来商城】的应用,不仅仅是分布式日志收集(二)
|
消息中间件 存储 SQL
【ELK解决方案】ELK集群+RabbitMQ部署方案以及快速开发RabbitMQ生产者与消费者基础服务
大概一年多前写过一个部署ELK系列的博客文章,前不久刚好在部署一个ELK的解决方案,我顺便就把一些基础的部分拎出来,再整合成一期文章。大概内容包括:搭建ELK集群,以及写一个简单的MQ服务。
796 0
【ELK解决方案】ELK集群+RabbitMQ部署方案以及快速开发RabbitMQ生产者与消费者基础服务
|
搜索推荐 索引
[ELK实战] Elasticsearch 聚合查询二: Bucketing/桶聚合
目前在[官方文档]有4种聚合(Aggregations )方式分别是: 1. Metric (指标聚合): 最常用的聚合方式例如 平均值,求和等等 3. Bucketing (桶聚合): 就是常说的分组聚合 5. Matrix (矩阵聚合) : 在多个字段上操作并根据从请求的文档字段提取的值生成矩阵结果的聚合族。与度量聚合和桶聚合不同,此聚合族尚不支持脚本。 7. Pipeline (管道聚合
405 0
[ELK实战] Elasticsearch 聚合查询二: Bucketing/桶聚合
|
存储 缓存 Prometheus
ELK 性能优化实战
ELK 性能优化实战