作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬
学习必须往深处挖,挖的越深,基础越扎实!
阶段1、深入多线程
阶段2、深入多线程设计模式
阶段3、深入juc源码解析
码哥源码部分
码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】
码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】
码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】
码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】
打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】
操作文档
-
单文档:
- Index API
- Get API
- Delete API
- Update API
-
多文档:
- Multi Get API
- Bulk API
- Delete By Query API
- Update By Query API
- Reindex API
所有CRUD API都是单索引API。index参数接受一个索引名,或 一个指向单个索引的别名(alias)。
单文档API
1、Index API
索引API在特定索引中添加或更新JSON文档,使其可搜索。
//4种语法
PUT /<index>/_doc/<_id>
POST /<index>/_doc/
PUT /<index>/_create/<_id>
POST /<index>/_create/<_id>
如果target是data stream,则如果指定ID则不能使用PUT /<target>/_doc/<_id>
,应使用PUT /<target>/_create/<_id>
path参数:
-
<target>
:(必须, string) data stream 、 index 的名称。- 如果target不存在,且与data stream的index template的名称或 wildcard (*) 匹配,则自动创建对应的data stream。
- 如果target不存在,且与data stream的template的名称规则不匹配,则自动创建index。
-
<_id>
:(可选, string) 文档的唯一ID,不指定ID时使用 POST //_doc 。
query参数:
-
if_seq_no
:(可选, integer) 只有当index的if_seq_no是该值时才会处理该文档,否则409 Version Conflict。乐观锁控制,因为index每处理一个文档就会if_seq_no+1。 -
if_primary_term
:(可选, integer) 只有当该文档所在的primary分片号是if_primary_term时才会处理该文档,否则409 Version Conflict。乐观锁控制。 -
op_type
:(可选, enum)当设置为create
时的处理机制是文档不存在才处理 (相当于put if absent),如果文档已存在,处理会失败。可选值index
,create
。当ID指定时,默认值=index , 否则默认=create -
pipeline
:(可选, string) 指定一个pipeline的ID来触发。 -
refresh
:(可选, enum)true
:立即刷新关联的shard。wait_for
:等待response直到index刷新。false
:默认,无处理。
-
routing
:(可选, string) 分片的路由参数。 -
timeout
:(可选, time units) 对以下动作的超时时间,默认1m。 -
version
:(可选, integer) 乐观锁,指定ID时使用. -
version_type
:(可选, enum) Specific version type: external, external_gte. -
wait_for_active_shards
:(可选, string) 这个参数覆盖了index.write.wait_for_active_shards。预先检查shard的可用数量,如果当时可用的shard数量小于配置数,则ES会重试直到超时,默认1即只需primary,可选all或 1 - number_of_replicas+1 。
因为文档在索引时会从primary尽力的同步到各个可用的replica,所以该配置是预先检查机制,提供数据的可靠性。 -
require_alias
:(可选, Boolean) 如果是true,则要求目标是一个index的别名。默认false.
request body参数:
JSON
response body参数:
_shards
: 分片信息._shards.total
: 总的分片数量primary and replica shards._shards.successful
: 成功的分片数量,当操作成功时,successful至少是1。_shards.failed
: 失败的分片数量,0表示没有失败。_index
: index的名称。_id
: 文档的ID._version
: 文档的版本._seq_no
: 对应的index的_seq_no._primary_term
: primary分片号.result
: 处理结果是 created or updated.
下面的示例将ID为1文档插入到twitter索引中:
PUT twitter/_doc/1
{
"user":"kimchy",
"post_date":"2009-11-15T14:12:12",
"message":"trying out Elasticsearch"
}
默认情况下,当索引操作成功返回时,有可能一些replica 还没有开始或完成,因为只要primary成功执行,就会返回,这种行 为可以调整。其实这样做的目的是快速响应,一般的场景并不需要等 待所有分片都完成索引操作再返回,除非对数据安全要求极高的场景。
1.1、自动创建索引(action.auto_create_index)
当索引文档时,如果索引不存在,会自动创建索引。索引操作还 将创建一个动态映射(如果尚未存在)。默认情况下,如果需要,新 字段和对象将自动添加到映射定义中。
自动创建索引由action.auto_create_index
设置控制。此设置默 认为true,这意味着索引总是自动创建的。也可以设置只有匹配特定 模式的索引才允许自动创建索引,方法是将此设置的值更改为这些匹 配模式的逗号分隔列表。还可以通过在列表中的模式前面加上+或-, 明确地允许和禁止使用它。最后,通过将此设置更改为false,可以完全禁用它。可以在elasticsearch.yml中配置,也可以通过如下URL 配置。
只允许自动创建名为twitter、index10的索引,不允 许创建其他与index1*匹配的索引:
PUT _cluster/settings
{
"persistent": {
"action.auto_create_index": "twitter,index10,-index1*,+ind*"
}
}
完全禁用索引的自动创建:
PUT _cluster/settings
{
"persistent": {
"action.auto_create_index": "false"
}
}
允许使用任何名称自动创建索引,这是默认设置:
PUT _cluster/settings
{
"persistent": {
"action.auto_create_index": "true"
}
}
1.2、强制创建(op_type)
索引操作还接受一个op_type
参数,它可以用来强制create操 作,允许put-if-absent的行为。使用create时,如果索引中已存在具有该ID的文档,则索引操作将失败。
可以这样来理解,当索引文档时,如果带有&op_type=true
参 数,明确指明是创建文档,如果文档存在就报错。默认情况下,当文档存在时直接覆盖。
PUT twitter/_doc/1?op_type=create
{
"user":"kimchy",
"post_date":"2009-11-15T14:12:12",
"message":"trying out Elasticsearch"
}
1.3、ID自动生成
索引操作可以在不指定ID的情况下执行。在这种情况下,将自动 生成一个ID。
POST twitter/_doc
{
"user":"kimchy",
"post_date":"2009-11-15T14:12:12",
"message":"trying out Elasticsearch"
}
1.4、路由(routing)
默认情况下,数据存放到哪个分片,通过使用文档ID值的哈希值 来控制。对于更显式的控制,可以传递哈希函数的种子值。
POST twitter/_doc?routing=kimchy
{
"user":"kimchy",
"post_date":"2009-11-15T14:12:12",
"message":"trying out Elasticsearch"
}
在设置显式mapping时,可以选择使用_routing字段从文档本身 提取路由值。如果定义了mapping的_routing值并将其设置为必需, 则如果没有提供可提取路由值,索引操作将失败。
1.5、分发
索引操作根据路由定向到primary,并在包含此分片的实际节点 上执行。在primary完成操作后,如果需要,操作将分发到需要的其他分片。
1.6、超时(time)
执行索引操作时,分配用于执行索引操作的主碎片可能不可用。出现这种情况的一些原因可能是主碎片当前正在从网关恢复或正在进行重新定位。默认情况下,索引操作将在主碎片上等待长达1分钟,然后失败并返回错误。timeout参数可用于明确指定等待时间。
PUT twitter/_doc/1?timeout=5m
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
1.7、等待活动分片
为了兼顾系统写入的效率和可靠性,可以将索引操作配置为在继 续操作之前等待一定数量的活动分片。如果所需数量的活动分片不可 用,则写入操作必须等待并重试,直到所需分片已启动或发生超时。 默认情况下,写入操作仅在继续之前等待primary完成(即 wait_for_active_shards=1
) 。 可 以 通 过 设 置 index.write.wait_for_active_shards
来 动 态 重 写 此 默 认 值 。 要 更 改 每个请求操作的此行为,可以使用wait_for_active_shards请求参 数。
wait_for_active_shards
的有效值是任何正整数,最多为分片总 数。指定负值或大于分片数的数字将引发错误。
例如,假设有一个由3个节点(A、B和C)组成的集群,并且创 建了一个索引index,其中副本数设置为3(结果是共4个分片)。如 果我们尝试索引操作,默认情况下,该操作将仅确保primary在继续 操作之前可用。这意味着,即使B和C发生故障,并且A托管了 primary , 索 引 操 作 仍 然 继 续 进 行 。 如 果 在 请 求 中 将 wait_for_active_shards
设置为3(并且所有3个节点都已启动),那 么索引操作将需要3个活动的shard副本才能继续。这一要求应该满 足,因为集群中有3个活动的节点,每个节点都保存一个shard副本。 但是,如果我们将wait_for_active_shards设置为all(或设置为4, 这是相同的),则索引操作将不会继续,因为索引中没有每个shard 的所有4个副本。除非在集群中出现新节点以承载分片的第四副本, 否则操作将超时。
1.8、detect——noop参数
使用索引API更新文档时,即使文档没有更改,也会始终创建文 档的新版本。如果不想这样做,可以使用detect_noop=true
参数。这 个参数的作用是在更新之前与原文档对比,如果没有字段值的变化, 则不做更新操作。
2、Get API
GET API允许根据其ID从索引中获取JSON文档。
//获取整个文档
GET <index>/_doc/<_id>
//只获取_source部分
GET <index>/_source/<_id>
//检测文档是否存在
HEAD <index>/_doc/<_id>
HEAD <index>/_source/<_id>
path参数:
<index>
:(必须, string) 索引名称.<_id>
:(必须, string) 文档ID.
query参数:
preference
:(可选, string) 指定在哪个node或shard上执行,默认随机.realtime
:(可选, Boolean) 是否实时,默认true.refresh
:(可选, Boolean)如果为true,则请求在检索文档之前刷新相关碎片。默认为false。routing
:(可选, string) 路由参数,到哪个shard.stored_fields
:(可选, Boolean) 如果为true,则检索存储在索引中的文档字段,而不是文档 _source.默认false。_source
:(可选, string) 是否返回_source,默认true._source_excludes
(可选, string) 响应中在_source排除哪些字段,逗号分割.当_source 是false时不起作用。_source_includes
(可选, string) 跟_source_excludes相反。version
:(可选, integer) 指定version控制并发,version必须与文档当前的version匹配否则失败。version_type
:(可选, enum) Specific version type: external, external_gte.
response body参数:
_index
: index名称._id
: 文档ID._version
: 文档版本._seq_no
: 对应的index的_seq_no._primary_term
: 分片号.found
: 文档是否存在: true or false._routing
: 指定的路由,如果有设置的话._source
: 当文档存在时返回,除非参数_source是false或stored_fields是true._fields
: 如果stored_fields是true 且文档存在.
GET twitter/_doc/1
//返回
{
"_index" : "twitter",
"_type" : "_doc",
"_id" : "1",
"_version" : 2,
"_seq_no" : 1,
"_primary_term" : 1,
"found" : true,
"_source" : {
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
}
GET twitter/_source/1
//返回
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
2.1、实时性(realtime)
默认情况下,GET API是实时的,不受索引刷新频率的影响。如 果文档已更新但尚未刷新,则GET API将在适当时机发出刷新调用, 以使文档可见。这还将使上次刷新后更改的其他文档可见。如果需要 禁用此特性,可以将realtime
参数设置为false
。
GET twitter/_doc/1?realtime=false
2.2、字段选择(_source)
默认情况下,GET API操作返回_source的内容,除非使用了 stored_fields参数或禁用了_source。可以关闭_source检索,如下 所示:
GET twitter/_doc/1?_source=false
//返回
{
"_index" : "twitter",
"_type" : "_doc",
"_id" : "1",
"_version" : 2,
"_seq_no" : 1,
"_primary_term" : 1,
"found" : true
}
如果只需要完整_source中的一个或两个字段,可以使用 _source_includes
和_source_excludes
参数来包含或排除字段。这 对于大型文档尤其有用,因为部分字段检索可以节省网络开销。两个 参数都采用逗号分隔的字段列表或通配符表达式。
GET twitter/_doc/0? _source_includes=*.id&_source_excludes=entities
如果只需指定include,可以使用较短的表示法:
GET twitter/_doc/0?_source=*.id,retweeted
2.3、存储字段(stored_fields)
GET操作允许指定一组存储字段(store属性值为true),这些 字段将通过传递stored_fields参数返回。如果未存储请求的字段,则 将忽略它们。
PUT twitter
{
"mappings": {
"properties": {
"counter": {
"type": "integer",
"store": false
},
&#