Elasticsearch7.2中文教程翻译(十一): 详解Get API
GET API允许根据索引的id从索引中获取JSON文档。
下面的示例从名为twitter的索引中获取一个JSON文档,该索引的id值为0:
GET twitter/_doc/0
上述get操作结果为:
{
"_index" : "twitter",
"_type" : "_doc",
"_id" : "0",
"_version" : 1,
"_seq_no" : 10,
"_primary_term" : 1,
"found": true,
"_source" : {
"user" : "kimchy",
"date" : "2009-11-15T14:12:12",
"likes": 0,
"message" : "trying out Elasticsearch"
}
}
上面的结果包括我们希望检索的文档的_index
、_id
和_version
,如果能够找到的话,还包括文档的实际_source
(如响应中的found字段所示)。
该API还允许使用HEAD检查文档是否存在,例如:
HEAD twitter/_doc/0
实时
默认情况下,get API是实时的,不受索引刷新率的影响(当数据对搜索可见时)。如果文档已经更新,但还没有刷新,get API将发出一个refresh调用,使文档可见。这还将使自上次刷新以来更改的其他文档可见。为了禁用realtime GET,可以将realtime参数设置为false。
_source过滤
默认情况下,get操作返回_source
字段的内容,除非您使用了stored_fields
参数,或者禁用了_source
字段。可以使用_source
参数关闭_source
检索:
GET twitter/_doc/0?_source=false
如果只需要来自_source
的一两个字段,可以使用_source_include
和_source_exclude
参数来包含或过滤掉所需的部分。这对于部分检索可以节省网络开销的大型文档尤其有用。这两个参数都采用逗号分隔的字段列表或通配符表达式。例子:
GET twitter/_doc/0?_source_includes=*.id&_source_excludes=entities
如果只想指定include,可以使用更短的符号:
GET twitter/_doc/0?_source=*.id,retweeted
存储字段
get操作允许指定一组存储字段,这些字段将通过传递stored_fields参数返回。如果未存储所请求的字段,则将忽略它们。例如,考虑以下映射:
PUT twitter
{
"mappings": {
"properties": {
"counter": {
"type": "integer",
"store": false
},
"tags": {
"type": "keyword",
"store": true
}
}
}
}
现在我们可以添加一个文档:
PUT twitter/_doc/1
{
"counter" : 1,
"tags" : ["red"]
}
然后试着取回它:
GET twitter/_doc/1?stored_fields=tags,counter
上述get操作结果为:
{
"_index": "twitter",
"_type": "_doc",
"_id": "1",
"_version": 1,
"_seq_no" : 22,
"_primary_term" : 1,
"found": true,
"fields": {
"tags": [
"red"
]
}
}
从文档本身获取的字段值总是作为数组返回。由于counter
字段没有存储,因此get请求在尝试获取stored_fields时将忽略它。
也可以检索像_routing字段这样的元数据字段:
PUT twitter/_doc/2?routing=user1
{
"counter" : 1,
"tags" : ["white"]
}
GET twitter/_doc/2?routing=user1&stored_fields=tags,counter
上述get操作结果为:
{
"_index": "twitter",
"_type": "_doc",
"_id": "2",
"_version": 1,
"_seq_no" : 13,
"_primary_term" : 1,
"_routing": "user1",
"found": true,
"fields": {
"tags": [
"white"
]
}
}
此外,只有叶子字段可以通过stored_field选项返回。因此不能返回对象字段,这样的请求将会失败。
直接获取_source
使用/{index}/_source/{id}
只获取文档的_source字段,而不包含任何附加内容。例如:
GET twitter/_source/1
您还可以使用相同的源过滤参数来控制返回_source
的哪些部分:
GET twitter/_source/1/?_source_includes=*.id&_source_excludes=entities
注意,_source端点还有一个HEAD
变量,用于有效地测试文档_source是否存在。如果在映射中禁用现有文档的_source,则该文档将没有_source。
HEAD twitter/_source/1
路由
当使用控制路由的能力进行索引时,为了获得文档,还应该提供路由值。例如:
GET twitter/_doc/2?routing=user1
上面的将获得id为2的tweet,但将根据user1路由。注意,在没有正确路由的情况下发出get将导致无法获取文档。
Preference
控制要在其上执行get请求的碎片副本的首选项。默认情况下,操作是在碎片副本之间随机进行的。
可将Preference
设置为:
_local
:如果可能,该操作更喜欢在本地分配的碎片上执行。
自定义(字符串)值
自定义值将用于确保相同的碎片将用于相同的自定义值。这有助于在不同刷新状态下命中不同碎片时“跳转值”。示例值可以类似于web会话id或用户名。
刷新
可以将refresh参数设置为true,以便在get操作之前刷新相关碎片并使其可搜索。将其设置为true应该在仔细考虑并验证这不会给系统带来沉重的负载(并降低索引速度)之后执行。
分布式
get操作被散列到一个特定的shard id中,然后被重定向到该shard id中的一个副本,并返回结果。副本是主碎片及其在该碎片id组中的副本。这意味着,我们拥有的副本越多,我们的伸缩性就会越好。
版本支持
只有当文档的当前版本等于指定的版本时,才可以使用version参数检索文档。这种行为对于所有版本类型都是相同的,除了总是检索文档的版本类型FORCE之外。注意,不推荐使用FORCE版本类型。
在内部,Elasticsearch将旧文档标记为已删除,并添加了一个全新的文档。旧版本的文档不会立即消失,尽管您无法访问它。当您继续索引更多数据时,Elasticsearch将清理后台已删除的文档。