API 约定

edit

Elasticsearch REST API 通过 HTTP 暴露。 除非另有说明,以下约定适用于所有 API。

内容类型要求

edit

请求体中发送的内容类型必须使用Content-Type头指定。该头的值必须映射到API支持的受支持格式之一。大多数API支持JSON、YAML、CBOR和SMILE。批量和多搜索API支持NDJSON、JSON和SMILE;其他类型将导致错误响应。

当使用source查询字符串参数时,必须使用source_content_type查询字符串参数指定内容类型。

Elasticsearch 仅支持 UTF-8 编码的 JSON。Elasticsearch 会忽略任何随请求发送的其他编码头。响应也是 UTF-8 编码的。

X-Opaque-Id HTTP 头

edit

您可以传递一个 X-Opaque-Id HTTP 头来跟踪请求在 Elasticsearch 日志和任务中的来源。如果提供了该头,Elasticsearch 会在以下位置显示 X-Opaque-Id 的值:

对于弃用日志,Elasticsearch 还使用 X-Opaque-Id 值来限制和去重弃用警告。请参阅 弃用日志限制

The X-Opaque-Id header 接受任何任意值。然而,我们建议您将这些值限制在一个有限的集合内,例如每个客户端一个ID。不要为每个请求生成唯一的 X-Opaque-Id header。太多的唯一 X-Opaque-Id 值可能会阻止 Elasticsearch 在弃用日志中去除重复的警告。

traceparent HTTP 头

edit

Elasticsearch 还支持使用 官方 W3C 跟踪上下文规范traceparent HTTP 头。您可以使用 traceparent 头来跟踪跨 Elastic 产品和其它服务的请求。因为它仅用于跟踪,您可以安全地为每个请求生成唯一的 traceparent 头。

如果提供,Elasticsearch 会将头部的 trace-id 值作为 trace.id 显示在:

例如,以下 traceparent 值将生成上述日志中的以下 trace.id 值。

`traceparent`: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
`trace.id`: 0af7651916cd43dd8448eb211c80319c

GET 和 POST 请求

edit

许多Elasticsearch GET API(特别是搜索API)支持请求体。 虽然GET操作在检索信息方面是有意义的, 但并非所有HTTP库都支持带有请求体的GET请求。 所有需要请求体的Elasticsearch GET API也可以作为POST请求提交。 或者,您可以在使用GET时将请求体作为 source查询字符串参数传递。

Cron 表达式

edit

cron 表达式是一个以下列形式组成的字符串:

    <seconds> <minutes> <hours> <day_of_month> <month> <day_of_week> [year]

Elasticsearch 使用来自 Quartz Job Scheduler 的 cron 解析器。 有关编写 Quartz cron 表达式的更多信息,请参阅 Quartz CronTrigger 教程

所有计划时间均为协调世界时(UTC);不支持其他时区。

您可以使用elasticsearch-croneval命令行工具来验证您的cron表达式。

Cron 表达式元素

edit

所有元素都是必需的,除了year。 有关允许的特殊字符的信息,请参见Cron特殊字符

<seconds>
(必需) 有效值: 0-59 以及特殊字符 , - * /
<minutes>
(必需) 有效值: 0-59 以及特殊字符 , - * /
<hours>
(必需) 有效值: 0-23 以及特殊字符 , - * /
<day_of_month>
(必需) 有效值: 1-31 和特殊字符 , - * / ? L W
<month>
(必需) 有效值: 1-12, JAN-DEC, jan-dec, 以及特殊字符 , - * /
<day_of_week>
(必需) 有效值: 1-7, SUN-SAT, sun-sat, 以及特殊字符 , - * / ? L #
<year>
(可选) 有效值: 1970-2099 以及特殊字符 , - * /

Cron 特殊字符

