首页 > 其他分享 >ES 时间格式

ES 时间格式

时间:2023-08-11 11:23:47浏览次数:48  
标签:index 01 company income 时间 2023 date 格式 ES

ES中的日期类型

Elasticsearch 在索引创建之前并不是必须要创建索引的mapping。关系型数据库的思维就是在于写入数据之前,并不强制创建表结构。我们不用事先声明字段名称,字段类型以及长度等属性就可以直接向一个不存在的表中直接写入数据。

Elasticsearch把这种特性称之为dynamic mapping,也就是自动映射。Elasticsearch会根据你写入的字段的内容动态去判定字段的数据类型,这种自动映射的机制存在一些缺陷,比如在Elasticsearch中没有隐式类型转换,所以在自动映射的时候就会把字段映射为较宽的数据类型。比如你写入一个数字50,系统就会自动给你映射成long类型,而不是int 。一般企业中用于生产的环境都是使用手工映射,能保证按需创建以节省资源和达到更高的性能。

案例

假如我们有如下索引companys,其中date字段包含多种日期的格式,“yyyy-MM-dd”还有时间戳。如果按照dynamic mapping,采取自动映射器来映射索引。我们自然而然的都会感觉字段应该是一个date类型。

POST companys/_bulk
{"index":{}}
{"date": "2023-01-25 10:01:12", "company": "中国烟草", "income": 5700000}
{"index":{}}
{"date": "2023-01-25 10:01:13", "company": "华为", "income": 4034113.182}
{"index":{}}
{"date": "2023-01-26 10:02:11", "company": "苹果", "income": 7784.7252}
{"index":{}}
{"date": "2023-01-26 10:02:15", "company": "小米", "income": 185000}
{"index":{}}
{"date": "2023-01-26 10:01:23", "company": "阿里", "income": 1072526}
{"index":{}}
{"date": "2023-01-27 10:01:54", "company": "腾讯", "income": 6500}
{"index":{}}
{"date": "2023-01-28 10:01:32", "company": "蚂蚁金服", "income": 5000}
{"index":{}}
{"date": "2023-01-29 10:01:21", "company": "字节跳动", "income": 10000}
{"index":{}}
{"date": "2023-01-30 10:02:07", "company": "中国石油", "income": 18302097}
{"index":{}}
{"date": "1648100904", "company": "中国石化", "income": 32654722}
{"index":{}}
{"date": "2023-11-1 12:20:00", "company": "国家电网", "income": 82950000}

查看companys索引的mapping,会发现date被映射成text类型了

GET  companys/_mapping
{
"companys" : {
  "mappings" : {
    "properties" : {
      "company" : {
        "type" : "text",
        "fields" : {
          "keyword" : {
            "type" : "keyword",
            "ignore_above" : 256
          }
        }
      },
      "date" : {
        "type" : "text",
        "fields" : {
          "keyword" : {
            "type" : "keyword",
            "ignore_above" : 256
          }
        }
      },
      "ratal" : {
        "type" : "long"
      }
    }
  }
}
}

原因

原因就在于对时间类型的格式的要求是绝对严格的。要求必须是一个标准的UTC时间类型。上述字段的数据格式如果想要使用,就必须使用yyyy-MM-ddTHH:mm:ssZ格式(其中T个间隔符,Z代表 0 时区),以下均为错误的时间格式(均无法被自动映射器识别为日期时间类型):

  • yyyy-MM-dd HH:mm:ss

  • yyyy-MM-dd

  • 时间戳

坑一

看下面的索引通过自动映射把tmCreate字段会被映射成什么类型

PUT  test_es/_doc/1
{
"tmCreate":"2023-7-12T14:00:00Z"
}
GET test_es/_mapping

image-20230713140654328

  • 2023-7-12T14:00:00Z 错误

  • 2023-07-12T14:00:00Z 正确

坑二

手工映射了日期类型,还是插入失败

PUT companys2
{
"mappings": {
  "properties": {
    "date": {
      "type": "date"
    }
  }
}
}
POST companys2/_bulk
{"index":{}}
{"date": "2023-01-30 10:02:07", "company": "中国石油", "income": 18302097}
{"index":{}}
{"date": "1648100904", "company": "中国石化", "income": 32654722}
{"index":{}}
{"date": "2023-11-1T12:20:00Z", "company": "国家电网", "income": 82950000}
{"index":{}}
{"date": "2023-01-30T10:02:07Z", "company": "中国石油", "income": 18302097}
{"index":{}}
{"date": "2023-01-25", "company": "中国烟草", "income": 5700000}
  • 第一个(写入失败):2023-01-30 10:02:07

  • 第二个(写入成功):1648100904

  • 第三个(写入失败):2023-11-1T12:20:00Z

  • 第四个(写入成功):2023-01-30T10:02:07Z

  • 第五个(写入成功):2023-01-25

