Elasticsearch7.2中文教程翻译(十一): 详解Get API

@高效码农  August 4, 2019

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



评论已关闭