edit
*
选择字段的所有可能值。例如,*hours 字段中表示“每小时”。
?
没有特定值。当你不关心值是什么时使用。例如,如果你希望调度在一个月的特定日期触发,但不在乎那天是星期几,你可以在day_of_week字段中指定?
-
一系列的值(包含)。用于分隔最小值和最大值。例如,如果您希望调度在上午9:00到下午5:00之间的每个小时触发,您可以在hours字段中指定9-17
,
多个值。用于分隔字段中的多个值。例如,如果您希望调度在每周二和周四触发,您可以在day_of_week字段中指定TUE,THU
/
增量。用于在指定时间增量时分隔值。第一个值表示起始点,第二个值表示间隔。例如,如果您希望调度从整点开始每20分钟触发一次,可以在minutes字段中指定0/20。同样,在day_of_month字段中指定1/5将每月的第一天开始每隔5天触发一次。
L
最后。在 day_of_month 字段中使用,表示月份的最后一天——1 月的第 31 天,非闰年 2 月的第 28 天,4 月的第 30 天,依此类推。单独在 day_of_week 字段中使用,代替 7SAT,或在特定星期几之后使用,以选择该类型在月份中的最后一天。例如,6L 表示该月的最后一个星期五。您可以在 day_of_month 字段中指定 LW,以指定该月的最后一个工作日。避免在指定值列表或范围时使用 L 选项,因为结果可能与您预期的不同。
W
工作日。用于指定给定日期最近的工作日(周一至周五)。例如,如果您在day_of_month字段中指定15W,而15日是星期六,则计划将在14日触发。如果15日是星期日,则计划将在16日(星期一)触发。如果15日是星期二,则计划将在15日(星期二)触发。但是,如果您为day_of_month指定1W,而1日是星期六,则计划将在3日(星期一)触发——它不会跳过月份边界。您可以在day_of_month字段中指定LW,以指定该月的最后一个工作日。您只能在day_of_month是单一日期时使用W选项——在指定日期范围或日期列表时无效。
#
月份中的第N个XXX日。在day_of_week字段中使用,以指定月份中的第N个XXX日。例如,如果您指定6#1,计划将在月份的第一个星期五触发。请注意,如果您指定3#5,并且在特定月份中没有5个星期二,则该月份计划不会触发。

示例

edit
设置每日触发器
edit
0 5 9 * * ?
每天UTC时间上午9:05触发。
0 5 9 * * ? 2020
在2020年的每一天UTC时间上午9:05触发。
将触发器限制在一定日期或时间范围内
edit
0 5 9 ? * MON-FRI
触发时间为UTC时间周一至周五上午9:05。
0 0-5 9 * * ?
每分钟触发一次,从UTC时间上午9:00开始,到UTC时间上午9:05结束,每天执行。
设置间隔触发器
edit
0 0/15 9 * * ?
每15分钟触发一次,从UTC时间上午9:00开始,到UTC时间上午9:45结束,每天执行。
0 5 9 1/3 * ?
每天每月的第1天开始,每隔3天在UTC时间上午9:05触发。
设置在特定日期触发的计划
edit
0 1 4 1 4 ?
每年4月1日凌晨4:01 UTC触发。
0 0,30 9 ? 4 WED
在四月的每个星期三,触发时间为UTC时间上午9:00和上午9:30。
0 5 9 15 * ?
每月15日的UTC时间上午9:05触发。
0 5 9 15W * ?
每月15日最近的工作日UTC时间上午9:05触发。
0 5 9 ? * 6#1
每月第一个周五的UTC时间上午9:05触发。
使用last设置触发器
edit
0 5 9 L * ?
每月最后一天的UTC时间上午9:05触发。
0 5 9 ? * 2L
每月最后一个星期一的UTC时间上午9:05触发。
0 5 9 LW * ?
每月最后一个工作日的UTC时间上午9:05触发。

索引和索引别名名称中的日期数学支持

edit

日期数学名称解析允许您搜索一系列时间序列索引或索引别名,而不是搜索所有索引并过滤结果。限制搜索的索引数量可以减少集群负载并提高搜索性能。例如,如果您正在搜索每日日志中的错误,您可以使用日期数学名称模板将搜索限制在过去两天内。

大多数接受索引或索引别名参数的API都支持日期数学。日期数学名称采用以下形式:

<static_name{date_math_expr{date_format|time_zone}}>

其中:

static_name

静态文本

date_math_expr

动态日期数学表达式,用于动态计算日期

date_format

计算日期应呈现的可选格式。默认为yyyy.MM.dd。格式应与java-time兼容 https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

时区

可选的时区。默认为UTC

注意date_format中小写字母与大写字母的使用。例如: mm表示每小时的分钟,而MM表示每年的月份。同样,hh表示与AM/PM结合的1-12范围内的时钟,而HH表示0-23的24小时范围内的时钟。

日期数学表达式是独立于本地化进行解析的。因此,不可能使用除公历以外的其他日历。

您必须将日期数学名称括在尖括号中。如果在请求路径中使用该名称,特殊字符必须进行URI编码。例如:

# PUT /<my-index-{now/d}>
PUT /%3Cmy-index-%7Bnow%2Fd%7D%3E

日期数学字符的百分比编码

用于日期舍入的特殊字符必须按如下方式进行URI编码:

<

%3C

>

%3E

/

%2F

{

%7B

}

