草庐IT

ES日期时间格式化参数集锦

我的身前一尺是我的世界 2023-07-10 原文

目录

目标

ES版本信息

官方文档

相关术语

内置格式常用参数

epoch_millis(毫秒级时间戳格式)

epoch_second(秒级时间戳格式)

date_optional_time或者strict_date_optional_time

basic_date(yyyyMMdd格式)

basic_date_time(yyyyMMdd'T'HHmmss.SSSZ格式)

basic_date_time_no_millis(yyyyMMdd'T'HHmmssZ格式)

basic_ordinal_date(yyyyDDD格式)

basic_ordinal_date_time(yyyyDDD'T'HHmmss.SSSZ格式)

basic_ordinal_date_time_no_millis(yyyyDDD'T'HHmmssZ格式)

basic_time(HHmmss.SSSZ格式)

basic_time_no_millis(HHmmssZ格式)

basic_t_time(HHmmssZ格式)

date或者strict_date

date_hour_minute_second或者strict_date_hour_minute_second

自定义格式示例

yyyy-MM-dd HH:mm:ss格式


目标

熟悉自定义日期格式,掌握内置日期格式参数。


ES版本信息

7.17.5


官方文档

formathttps://www.elastic.co/guide/en/elasticsearch/reference/7.17/mapping-date-format.html


相关术语

格式化

在JSON文档中,日期表示为字符串。Elasticsearch使用一组预配置的格式来识别这些字符串并将其解析为一个long值,该值表示UTC中的毫秒数。

自定义格式

根据需求要求来自定义日期和时间格式。

内置格式

使用ES自带的参数来规范时间和日期。

严格的日期格式

  1. 年使用4位数字;
  2. 月使用2位数字;
  3. 日使用2位数字;

例如:像这样的日期5/11/1将被视为无效,需要重写才能2005/11/01被日期解析器接受。很多参数支持加上strict_前缀,表示需要这种严格的格式。
作用:配置动态映射,确保不会将不想关的字符串类型的字段映射成日期类型。

UTC

常用的一种时间格式。yyyy-MM-dd'T'HH:mm:ss.SSSZ是UTC的标准格式。'T'是日期和时间的分隔符。SSS表示纳秒。Z表示时区,+表示东区,-表示西区。如东八区用+08:00表示,西五区用-05:00表示。

纳秒

1000000000纳秒=1x10^9纳秒=1秒


内置格式常用参数

epoch_millis(毫秒级时间戳格式)

作用:自纪元以来的毫秒数的格式化程序。

PUT /epoch_millis_db
{
  "mappings": {
    "properties": {
      "timeTest": {
        "type": "date",
        "format": "epoch_millis"
      }
    }
  }
}

PUT /epoch_millis_db/_doc/1
{
  "timeTest": "1659801198",
  "timeTest2": "1659799518",
  "timeTest3": "2020-01-01",
  "timeTest4": "2020/01/01"

}

#只有timeTest2不是date类型。
GET /epoch_millis_db/_mapping

epoch_second(秒级时间戳格式)

作用

自纪元以来的秒数的格式化程序。

PUT /epoch_second_db
{
  "mappings": {
    "properties": {
      "timeTest": {
        "type": "date",
        "format": "epoch_second"
      }
    }
  }
}

PUT /epoch_second_db/_doc/1
{
  "timeTest": "1659801198",
  "timeTest2": "1659799518",
  "timeTest3": "2020-01-01",
  "timeTest4": "2020/01/01"

}

#只有timeTest2不是date类型。
GET /epoch_second_db/_mapping

date_optional_time或者strict_date_optional_time

date_optional_time作用

一个通用的ISO日期时间解析器,必须至少包括年份。格式yyyy-MM-dd'T'HH:mm:ss.SSSZyyyy-MM-dd

strict_date_optional_time作用

