Elasticsearch专题精讲——API规范——日期数学表达式

API规范——日期数学表达式

https://www.elastic.co/guide/en/elasticsearch/reference/8.8/api-conventions.html#api-date-math-index-names

  索引名称支持日期解析,这样能够搜索一个时间范围内或某几段时间内的索引,而不是搜索所有索引再筛选结果或维护别名。

  限制搜索的索引数量可以减少集群上的负载并提高执行性能。例如,如果在日常日志中搜索错误信息,可以使用日期格式名称模版将搜索严格限制在过去两天内。

  几乎所有具有 index 参数的 API 都支持 index 参数值中包含日期数学格式。日期数学索引名称模板具有以下形式:

<static_name{date_math_expr{data_format|time_zone}}>
  • static_name:是索引名称模板的静态索引名称部分。
  • date_math_expr:是动态日期数学表达式,用于计算动态日期。你可以使用它来指定日期的特定范围。例如:nownow-1d/dnow-1w/wnow-1M/M等。这个部分是可选的,如果你不想使用日期数学表达式来指定索引名称,则可以省略它。
  • data_format:是可选的日期格式选项,可以指定日期在生成索引名称时采用的格式,例如yyyy-MM-ddyyyyMMdd等。如果不指定此选项,则以默认格式生成索引名称。
  • time_zone:是可选的时区选项,用于将日期转换为特定时区的时间。例如:+08:00表示东八区时间。如果不指定此选项,则将使用默认时区(UTC)。

  例如,如果你想创建以 "logs" 作为索引名称、日期范围为昨天、日期格式为 yyyy-MM-dd ,时区为 +08:00 的索引,则可以使用以下模板:

logs-{now-1d/d{yyyy-MM-dd|+08:00}}

  这将创建一个名为 logs-2023-05-29 的索引,用于存储昨天的数据,并且此名称将根据所在时区来生成日期时间。需要注意的是,这只是一种表示方式,你需要根据实际情况选择适合的日期数学表达式、日期格式和时区。

  当使用日期数学格式索引名称表达式时,我们必须将其括在尖括号内,以明确表达式的范围。此外,所有特殊字符都应进行 URI 编码,以避免引起误解或错误解析。举个例子,如果我们想要使用“now-1d/d”这个表达式来生成索引名称,我们应该将它编码为“<now-1d%2Fd>”。这样做可以确保在进行搜索操作时正确地解析索引名称并获取所需的结果。

  在 go 语言中,使用 net/url 包中的 EscapePath() 方法将 URI 片段转移为可以在 URI 中使用的字符串,转义后获得:/%3Clogstash-%7Bnow%2Fd%7D%3E/_search。

import (
    "net/url"
    "fmt"
)

func main() {
    index := "<logstash-{now/d}>"
    escapedIndex := url.PathEscape(index)
    uri := fmt.Sprintf("/%s/_search", escapedIndex)
    fmt.Println(uri)
}

  在 shell 语言中,可以使用 curl 命令来发送 HTTP 请求,下面是一个 curl 命令的示例:

curl -X GET "<elasticsearch_address>:<elasticsearch_port>/<logstash-{now/d}>/_search"

  在Elasticsearch中,为了在查询参数中使用这些字符,需要进行URL编码,也被称为百分比编码。下面是这些字符的URL编码:

    • 加号(+): %2B
    • 减号(-): %2D
    • 斜杠(/): %2F
    • 百分号(%): %25
    • 左括号(():%28
    • 右括号()):%29
    • 小于号(<):%3C
    • 大于号(>): %3E
    • 冒号(:):%3A
    • 逗号(,):%2C
    • 竖线(|):%7C

  下面显示了日期数学索引名称的不同形式和解析后的最终索引名称,是在当前时间为 2024 年 3 月 22 日中午,时区为 UTC 的情况下解析的。

日期数学表达式解析实例
日期数字索引模式 解析结果 解释说明
<logstash-{now/d}> logstash-2024.03.22

调用now/d格式,表示当前日期。在2024年3月22日中午的情况下,这个日期格式为2024.03.22,将它放入<logstash->和<>中间,形成索引名称logstash-2024.03.22

<logstash-{now/M}> logstash-2024.03.01 调用now/M格式,表示当前月份。在2024年3月22日中午的情况下,这个日期格式为2024.03.01,将它放入<logstash->和<>中间,形成索引名称logstash-2024.03.01。
<logstash-{now/M{yyyy.MM}}> logstash-2024.03 调用now/M{yyyy.MM}格式,表示当前月份的格式为“年-月”。在2024年3月22日中午的情况下,这个日期格式为2024.03,将它放入<logstash->和<>中间,形成索引名称logstash-2024.03。
<logstash-{now/M-1M{yyyy.MM}}> logstash-2024.02 调用now/M-1M{yyyy.MM}格式,表示上个月的月份的格式为“年-月”。在2024年3月22日中午的情况下,这个日期格式为2024.02,将它放入<logstash->和<>中间,形成索引名称logstash-2024.02。
<logstash-{now/d{yyyy.MM.dd|+12:00}}> logstash-2024.03.23 调用now/d{yyyy.MM.dd|+12:00}格式,表示当前日期的格式为“年-月-日”,并根据UTC时间向前或向后移动12小时。在2024年3月22日中午的情况下,这个日期格式为2024.03.23(因为UTC时间比我们所在的时区要早12个小时,所以我们会得到下一天的日期),将它放入<logstash->和<>中间,形成索引名称logstash-2024.03.23。

  在 Elasticsearch 中, { } 是被用作字符替换和参数替换的占位符,如果你需要在查询中使用 {} 字符,你可以在它们前面添加转义字符 \ ,比如使用 { 和 } 代替 { } 。另外,如果你需要匹配一个包含 { } 字符的文本,你可以使用通配符查询或正则表达式查询。例如,查询一个名为 "myindex-{date}" 的索引,其中 {date} 是一个占位符,它会被当前日期替换。你可以使用以下查询:

GET myindex-\{now/d\}

  这个查询中,\{now/d\} 将会被解析为当前日期,例如对于今天的日期,会被替换为 2023.05.30 这样的格式。

  下面的示例展示了一个搜索请求,该请求搜索过去三天内 logstash 的数据,假设索引使用默认的 logstash 索引名称格式 logstash-yyyy.MM.dd,下面举例2种查询,它们的区别在于返回的数据格式和查询方式不同,两种写法体会下:

  第1种写法,这种查询方式只返回一个索引名称,即 logstash-YYYY.MM.DD 格式的字符串,其中 YYYY.MM.DD 代表三天前的日期。这种查询方式常用于指定一个特定的索引进行查询,适合于你只需要查询一个特定的日期范围内的数据的情况。

GET logstash-{now/d-3d}

  第2种写法,这种查询方式会返回三个不同的索引名称,即 logstash-YYYY.MM.DD 格式的字符串,包括前天、昨天和今天的日期。可以使用逗号分隔指定多个索引名称,它们使用的日期范围是从前天到今天。这种查询方式常用于查询一段时间范围内的数据,比如过去三天内的数据。

GET /<logstash-{now/d-2d}>,<logstash-{now/d-1d}>,<logstash-{now/d}>/_search
posted @ 2023-05-30 11:32  左扬  阅读(114)  评论(0编辑  收藏  举报
levels of contents