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 会在后台清理已删除的文档。