一个通用的ISO日期时间解析器,必须至少包括年份。要求严格日期格式。格式yyyy-MM-dd'T'HH:mm:ss.SSSZyyyy-MM-dd

PUT /date_optional_time_db
{
  "mappings": {
    "properties": {
      "timeTest": {
        "type": "date",
        "format": "date_optional_time"
      },
      "timeTest2": {
        "type": "date",
        "format": "date_optional_time"
      },
      "timeTest3": {
        "type": "date",
        "format": "strict_date_optional_time"
      },
      "timeTest4": {
        "type": "date",
        "format": "strict_date_optional_time"
      },
      "timeTest5": {
        "type": "date",
        "format": "strict_date_optional_time"
      }
    }
  }
}

GET /date_optional_time_db/_mapping

#timeTest2和timeTest4:东八区(北京时间)2022年5月3日下午5点30分8秒
#timeTest5:西五区2022年5月3日下午5点30分8秒91纳秒
PUT /date_optional_time_db/_doc/1
{
  "timeTest": "22-05-03",
  "timeTest2": "22-5-3T17:30:08+08:00",
  "timeTest3": "2004-05-03T17:30:08",
  "timeTest4": "2022-05-03T17:30:08+08:00",
  "timeTest5": "2022-05-03T17:30:08.91-05:00"
}

basic_date(yyyyMMdd格式)

作用

约束字段格式必须是yyyyMMdd类型。

PUT /basic_date_db
{
  "mappings": {
    "properties": {
      "timeTest": {
        "type": "date",
        "format": "basic_date"
      }
    }
  }
}

GET /basic_date_db/_mapping

PUT /basic_date_db/_doc/1
{
  "timeTest": "20220503"
}

basic_date_time(yyyyMMdd'T'HHmmss.SSSZ格式)

作用

约束字段格式必须是yyyyMMdd'T'HHmmss.SSSZ类型。'T'是日期和时间的分隔符。

PUT /basic_date_time_db
{
  "mappings": {
    "properties": {
      "timeTest": {
        "type": "date",
        "format": "basic_date_time"
      }
    }
  }
}

GET /basic_date_time_db/_mapping

PUT /basic_date_time_db/_doc/1
{
  "timeTest": "20220503T120228.33+08:00"
}

basic_date_time_no_millis(yyyyMMdd'T'HHmmssZ格式)

PUT /basic_date_time_no_millis_db
{
  "mappings": {
    "properties": {
      "timeTest": {
        "type": "date",
        "format": "basic_date_time_no_millis"
      }
    }
  }
}

GET /basic_date_time_no_millis_db/_mapping

PUT /basic_date_time_no_millis_db/_doc/1
{
  "timeTest": "20220503T120228+08:00"
}

basic_ordinal_date(yyyyDDD格式)

作用

描述某年的第几天。

PUT /basic_ordinal_date_db
{
  "mappings": {
    "properties": {
      "timeTest": {
        "type": "date",
        "format": "basic_ordinal_date"
      }
    }
  }
}

GET /basic_ordinal_date_db/_mapping

#2022年第75天
PUT /basic_ordinal_date_db/_doc/1
{
  "timeTest": "2022075"
}

basic_ordinal_date_time(yyyyDDD'T'HHmmss.SSSZ格式)

作用

描述某年的第几天,精确到纳秒。

PUT /basic_ordinal_date_time_db
{
  "mappings": {
    "properties": {
      "timeTest": {
        "type": "date",
        "format": "basic_ordinal_date_time"
      }
    }
  }
}

GET /basic_ordinal_date_time_db/_mapping

#2022年第75天
PUT /basic_ordinal_date_time_db/_doc/1
{
  "timeTest": "2022075T122345.466444+08:00"
}

basic_ordinal_date_time_no_millis(yyyyDDD'T'HHmmssZ格式)

作用

描述某年的第几天,精确到秒。