%7D

|

%7C

+

%2B

:

%3A

,

%2C

以下示例展示了不同形式的日期数学名称及其在当前时间为2024年3月22日中午UTC时解析为的最终名称。

Expression Resolves to

logstash-2024.03.22

logstash-2024.03.01

logstash-2024.03

logstash-2024.02

logstash-2024.03.23

要在名称模板的静态部分中使用字符 {},请使用反斜杠 \ 进行转义,例如:

  • 解析为 elastic{ON}-2024.03.01

以下示例展示了一个搜索请求,该请求搜索过去三天的 Logstash 索引,假设索引使用默认的 Logstash 索引名称格式,logstash-YYYY.MM.dd

# GET /<logstash-{now/d-2d}>,<logstash-{now/d-1d}>,<logstash-{now/d}>/_search
GET /%3Clogstash-%7Bnow%2Fd-2d%7D%3E%2C%3Clogstash-%7Bnow%2Fd-1d%7D%3E%2C%3Clogstash-%7Bnow%2Fd%7D%3E/_search
{
  "query" : {
    "match": {
      "test": "data"
    }
  }
}

多目标语法

edit

大多数接受 请求路径参数的 API 也支持 多目标语法

在多目标语法中,您可以使用逗号分隔的列表来对多个资源(如数据流、索引或别名)运行请求: test1,test2,test3。您还可以使用类似全局 通配符(*)表达式来定位与模式匹配的资源:test**testte*t*test*

您可以使用-字符排除目标:test*,-test3

别名在通配符表达式之后解析。这可能导致请求目标是一个被排除的别名。例如,如果 test3 是一个索引别名,模式 test*,-test3 仍然会目标 test3 的索引。为了避免这种情况,请排除别名的具体索引。

您还可以使用-字符从要搜索的集群列表中排除集群: remote*:*,-remote1:*,-remote4:*将搜索所有别名以"remote"开头的集群,但不包括"remote1"和"remote4"。请注意,使用此表示法排除集群时,必须排除其所有索引。目前不支持排除远程集群的子集索引。例如,这将抛出异常: remote*:*,-remote1:logs*

支持多目标的API可以支持以下查询字符串参数:

ignore_unavailable
(可选,布尔值) 如果为false,则当请求目标是一个缺失或关闭的索引时,请求将返回错误。默认为false
allow_no_indices
(可选, 布尔值) 如果为false,当任何通配符表达式、 索引别名_all值仅针对缺失或关闭的索引时,请求将返回错误。 即使请求针对其他打开的索引,此行为也适用。例如,如果一个请求针对foo*,bar*,但没有任何索引以bar开头,即使存在以foo开头的索引,请求也会返回错误。
expand_wildcards

(可选,字符串) 通配符模式可以匹配的索引类型。如果请求可以针对数据流,此参数确定通配符表达式是否匹配隐藏的数据流。支持逗号分隔的值,例如 open,hidden。有效值为:

all
匹配任何数据流或索引,包括 隐藏的 数据流和索引。
open
匹配开放的、非隐藏的索引。同时也匹配任何非隐藏的数据流。
closed
匹配关闭的、非隐藏的索引。同时也匹配任何非隐藏的数据流。数据流不能被关闭。
hidden
匹配隐藏的数据流和隐藏的索引。必须与 openclosed 或两者结合使用。
none
不接受通配符模式。

上述参数的默认设置取决于所使用的API。

一些可以针对索引的多目标API还支持以下查询字符串参数:

ignore_throttled

(可选,布尔值) 如果为 true,冻结时会忽略具体的、扩展的或别名的索引。默认为 true

[7.16.0] 在7.16.0中已弃用。

具有单一目标的API,例如获取文档API,不支持多目标语法。

隐藏的数据流和索引

edit

对于大多数API,通配符表达式默认不匹配隐藏的数据流和索引。要使用通配符表达式匹配隐藏的数据流和索引,您必须指定expand_wildcards查询参数。

或者,查询以点开头的索引模式,例如 .watcher_hist*,将默认匹配隐藏索引。这是为了 镜像Unix文件通配行为,并提供更平滑的过渡路径到 隐藏索引。

您可以通过在流的匹配索引模板中将data_stream.hidden设置为true来创建隐藏的数据流。您可以使用index.hidden索引设置来隐藏索引。

数据流的备份索引是自动隐藏的。一些功能,例如机器学习,会将信息存储在隐藏的索引中。

匹配所有索引的全局索引模板不会应用于隐藏索引。

系统索引

edit

