Get API
该 API 可以让你基于其 ID 从索引中获取类型化的 JSON 文档。下面的例子从 twetter 索引,_doc
类型下,使用 ID 0 中获取一个 json 文档。
curl -X GET "localhost:9200/twitter/_doc/0?pretty"
以上请求响应结果:
{
"_index" : "twitter",
"_type" : "_doc",
"_id" : "0",
"_version" : 1,
"found": true,
"_source" : {
"user" : "kimchy",
"date" : "2009-11-15T14:12:12",
"likes": 0,
"message" : "trying out Elasticsearch"
}
}
如果能找到文档的话(正如响应中的字段found
中显示的一样), 响应中国包括希望获取到的文档 _index
, _type
, _id
, _version
,以及包含实际文档的 _source
字段。
使用 HEAD
方式,该 API 也可以用来查看文档是否存在:
curl -I "localhost:9200/twitter/_doc/0?pretty"
实时性
默认情况下,该 API 是实时的,并不会受到索引刷新频率的影响(当数据对搜索可见时)。当一个文档被更新,但是没有刷新时,get API 就会发起一个刷新调用,使文档可见。这也会使上次刷新以来,所更改的其他文档变得可见。为了禁用实时获取,可以设置 realtime
为 false
。
该操作默认会返回 _source
字段的内容,除非使用了 stored_fields
参数或者禁用了 _source
字段。可以使用 _source
参数关闭 _source
字段的获取:
curl -X GET "localhost:9200/twitter/_doc/0?_source=false&pretty"
如果仅仅要从完成的 _source
中获取一到两个字段,你可以使用 _source_include
&_source_exclude
包含或者过滤出想要的字段。对于大的文档很有帮助,因为部分获取可以节省网络开销。两个参数都采用逗号分隔的字段列表,或者通配符表达式。
curl -X GET "localhost:9200/twitter/_doc/0?_source_include=*.id&_source_exclude=entities&pretty"
curl -X GET "localhost:9200/twitter/_doc/0?_source=*.id,retweeted&pretty"
存储字段
该操作可以指定一组存储的字段,通过传入 stored_fields
参数可以返回。如果请求的字段没有存储,他们会被忽略。看以下示例:
curl -X PUT "localhost:9200/twitter?pretty" -H 'Content-Type: application/json' -d'
{
"mappings": {
"_doc": {
"properties": {
"counter": {
"type": "integer",
"store": false
},
"tags": {
"type": "keyword",
"store": true
}
}
}
}
}
'
添加一个文档:
curl -X PUT "localhost:9200/twitter/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"counter" : 1,
"tags" : ["red"]
}
'
- 尝试获取它:
curl -X GET "localhost:9200/twitter/_doc/1?stored_fields=tags,counter&pretty"
结果如下:
{
"_index": "twitter",
"_type": "_doc",
"_id": "1",
"_version": 1,
"found": true,
"fields": {
"tags": [
"red"
]
}
}
从文档本身获取的字段值总是作为数组返回。因为 count
字段没有存储,所以在试图获取 stored_fields
时忽略了它。
也可以检索像 _routing
这样的元数据字段:
curl -X PUT "localhost:9200/twitter/_doc/2?routing=user1&pretty" -H 'Content-Type: application/json' -d'
{
"counter" : 1,
"tags" : ["white"]
}
'
curl -X GET "localhost:9200/twitter/_doc/2?routing=user1&stored_fields=tags,counter&pretty"
上面操作的结果:
{
"_index": "twitter",
"_type": "_doc",
"_id": "2",
"_version": 1,
"_routing": "user1",
"found": true,
"fields": {
"tags": [
"white"
]
}
}
同样,只能通过 stored_field
选项返回叶子字段。所以对象字段无法返回,这些请求会失败。
直接获取 _source
使用 /{index}/{type}/{id}/_source
端点来直接获取文档的 _source
字段,而没有任何附加内容。如:
curl -X GET "localhost:9200/twitter/_doc/1/_source?pretty"
也可以使用相同的源过滤参数来控制 _source
的哪部分将会返回:
curl -X GET "localhost:9200/twitter/_doc/1/_source?_source_include=*.id&_source_exclude=entities'&pretty"
注意,这里还有一种 HEAD 请求的方式可以有效的判断文档的 _source
是否存在。如果在映射中禁用 source,现有的文档将不会有 _source
字段。
curl -I "localhost:9200/twitter/_doc/1/_source?pretty"
路由
当使用路由方式索引时,为了获取文档,路由参数也必须提供,如:
curl -X GET "localhost:9200/twitter/_doc/2?routing=user1&pretty"
上面的请求获取ID为 2 的推特,但是路由基于用户。注意,在没有正确路由的情况,发起的 get 请求将导致无法获取到文档。
偏好
preference
控制要在哪个分片副本上执行 get 请求。默认情况下,该操作在分片副本上随机执行。
preference
可以设置为:
_primary
该操作只在主分片上执行。
_local
如果可能,该操作倾向于在本地已分配的切片上执行。
自定义字符串值
将使用一个自定义值来确保相同的分片用于相同的自定义值。当在不同的刷新状态中碰到不同的分片时,这可以帮助实现“跳值”。可以是 web session id,或者用户名之类的。
刷新
refresh
参数可以设置为 true
,以便在 get 操作前刷新相关分片,并使其可以搜索到。应该在深思熟虑后,且确认这不会导致负载过重(或者拖慢索引),再将它设置为 true
。
分布式
get 操作被散列到一个特定的分片 ID。然后,它被重定向到一个分片 ID 的副本中,并返回结果。副本是主分片及该分片 ID 组中的副本。这意味着我们拥有的副本越多,扩展效果越好。
版本支持
可以使用 version
字段获取当前版本与指定版本相同的文档。除了 FORCE
版本类型每次都获取到文档,其他版本类型的行为均相同。注意,不赞成使用 FORCE
版本类型。
在内部,Elasticsearch 已将旧文档标记为删除,并添加了一个全新的文档。文档的旧版本不会立即消失,尽管无法访问到。随着继续索引新的数据,elasticsearch 会在后台清理已删除的文档。