API 约定
editAPI 约定
editElasticsearch 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 头
editElasticsearch 还支持使用 官方 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 表达式
editcron 表达式是一个以下列形式组成的字符串:
<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
字段中使用,代替7
或SAT
,或在特定星期几之后使用,以选择该类型在月份中的最后一天。例如,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}}>
其中:
|
静态文本 |
|
动态日期数学表达式,用于动态计算日期 |
|
计算日期应呈现的可选格式。默认为 |
|
可选的时区。默认为 |
注意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编码:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
以下示例展示了不同形式的日期数学名称及其在当前时间为2024年3月22日中午UTC时解析为的最终名称。
Expression | Resolves to |
---|---|
|
|
|
|
|
|
|
|
|
要在名称模板的静态部分中使用字符 {
和 }
,请使用反斜杠 \
进行转义,例如:
-
解析为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*
或
*test
或 te*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
-
匹配隐藏的数据流和隐藏的索引。必须与
open
、closed
或两者结合使用。 -
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
索引设置来隐藏索引。
数据流的备份索引是自动隐藏的。一些功能,例如机器学习,会将信息存储在隐藏的索引中。
匹配所有索引的全局索引模板不会应用于隐藏索引。
系统索引
editElasticsearch 模块和插件可以将配置和状态信息存储在内部的 系统索引 中。 您不应直接访问或修改系统索引, 因为它们包含对系统运行至关重要的数据。
直接访问系统索引已被弃用,并且在未来的主要版本中将不再允许。
参数
editRest 参数(当使用 HTTP 时,映射到 HTTP URL 参数)遵循使用下划线命名法的惯例。
查询字符串中的请求体
edit对于不接受非POST请求的请求体的库,
您可以将请求体作为source
查询字符串参数传递。
使用此方法时,还应传递source_content_type
参数,
并附带一个指示源格式(如application/json
)的媒体类型值。
REST API 版本兼容性
edit主要版本升级通常包括许多会影响您与Elasticsearch交互方式的重大更改。 尽管我们建议您在升级Elasticsearch之前监控弃用日志并更新应用程序, 但协调必要的更改可能会成为升级的障碍。
您可以通过包含API兼容性头文件来启用现有应用程序在升级后无需修改即可运行,这些头文件告诉Elasticsearch您仍在使用先前版本的REST API。使用这些头文件可以使请求和响应的结构保持不变;但这并不保证行为相同。
您可以在每个请求的基础上,通过Content-Type
和Accept
头设置版本兼容性。
将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 请求过多
状态码回退
editElasticsearch 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 字节。支持的单位有:
|
字节 |
|
千字节 |
|
兆字节 |
|
千兆字节 |
|
太字节 |
|
拍字节 |
距离单位
edit无论何时需要指定距离,例如在Geo-distance中的distance
参数,如果未指定单位,默认单位为米。距离可以以其他单位指定,例如"1km"
或"2mi"
(2英里)。
完整的单位列表如下:
英里 |
|
码 |
|
英尺 |
|
英寸 |
|
公里 |
|
米 |
|
厘米 |
|
毫米 |
|
海里 |
|
时间单位
edit每当需要指定持续时间时,例如对于一个timeout
参数,持续时间必须指定单位,如2d
表示2天。支持的单位有:
|
天 |
|
小时 |
|
分钟 |
|
秒 |
|
毫秒 |
|
微秒 |
|
纳秒 |
无单位的量
edit无量纲量意味着它们没有像“字节”或“赫兹”或“米”或“长吨”这样的“单位”。
如果这些数量中的一个是大的,我们会像10m表示10,000,000或7k表示7,000那样打印出来。不过,当我们表示87时,我们仍然会打印87。这些是支持的乘数:
|
千 |
|
兆 |
|
千兆 |
|
泰拉 |
|
佩塔 |