Elasticsearch 模块和插件可以将配置和状态信息存储在内部的 系统索引 中。 您不应直接访问或修改系统索引, 因为它们包含对系统运行至关重要的数据。

直接访问系统索引已被弃用,并且在未来的主要版本中将不再允许。

参数

edit

Rest 参数(当使用 HTTP 时,映射到 HTTP URL 参数)遵循使用下划线命名法的惯例。

查询字符串中的请求体

edit

对于不接受非POST请求的请求体的库, 您可以将请求体作为source查询字符串参数传递。 使用此方法时,还应传递source_content_type参数, 并附带一个指示源格式(如application/json)的媒体类型值。

REST API 版本兼容性

edit

主要版本升级通常包括许多会影响您与Elasticsearch交互方式的重大更改。 尽管我们建议您在升级Elasticsearch之前监控弃用日志并更新应用程序, 但协调必要的更改可能会成为升级的障碍。

您可以通过包含API兼容性头文件来启用现有应用程序在升级后无需修改即可运行,这些头文件告诉Elasticsearch您仍在使用先前版本的REST API。使用这些头文件可以使请求和响应的结构保持不变;但这并不保证行为相同。

您可以在每个请求的基础上,通过Content-TypeAccept头设置版本兼容性。 将compatible-with设置为您正在运行的版本的主要版本号不会产生影响, 但可以确保在Elasticsearch升级后请求仍然有效。

要告知 Elasticsearch 8.0 您正在使用 7.x 的请求和响应格式,请设置 compatible-with=7

Content-Type: application/vnd.elasticsearch+json; compatible-with=7
Accept: application/vnd.elasticsearch+json; compatible-with=7

HTTP 429 请求过多 状态码回退

edit

Elasticsearch API 可能会返回 HTTP 429 Too Many Requests 状态码,表示集群过于繁忙,无法处理请求。当发生这种情况时,请考虑在短暂延迟后重试。如果重试也收到 429 Too Many Requests 响应,请在每次后续重试前通过指数退避延长延迟时间。

基于URL的访问控制

edit

许多用户使用基于URL的访问控制代理来保护对Elasticsearch数据流和索引的访问。对于多搜索多获取批量请求,用户可以选择在URL中指定数据流或索引,并在请求体中的每个单独请求中指定。这可能会使基于URL的访问控制变得具有挑战性。

为了防止用户覆盖URL中指定的数据流或索引,请在elasticsearch.yml中将rest.action.multi.allow_explicit_index设置为false

这会导致 Elasticsearch 拒绝在请求体中显式指定数据流或索引的请求。

布尔值

edit

所有REST API参数(包括请求参数和JSON体)都支持将布尔值“false”作为值false,将布尔值“true”作为值true。所有其他值都将引发错误。

数值

edit

在请求体中传递数值参数时,您可以使用包含数字的字符串,而不是原生的数值类型。例如:

POST /_search
{
  "size": "1000"
}

响应体中的整数值字段在本手册中描述为 integer(或偶尔为 long),但通常对这些值没有明确的界限。JSON、SMILE、CBOR 和 YAML 都允许任意大的整数值。不要假设响应体中的 integer 字段总是适合 32 位有符号整数。

字节大小单位

edit

每当需要指定数据的字节大小时,例如在设置缓冲区大小时,值必须指定单位,如 10kb 表示 10 千字节。请注意,这些单位使用 1024 的幂,因此 1kb 表示 1024 字节。支持的单位有:

b

字节

kb

千字节

mb

兆字节

gb

千兆字节

tb

太字节

pb

拍字节

距离单位

edit

无论何时需要指定距离,例如在Geo-distance中的distance参数,如果未指定单位,默认单位为米。距离可以以其他单位指定,例如"1km""2mi"(2英里)。

完整的单位列表如下:

英里

mimiles

ydyards

英尺

ftfeet

英寸

ininch

公里

公里千米

m

厘米

厘米厘米

毫米

毫米毫米

海里

NM, nmi, 或 nauticalmiles

时间单位

edit

每当需要指定持续时间时,例如对于一个timeout参数,持续时间必须指定单位,如2d表示2天。支持的单位有:

d

h

小时

m

分钟

s

毫秒

毫秒

微秒

微秒

纳秒

纳秒

无单位的量

edit

无量纲量意味着它们没有像“字节”或“赫兹”或“米”或“长吨”这样的“单位”。

如果这些数量中的一个是大的,我们会像10m表示10,000,000或7k表示7,000那样打印出来。不过,当我们表示87时,我们仍然会打印87。这些是支持的乘数:

k

m

g

千兆

t

泰拉

p

佩塔