文章目录
- 创建文档
- 路径参数
- 常用查询参数
- 示例
- 响应说明
- 查询文档
- 路径参数编辑
- 查询参数
- 示例 1
- 响应说明
- 示例2
- 示例3
- 更新文档
- 路径参数
- 查询参数
- 示例1
- 示例2
- 禁用noop
- mget 获取多个文档
- 路径参数
- 查询参数
- 请求正文参数说明
- 示例1
- 响应结果
- 示例2
- 删除文档
- 路径参数
- 查询参数
- 示例1 开放式并发控制更新或删除
- 响应结果
- 示例2:版本控制更新或删除
- 示例3:直接删除
- 索引重建
- 查询参数
- 请求正文
- 响应说明
- 先创建目标索引
- 示例:我们创建一个目标索引 person1
- 索引重建
- 响应信息
创建文档
PUT /<target>/_doc/<_id>
POST /<target>/_doc/
PUT /<target>/_create/<_id>
POST /<target>/_create/<_id>
创建新的文档,建议使用 _create
路径参数
- target 索引的名称(如果索引不存在,将会自动创建索引)
- _id 文档的id,文档的唯一标识符(注意和我们文档内容中的id字段相区别)
_id 是当前文档对唯一标识,我们文档内容中的id,为存储的数据到字段信息,他们不是必须的对应关系。
常用查询参数
常用,意味着包含但不限于如下的参数
- if_seq_no
(可选,整数)仅当文档具有此序列号时才执行操作。 - if_primary_term
(可选,整数)仅当文档具有此主要术语时才执行操作 - refresh (可选,boolean)刷新受影响的分片以使该操作对搜索可见,默认false。建议是false,因为 elastic 间隔一段时间会自动刷新。
- routing(可选,字符串)用于将操作路由到特定分片的自定义值。
- timeout(可选,时间单位)请求等待1. 自动创建索引、2. 动态映射更新、3. 等待活动分片操作的时间。默认为1m(一分钟)
- version(可选,整数)并发控制的显式版本号。指定的版本必须与文档的当前版本相匹配,请求才能成功。更改的乐观锁控制
- wait_for_active_shards (可选,字符串)继续操作之前必须处于活动状态的分片副本数。设置为all或任何正整数,最多为索引中分片的总数 ( number_of_replicas+1)。默认值:1,主分片。
- require_alias (可选,布尔值)为true表示 target 必须是索引别名。默认为false.
示例
PUT /person/_create/1
{
"id": 1,
"name":"张三",
"age": 18,
"height": 1.75,
"birthday":"1998-09-10 00:00:00",
"sex" : 1
}
正常返回结果
{
"_index": "person",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
如果创建id相同的文档,会返回如下结果
{
"error": {
"root_cause": [
{
"type": "version_conflict_engine_exception",
"reason": "[1]: version conflict, document already exists (current version [1])",
"index_uuid": "X2YU2E_dRoGfCdSHYtHYiA",
"shard": "0",
"index": "person"
}
],
"type": "version_conflict_engine_exception",
"reason": "[1]: version conflict, document already exists (current version [1])",
"index_uuid": "X2YU2E_dRoGfCdSHYtHYiA",
"shard": "0",
"index": "person"
},
"status": 409
}
响应说明
- _index
文档添加到的索引的名称。 - _type
文档类型。Elasticsearch 索引现在支持单一文档类型,_doc. - _id
添加文档的唯一标识符。 - _version
文档版本。每次更新文档时递增。 - _seq_no
为索引操作分配给文档的序列号。序列号用于确保文档的旧版本不会覆盖新版本。 - _primary_term
为索引操作分配给文档的主要术语。 - result
索引操作的结果,created或updated. - _shards
提供有关索引操作的复制过程的信息。
- total
指示应在多少分片副本(主分片和副本分片)上执行索引操作。 - successful
指示索引操作成功的分片副本数。当索引操作成功时,successful至少为 1。当索引操作成功返回时,副本分片可能不会全部启动。默认情况下,只需要主分片成功即可。可以设置 wait_for_active_shards 来更改默认行为。 - failed
如果副本分片上的索引操作失败,则包含与复制相关的错误的数组。0 表示没有失败。
_seq_no 序列号和_primary_term主要术语的作用:当创建、更新或删除文档时,必须将文档的新版本复制到集群中的其他节点。但这些操作是异步的,可能会乱序到达目的地。序列号随着每个操作而增加,因此新操作保证比旧操作具有更高的序列号。elastic 使用序列号和主要术语来唯一标识这些更改。确保较新的文档版本永远不会被分配给它的序列号较小的更改覆盖。
查询文档
GET <index>/_doc/<_id>
HEAD <index>/_doc/<_id>
GET <index>/_source/<_id>
HEAD <index>/_source/<_id>
路径参数编辑
- index
(必需,字符串)包含文档的索引的名称。 - _id
(必需,字符串)文档id。
查询参数
- preference
(可选,字符串)指定应在其上执行操作的节点或分片。默认随机。 - realtime
(可选,布尔值)true,则请求是实时的,而不是接近实时的。默认为true. - refresh
(可选,布尔值)true,则请求在检索文档之前刷新相关分片。默认为false. - routing
(可选,字符串)用于将操作路由到特定分片的自定义值。 - stored_fields
(可选,布尔值)true,检索存储在索引中的文档字段而不是文档_source。默认为false. - _source
(可选,字符串)是否返回字段_source,或要返回的字段列表。 - _source_excludes
(可选,字符串)要从响应中排除的 以逗号分隔的源字段 列表。如果_source参数是false,则忽略此参数。 - _source_includes
(可选,字符串)要包含在响应中的 以逗号分隔的源字段 列表。如果_source参数是false,则忽略此参数。 - version
(可选,整数)并发控制的显式版本号。指定的版本必须与文档的当前版本相匹配,请求才能成功。 - version_type
(可选,枚举)特定版本类型:external, external_gte。
external或者external_gt
如果给定版本严格高于存储文档的版本或者不存在现有文档,则仅索引文档。给定的版本将用作新版本,并将与新文档一起存储。提供的版本必须是一个非负长整数。
external_gte
如果给定版本等于或高于存储文档的版本,则 仅索引文档。如果不存在现有文档,操作也会成功。给定的版本将用作新版本,并将与新文档一起存储。提供的版本必须是一个非负长整数。
示例 1
GET /person/_doc/1
返回结果
{
"_index": "person",
"_id": "1",
"_version": 1,
"_seq_no": 0,
"_primary_term": 1,
"found": true,
"_source": {
"id": 1,
"name": "张三",
"age": 18,
"height": 1.75,
"birthday": "1988-09-10 00:00:00",
"sex": 1
}
}
响应说明
- _index
文档添加到的索引的名称。 - _type
文档类型。Elasticsearch 索引现在支持单一文档类型,_doc. - _id
添加文档的唯一标识符。 - _version
文档版本。每次更新文档时递增。 - _seq_no
为索引操作分配给文档的序列号。序列号用于确保文档的旧版本不会覆盖新版本。 - _primary_term
为索引操作分配给文档的主要术语。 - found
指示文档是否存在:true或false。 - _routing
显式路由(如果已设置)。 - _source 文档的信息。如果stored_fields 为 false,显示文档中所有的字段
- _fields 文档字段。如果 stored_fields 为 true,显示包含的文档字段
示例2
GET /person/_source/1
结果
{
"id": 1,
"name": "张三",
"age": 18,
"height": 1.75,
"birthday": "1988-09-10 00:00:00",
"sex": 1
}
可知,_source 的结果就是 _doc 结果对象的 _source 字段
示例3
GET /person/_source/1?_source_includes=id,name
响应结果
{
"id": 1,
"name": "张三"
}
更新文档
POST /<index>/_update/<_id>
路径参数
- index
(必需,字符串)目标索引的名称。 - _id
(必需,字符串)要更新的文档的 id。
查询参数
- if_seq_no
(可选,整数)仅当文档具有此序列号时才执行操作。 - if_primary_term
(可选,整数)仅当文档具有此主要术语时才执行操作 - lang
(可选,字符串)脚本语言。默认值:painless. - require_alias
(可选,布尔值)true 目标必须是索引别名。默认为false. - retry_on_conflict
(可选,整数)指定发生冲突时应重试操作的次数。默认值:0。 - refresh
(可选,布尔值)true,则请求在检索文档之前刷新相关分片。默认为false. - routing(可选,字符串)用于将操作路由到特定分片的自定义值。
- timeout(可选,时间单位)请求等待1. 自动创建索引、2. 动态映射更新、3. 等待活动分片操作的时间。默认为1m(一分钟)
- wait_for_active_shards (可选,字符串)继续操作之前必须处于活动状态的分片副本数。设置为all或任何正整数,最多为索引中分片的总数 ( number_of_replicas+1)。默认值:1,主分片。
- _source
(可选,列表)设置为false禁用源检索(默认值:true)。还可以指定要检索的字段列表,以逗号分割。 - _source_excludes
(可选,列表)指定要排除的源字段。 - _source_includes
(可选,列表)指定要检索的源字段。
示例1
POST /person/_update/1
{
"script" : {
"source": "ctx._source.age += params.skip",
"lang": "painless",
"params" : {
"skip" : 1
}
}
}
此方式为使用脚本进行更新,脚本非常简单,就是对 age 属性进行 += skip操作,skip为我们为脚本定义的参数,示例值为1。整个脚本就是为 年龄 + 1的更新操作。
响应结果
{
"_index": "person",
"_id": "1",
"_version": 2,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}
重新获取文档后,age 会是 age + 1的值。
示例2
POST /person/_update/1
{
"doc" : {
"birthday": "2013-09-10 00:00:00"
}
}
此方式为直接修改文档,示例只修改了一个属性,当然也可以修改其他属性。
响应结果
{
"_index": "person",
"_id": "1",
"_version": 3,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 1
}
如果更新的值与原值一样,会返回 “result”: “noop”,并且version也不会新增。这很有用,我们一般不会禁用此功能。
{
"_index": "person",
"_id": "1",
"_version": 3,
"result": "noop",
"_shards": {
"total": 0,
"successful": 0,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 1
}
禁用noop
请设置请求体为如下
{
"doc" : {
"birthday": "2013-09-10 00:00:00"
},
"detect_noop" : false
}
mget 获取多个文档
GET /_mget
GET /<index>/_mget
路径参数
- index
ids(可选,字符串)指定索引或docs数组中的文档未指定索引 时 检索文档的索引名称。
查询参数
- preference
(可选,字符串)指定应在其上执行操作的节点或分片。默认随机。 - realtime
(可选,布尔值)true,则请求是实时的,而不是接近实时的。默认为true. - refresh
(可选,布尔值)true,则请求在检索文档之前刷新相关分片。默认为false. - routing
(可选,字符串)用于将操作路由到特定分片的自定义值。 - stored_fields
(可选,布尔值)true,检索存储在索引中的文档字段而不是文档_source。默认为false. - _source
(可选,字符串)是否返回字段_source,或要返回的字段列表。 - _source_excludes
(可选,字符串)要从响应中排除的 以逗号分隔的源字段 列表。如果_source参数是false,则忽略此参数。 - _source_includes
(可选,字符串)要包含在响应中的 以逗号分隔的源字段 列表。如果_source参数是false,则忽略此参数。
请求正文参数说明
- docs 包含如下字段的对象数组。请求中未指定索引时,则必须使用该参数以确定查询哪些索引的哪些文档甚至对应的字段。
- _id
(必需,字符串)唯一的文档 ID。 - _index
(可选,字符串)包含文档的索引。如果请求 URI 中未指定索引,则为必需。 - routing
(可选,字符串)文档所在的主分片的键。如果在索引期间使用路由,则需要。 - _source
(可选,布尔值)如果false,则排除所有_source字段。默认为true.
- source_include
(可选,数组)要从字段中提取和返回的字段_source。 - source_exclude
(可选,数组)要从返回字段中排除的字段_source。
- _stored_fields
(可选,数组)要检索的存储字段。
- ids 要使用该参数,请求中需要指定索引,数组类型的文档_id列表,如:[“1”,“2”]
示例1
GET /_mget
{
"docs": [{
"_id": "1",
"_index":"person"
},{
"_id": "1",
"_index":"users"
}]
}
响应结果
{
"docs": [
{
"_index": "person",
"_id": "1",
"_version": 5,
"_seq_no": 4,
"_primary_term": 1,
"found": true,
"_source": {
"id": 1,
"name": "张三",
"age": 19,
"height": 1.75,
"birthday": "2013-09-10 00:00:00",
"sex": 1
}
},
{
"_index": "users",
"_id": "1",
"error": {
"root_cause": [
{
"type": "index_not_found_exception",
"reason": "no such index [users]",
"resource.type": "index_or_alias",
"resource.id": "users",
"index_uuid": "_na_",
"index": "users"
}
],
"type": "index_not_found_exception",
"reason": "no such index [users]",
"resource.type": "index_or_alias",
"resource.id": "users",
"index_uuid": "_na_",
"index": "users"
}
}
]
}
如果对应的索引不存在,则会返回错误信息
如果索引存在,但是文档不存在,则返回如下信息
{
"docs": [
{
"_index": "person",
"_id": "1",
"_version": 5,
"_seq_no": 4,
"_primary_term": 1,
"found": true,
"_source": {
"id": 1,
"name": "张三",
"age": 19,
"height": 1.75,
"birthday": "2013-09-10 00:00:00",
"sex": 1
}
},
{
"_index": "users",
"_id": "1",
"found": false
}
]
}
示例2
GET /person/_mget
{
"ids": ["1","2"]
}
删除文档
DELETE /<index>/_doc/<_id>
路径参数
- index
(必需,字符串)目标索引的名称。 - _id
(必需,字符串)文档的唯一标识符。
查询参数
- if_seq_no
(可选,整数)仅当文档具有此序列号时才执行操作。 - if_primary_term
(可选,整数)仅当文档具有此主要术语时才执行操作。 - refresh
- routing
- timeout 默认1m,1分钟
- version
(可选,整数)并发控制的显式版本号。指定的版本必须与文档的当前版本相匹配,请求才能成功。 - version_type
(可选,枚举)特定版本类型:external, external_gte。 - wait_for_active_shards
(可选,字符串)在继续操作之前必须处于活动状态的分片副本数。设置为all或任何正整数,最多为索引中分片的总数 ( number_of_replicas+1)。默认值:1,主分片。
在文档上执行的每个写操作,包括删除,都会导致其版本增加。已删除文档的版本号在删除后的短时间内仍然可用,以允许控制并发操作。已删除文档的版本保持可用的时间长度由index.gc_deletes索引设置决定,默认为 60 秒。
我们可以使用 if_seq_no + if_primary_term 来控制并发删除。如果检测到不匹配,该操作将产生VersionConflictException 409 状态代码。
示例1 开放式并发控制更新或删除
DELETE /person/_doc/1?if_seq_no=2&if_primary_term=1
我们的person 1 目前的 _seq_no = 4,_primary_term = 1,所以当前的删除请求是失败的
响应结果
{
"error": {
"root_cause": [
{
"type": "version_conflict_engine_exception",
"reason": "[1]: version conflict, required seqNo [2], primary term [1]. current document has seqNo [4] and primary term [1]",
"index_uuid": "X2YU2E_dRoGfCdSHYtHYiA",
"shard": "0",
"index": "person"
}
],
"type": "version_conflict_engine_exception",
"reason": "[1]: version conflict, required seqNo [2], primary term [1]. current document has seqNo [4] and primary term [1]",
"index_uuid": "X2YU2E_dRoGfCdSHYtHYiA",
"shard": "0",
"index": "person"
},
"status": 409
}
示例2:版本控制更新或删除
DELETE /person/_doc/1?version=2&version_type=external
我们文档当前版本为version = 4,当前的示例请求也是会失败的
响应结果
{
"error": {
"root_cause": [
{
"type": "version_conflict_engine_exception",
"reason": "[1]: version conflict, current version [5] is higher or equal to the one provided [2]",
"index_uuid": "X2YU2E_dRoGfCdSHYtHYiA",
"shard": "0",
"index": "person"
}
],
"type": "version_conflict_engine_exception",
"reason": "[1]: version conflict, current version [5] is higher or equal to the one provided [2]",
"index_uuid": "X2YU2E_dRoGfCdSHYtHYiA",
"shard": "0",
"index": "person"
},
"status": 409
}
示例3:直接删除
DELETE /person/_doc/1
索引重建
索引重建,类似于表的拷贝,在更新现有索引映射类型的时候常常需要索引重建。因为修改现有索引映射字段的类型时,可能会使已编制索引的数据无效。但有时我们不得不修改现有索引映射字段类型时,可以通过索引重建的方式来防止已有数据的索引无效的问题。
POST /_reindex
查询参数
- refresh
(可选,布尔值)true,则请求刷新受影响的分片以使此操作对搜索可见。默认为false. - timeout
(可选,时间单位) 默认为1m(一分钟)。这保证 Elasticsearch 在失败之前至少等待超时。实际等待时间可能会更长,尤其是发生多次等待时。 - wait_for_active_shards
(可选,字符串)在继续操作之前必须处于活动状态的分片副本数。设置为all或任何正整数,最多为索引中分片的总数 ( number_of_replicas+1)。默认值:1,主分片。 - wait_for_completion
(可选,布尔值)如果true,请求将阻塞直到操作完成。默认为true. - requests_per_second
(可选,整数)每秒子请求数中此请求的限制。默认为-1(无限制) - require_alias
(可选,布尔值)如果true,目标必须是索引别名。默认为false. - scroll
(可选,时间单位)指定应为滚动搜索维护索引的一致视图多长时间。 - slices
(可选,整数)此任务应分为的切片数。默认为 1,表示任务不被分割成子任务。 - max_docs
(可选,整数)要处理的最大文档数。默认为所有文档。当设置为小于或等于的值时,scroll_size将不会使用滚动来检索操作的结果。
请求正文
- conflicts
(可选,枚举)设置为proceed继续重建索引,即使存在冲突。默认为abort. - max_docs
(可选,整数)要重建索引的最大文档数。如果conflicts等于 proceed,则 reindex 可能会尝试从源中重新索引更多的文档,直到max_docs它成功地将文档索引max_docs到目标中,或者它已经遍历了源查询中的每个文档。 - source
- index
(必需,字符串)要从中 复制的数据流、索引或别名的名称 。还接受以逗号分隔的列表以从多个来源重新编制索引。 - query
(可选,查询对象)指定要使用查询 DSL 重新编制索引的文档。 - remote
- host
(可选,字符串)要从中 编制索引的 Elasticsearch 远程实例的 URL 。从远程 Elasticsearch 重建时需要 - username
(可选,字符串)用于对远程主机进行身份验证的用户名。 - password
(可选,字符串)用于对远程主机进行身份验证的密码。 - socket_timeout
(可选,时间单位)远程套接字读取超时。默认为 30 秒。 - connect_timeout
(可选,时间单位)远程连接超时时间。默认为 30 秒。 - headers
(可选,对象)包含请求标头的对象。
- size
{可选,整数)每批要索引的文档数。从远程建立索引时使用,以确保批次适合堆上缓冲区,默认最大大小为 100 MB。 - slice
- id
(可选,整数)手动切片的切片 ID 。 - max
(可选,整数)切片总数。
- _source
(可选,字符串)true重新索引所有源字段。设置为列表以重新索引选择字段。默认为true.
- dest 来源
- index
(必需,字符串)要复制到的 数据流、索引或索引别名的名称。 - version_type
(可选,枚举)用于索引操作的版本控制。有效值:internal、external、external_gt、external_gte。 - op_type
(可选,枚举)设置为仅创建不存在的索引文档(如果不存在则放置)。有效值:index, create。默认为index. - pipeline
(可选,字符串)要使用的 管道 的名称。
- script
- source
(可选,字符串)重建索引时运行以更新文档源或元数据的脚本。 - lang
(可选,枚举)脚本语言:painless, expression, mustache, java.
响应说明
- took
(整数)整个操作花费的总毫秒数。 - timed_out
(Boolean)如果在重新索引期间执行的任何请求超时,则为true。 - total
(整数)成功处理的文档数。 - updated
(整数)成功更新的文档数,即在重新索引更新之前已经存在具有相同 ID 的文档。 - created
(整数)成功创建的文档数。 - deleted
(整数)成功删除的文档数。 - batches
(整数)重新索引拉回的滚动响应数。 - noops
noop(整数)由于用于重建索引的脚本返回了的值 而被忽略的文档数。 - version_conflicts
(整数)重新索引命中的版本冲突数。 - retries
(整数)重新索引尝试的重试次数。bulk是重试的批量操作的数量,search是重试的搜索操作的数量。 - throttled_millis
(整数)请求睡眠以符合的毫秒数requests_per_second。 - requests_per_second
(整数)重建索引期间每秒有效执行的请求数。 - throttled_until_millis
(整数)此字段在响应中应始终等于零_reindex。它仅在使用Task API时才有意义,它指示下一次再次执行请求的毫秒数. - failures
(数组)如果在此过程中出现任何不可恢复的错误,则为失败数组。如果这是非空的,那么请求会因为这些失败而中止。Reindex 是使用批处理实现的,任何失败都会导致整个过程中止,但当前批处理中的所有失败都会收集到数组中。可以使用conflicts选项来防止重新索引在版本冲突时中止。
先创建目标索引
索引重建,不会从源或其关联模板复制设置。因此,须提前配置映射、分片计数、副本等。所以我们先创建一个目标索引,设置好相应的设置,然后再 _reindex
示例:我们创建一个目标索引 person1
PUT /person1
{
"mappings": {
"properties": {
"age": {
"type": "integer"
},
"birthday": {
"type": "date",
"format":"yyyy-MM-dd HH:mm:ss"
},
"name": {
"type": "text"
},
"height": {
"type": "float"
},
"id": {
"type": "long"
},
"sex":{
"type": "byte"
}
}
}
}
此处我们设置了新的映射,该映射name属性映射为了text类型。
索引重建
POST /_reindex
{
"source": {
"index": "person"
},
"dest": {
"index": "person1"
}
}
响应信息
{
"took": 296,
"timed_out": false,
"total": 1,
"updated": 0,
"created": 1,
"deleted": 0,
"batches": 1,
"version_conflicts": 0,
"noops": 0,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1,
"throttled_until_millis": 0,
"failures": []
}