PUT /basic_ordinal_date_time_no_millis_db
{
  "mappings": {
    "properties": {
      "timeTest": {
        "type": "date",
        "format": "basic_ordinal_date_time_no_millis"
      }
    }
  }
}

GET /basic_ordinal_date_time_no_millis_db/_mapping

#2022年第75天
PUT /basic_ordinal_date_time_no_millis_db/_doc/1
{
  "timeTest": "2022075T122345+08:00"
}

basic_time(HHmmss.SSSZ格式

作用

官方文档描述该参数的格式为HHmmss.SSSZ,且后面是三位数的毫秒数。实际测试过程中发现精确单位是纳秒,这应该是官方文档描述错误,大家应该要注意。

官方描述(有误

basic_time

A basic formatter for a two digit hour of day, two digit minute of hour, two digit second of minute, three digit millis, and time zone offset: HHmmss.SSSZ.

PUT /basic_time_db
{
  "mappings": {
    "properties": {
      "timeTest": {
        "type": "date",
        "format": "basic_time"
      }
    }
  }
}

GET /basic_time_db/_mapping

#12点23分45秒999999999纳秒(东八区)
PUT /basic_time_db/_doc/1
{
  "timeTest": "122345.999999999+08:00"
}

basic_time_no_millis(HHmmssZ格式)

作用

约束时间为HHmmssZ格式,精确到秒。


basic_t_time(HHmmssZ格式)

作用

约束时间为'T'HHmmss.SSSZ格式。官方文档描述精度为毫秒,实际测试发现精度为纳秒。

官方描述(有误

basic_t_time

A basic formatter for a two digit hour of day, two digit minute of hour, two digit second of minute, three digit millis, and time zone off set prefixed by T'T'HHmmss.SSSZ.

PUT /basic_t_time_db
{
  "mappings": {
    "properties": {
      "timeTest": {
        "type": "date",
        "format": "basic_t_time"
      }
    }
  }
}

GET /basic_t_time_db/_mapping

#12点23分45秒999999999纳秒(东八区)
PUT /basic_t_time_db/_doc/1
{
  "timeTest": "T122345.999999999+08:00"
}

date或者strict_date

作用

约束日期格式为yyyy-MM-dd。其中strict_date表示严格约束。

PUT /date_db
{
  "mappings": {
    "properties": {
      "timeTest": {
        "type": "date",
        "format": "date"
      },
      "timeTest2": {
        "type": "date",
        "format": "strict_date"
      }
    }
  }
}

GET /date_db/_mapping

PUT /date_db/_doc/1
{
  "timeTest": "22-1-1",
  "timeTest2": "2022-01-01"
}

date_hour_minute_second或者strict_date_hour_minute_second

作用

约束日期格式为yyyy-MM-dd'T'HH:mm:ss。其中strict_date_hour_minute_second表示严格约束。

PUT /date_hour_minute_second_db
{
  "mappings": {
    "properties": {
      "timeTest": {
        "type": "date",
        "format": "date_hour_minute_second"
      },
      "timeTest2": {
        "type": "date",
        "format": "strict_date_hour_minute_second"
      }
    }
  }
}

GET /date_hour_minute_second_db/_mapping

PUT /date_hour_minute_second_db/_doc/1
{
  "timeTest": "22-1-1T12:23:12",
  "timeTest2": "2022-01-01T12:23:12"
}

自定义格式示例

yyyy-MM-dd HH:mm:ss格式

PUT /stu_db
{
 "mappings": {
   "properties": {
     "createTime":{
       "type":"date",
       "format": "yyyy-MM-dd HH:mm:ss"
     }
   }
 }
}

GET /stu_db/_mapping

有关ES日期时间格式化参数集锦的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  3. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  4. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

    我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

  5. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

  6. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  7. ruby-on-rails - 在默认方法参数中使用 .reverse_merge 或 .merge - 2

    两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option

  8. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  9. ruby - 检查日期是否在过去 7 天内 - 2

    我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/

  10. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

随机推荐