解决办法

对日期类型的字段增加一个属性

"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"

PUT  companys/
{
"mappings": {
  "properties": {
    "date":{
      "type": "date",
      "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
    },
    "company":{
      "type": "keyword"
    },
    "ratal":{
      "type": "scaled_float",
      "scaling_factor": 100
    }
  }
}
}
 

标签:index,01,company,income,时间,2023,date,格式,ES
From: https://www.cnblogs.com/lovezhr/p/17622559.html

相关文章

  • KubeSphere 部署 Zookeeper 实战教程
    前言知识点定级:入门级如何利用AI助手辅助运维工作单节点Zookeeper安装部署集群模式Zookeeper安装部署开源应用选型思想实战服务器配置(架构1:1复刻小规模生产环境,配置略有不同)主机名IPCPU内存系统盘数据盘用途ks-master-0192.168.9.9148501......
  • typeScript学习-TS类型-null和undefined
    typeScript学习null和undefinedundefinedanyunknown 可以接受undefinedletdata:undefined=undefinedletdata2:any=undefinedletdata3:unknown=undefined nullanyunknown 可以接受nullletdata4:null=nullletdata5:any=nullletd......
  • PostgreSQL autovacuum 5 怎么监控(autovacuum 扫描表工作的百分比)
    PostgreSQL最大的问题就是vacuum,只要PG的实现多版本和UNDO的方式不改变,那么这个话题就会一直继续,到永远。前面四期讲了autovacuum的触发条件,源代码,怎么调整参数,优化,今天最后一章,的说说怎么进行监控,并且评定你的autovacuum的工作是合格的。下面的内容主要是基于几点来围绕的监......
  • PostgreSQL 查看表膨胀与索引膨胀 SQL
    查看表膨胀TOP5SELECTcurrent_database()ASdb,schemaname,tablename,reltuples::bigintAStups,relpages::bigintASpages,otta,ROUND(CASEWHENotta=0ORsml.relpages=0ORsml.relpages=ottaTHEN0.0ELSEsml.relpages/otta::numericEND,1)AStbloat,CASE......
  • pg_table_size,pg_relation_size和pg_total_relation_size有什么区别? (PostgreSQL)
    # SELECT pg_relation_size(20306, 'main') AS main, pg_relation_size(20306, 'fsm') AS fsm, pg_relation_size(20306, 'vm') AS vm, pg_relation_size(20306, 'init') AS init, pg_table_size(20306), pg_indexes_size(20306)......
  • 文档控件DevExpress Office File API v23.1新版亮点 - 支持.NET MAUI
    DevExpressOfficeFileAPI是一个专为C#,VB.NET和ASP.NET等开发人员提供的非可视化.NET库。有了这个库,不用安装MicrosoftOffice,就可以完全自动处理Excel、Word等文档。开发人员使用一个非常易于操作的API就可以生成XLS,XLSx,DOC,DOCx,RTF,CSV和SnapReport等企业级文......
  • TypeScript第三章
    TypeScript是一个由微软开发的开源编程语言,它是JavaScript的超集,意味着TypeScript包含了JavaScript的所有特性,同时还提供了一些新的特性和语法糖。TypeScript可以帮助开发者在开发大型应用时提高代码可维护性、可读性和可靠性。本文将介绍TypeScript的一些进阶使用方法,并......
  • 【JAVA】 将csv格式文件转换为pdf格式文件
    publicvoidcsvtopdf(){StringcsvFilePath="E:/tmp/output.csv";StringpdfFilePath="E:/tmp/outputPdf.pdf";try{Documentdocument=newDocument();PdfWriter.getInstance(document,newFileOutputStr......
  • 制造执行系统(MES):优化生产管理的关键
       制造业是现代经济的重要组成部分,随着技术的发展和市场需求的变化,制造企业面临着越来越大的挑战。为了在竞争激烈的市场中保持竞争力,企业需要实现生产过程的高效管理和优化。这就引入了制造执行系统(MES),这是一种关键的信息技术工具,可以帮助企业实现生产过程的监控、协调和优......
  • ES多条件权重查询
    在Elasticsearch中,minimum_should_match是一个查询参数,通常用于控制在使用bool查询中的should子句(也称为OR查询)时,必须匹配的最低子句数量。这可以用来控制查询的严格程度,确保只有在满足特定条件的子句数量达到一定阈值时,文档才会被匹配。minimum_should_match参数可以以多种方式......