Get API

该 API 可以让你基于其 ID 从索引中获取类型化的 JSON 文档。下面的例子从 twetter 索引,_doc 类型下,使用 ID 0 中获取一个 json 文档。

  1. curl -X GET "localhost:9200/twitter/_doc/0?pretty"

以上请求响应结果:

  1. {
  2. "_index" : "twitter",
  3. "_type" : "_doc",
  4. "_id" : "0",
  5. "_version" : 1,
  6. "found": true,
  7. "_source" : {
  8. "user" : "kimchy",
  9. "date" : "2009-11-15T14:12:12",
  10. "likes": 0,
  11. "message" : "trying out Elasticsearch"
  12. }
  13. }

如果能找到文档的话(正如响应中的字段found 中显示的一样), 响应中国包括希望获取到的文档 _index, _type, _id, _version ,以及包含实际文档的 _source 字段。
使用 HEAD 方式,该 API 也可以用来查看文档是否存在:

  1. curl -I "localhost:9200/twitter/_doc/0?pretty"

实时性

默认情况下,该 API 是实时的,并不会受到索引刷新频率的影响(当数据对搜索可见时)。当一个文档被更新,但是没有刷新时,get API 就会发起一个刷新调用,使文档可见。这也会使上次刷新以来,所更改的其他文档变得可见。为了禁用实时获取,可以设置 realtimefalse

该操作默认会返回 _source 字段的内容,除非使用了 stored_fields 参数或者禁用了 _source 字段。可以使用 _source参数关闭 _source 字段的获取:

  1. curl -X GET "localhost:9200/twitter/_doc/0?_source=false&pretty"

如果仅仅要从完成的 _source 中获取一到两个字段,你可以使用 _source_include&_source_exclude 包含或者过滤出想要的字段。对于大的文档很有帮助,因为部分获取可以节省网络开销。两个参数都采用逗号分隔的字段列表,或者通配符表达式。

  1. curl -X GET "localhost:9200/twitter/_doc/0?_source_include=*.id&_source_exclude=entities&pretty"
  2. curl -X GET "localhost:9200/twitter/_doc/0?_source=*.id,retweeted&pretty"

存储字段

该操作可以指定一组存储的字段,通过传入 stored_fields 参数可以返回。如果请求的字段没有存储,他们会被忽略。看以下示例:

  1. curl -X PUT "localhost:9200/twitter?pretty" -H 'Content-Type: application/json' -d'
  2. {
  3. "mappings": {
  4. "_doc": {
  5. "properties": {
  6. "counter": {
  7. "type": "integer",
  8. "store": false
  9. },
  10. "tags": {
  11. "type": "keyword",
  12. "store": true
  13. }
  14. }
  15. }
  16. }
  17. }
  18. '

添加一个文档:

  1. curl -X PUT "localhost:9200/twitter/_doc/1?pretty" -H 'Content-Type: application/json' -d'
  2. {
  3. "counter" : 1,
  4. "tags" : ["red"]
  5. }
  6. '
  1. 尝试获取它:
  1. curl -X GET "localhost:9200/twitter/_doc/1?stored_fields=tags,counter&pretty"

结果如下:

  1. {
  2. "_index": "twitter",
  3. "_type": "_doc",
  4. "_id": "1",
  5. "_version": 1,
  6. "found": true,
  7. "fields": {
  8. "tags": [
  9. "red"
  10. ]
  11. }
  12. }

从文档本身获取的字段值总是作为数组返回。因为 count 字段没有存储,所以在试图获取 stored_fields 时忽略了它。

也可以检索像 _routing 这样的元数据字段:

  1. curl -X PUT "localhost:9200/twitter/_doc/2?routing=user1&pretty" -H 'Content-Type: application/json' -d'
  2. {
  3. "counter" : 1,
  4. "tags" : ["white"]
  5. }
  6. '
  7. curl -X GET "localhost:9200/twitter/_doc/2?routing=user1&stored_fields=tags,counter&pretty"

上面操作的结果:

  1. {
  2. "_index": "twitter",
  3. "_type": "_doc",
  4. "_id": "2",
  5. "_version": 1,
  6. "_routing": "user1",
  7. "found": true,
  8. "fields": {
  9. "tags": [
  10. "white"
  11. ]
  12. }
  13. }

同样,只能通过 stored_field 选项返回叶子字段。所以对象字段无法返回,这些请求会失败。

直接获取 _source

使用 /{index}/{type}/{id}/_source 端点来直接获取文档的 _source 字段,而没有任何附加内容。如:

  1. curl -X GET "localhost:9200/twitter/_doc/1/_source?pretty"

也可以使用相同的源过滤参数来控制 _source 的哪部分将会返回:

  1. curl -X GET "localhost:9200/twitter/_doc/1/_source?_source_include=*.id&_source_exclude=entities'&pretty"

注意,这里还有一种 HEAD 请求的方式可以有效的判断文档的 _source 是否存在。如果在映射中禁用 source,现有的文档将不会有 _source 字段。

  1. curl -I "localhost:9200/twitter/_doc/1/_source?pretty"

路由

当使用路由方式索引时,为了获取文档,路由参数也必须提供,如:

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