Document APIs之Get API

Get API

get API允许根据其id从索引中获取JSON文档。以下示例从名为twitter的索引获取一个JSON文档,其id值为0:

GET twitter/_doc/0
Response: 
{
    "_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如果可以被找到的话。

API还允许使用HEAD例如以下内容检查文档是否存在:

HEAD twitter/_doc/0

Realtime

默认情况下,get API是实时的,并且不受索引刷新率的影响(当数据对搜索可见时)。如果文档已更新但尚未刷新,则get API将就地发出刷新调用以使文档可见。这也将使上次刷新后其他文档发生变化。为了禁用实时GET,可以将realtime参数设置为false。

Source源过滤

默认情况下,_source除非使用了stored_fields参数或_source禁用了该字段,否则get操作将返回该字段的内容。可以使用以下_source参数关闭检索:

GET twitter/_doc/0?_source=false

如果您只需要完整的一个或两个字段,则_source可以使用_source_includes 和_source_excludes参数来包含或过滤掉您需要的部分。这对于大型文档尤其有用,其中部分检索可以节省网络开销。这两个参数都使用逗号分隔的字段列表或通配符表达式。例:

GET twitter/_source/1/?_source_includes=*.id&_source_excludes=entities

如果您只想指定包含,则可以使用较短的表示法:

GET twitter/_doc/0?_source=*.id,retweeted

Stored Fields

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

Response:

{

   "_index": "twitter",

   "_type": "_doc",

   "_id": "1",

   "_version": 1,

   "_seq_no" : 22,

   "_primary_term" : 1,

   "found": true,

   "fields": {

      "tags": [

         "red"

      ]

   }

}

从文档本身获取的字段值总是作为数组返回。由于计数器字段没有存储,因此get请求在尝试获取stored_fields时将忽略它。

也可以检索字段之类的元数据比如字段_routing:

PUT twitter/_doc/2?routing=user1

{

    "counter" : 1,

    "tags" : ["white"]

}
GET twitter/_doc/2?routing=user1&stored_fields=tags,counter

Response:

{

   "_index": "twitter",

   "_type": "_doc",

   "_id": "2",

   "_version": 1,

   "_seq_no" : 13,

   "_primary_term" : 1,

   "_routing": "user1",

   "found": true,

   "fields": {

      "tags": [

         "white"

      ]

   }

}

此外,只有叶子字段可以通过stored_field选项返回。因此无法返回对象字段,此类请求将失败。

Getting the _source directly

使用/{index}/_source/{id}端点只获取_source文档的字段,而不包含任何其他内容。

GET twitter/_source/1

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

GET twitter/_source/1/?_source_includes=*.id&_source_excludes=entities

注意,_source端点还有一个HEAD,可以有效地测试document _source的存在。如果在映射中禁用了现有文档,则该文档将没有_source 。

HEAD twitter/_source/1

Routing

使用控制路由的能力进行索引时,为了获取文档,还应提供路由值。例如

GET twitter/_doc/2?routing=user1

以上将获得带有id的推文2,但将根据用户进行路由,在没有正确路由的情况下发出get将导致无法获取文档

Preference

控制preference哪个分片副本执行get请求。默认情况下,操作在分片复制副本之间随机化。

该preference可设置为:

_local

如果可能,操作将优选在本地分配的分片上执行

自定义(字符串)值

自定义值可以使请求在自定义值对应的分片上执行,有效的解决在不同的刷新状态下命中不同的分片问题,值可以是session id或user name等。

Refresh

可以将refresh参数设置为true,以便在get操作之前刷新相关分片并使其可搜索。将其设置为true时应该在仔细考虑并验证这不会给系统带来沉重的负载(并降低索引速度)之后执行。

Distributed

get操作会从一个指定的shard id得到散列值,然后被重定向到该shard id中的一个分片,并返回结果。分片是主分片及其在同一个shard id组中的副本分片。这意味着,我们拥有的分片越多,GET操作的伸缩性就会越好。

版本控制支持

只有当文档的当前版本等于指定的版本时,才可以使用version参数检索文档。这种行为对于所有版本类型都是相同的,除了总是检索文档的版本类型FORCE之外。注意,不推荐使用FORCE版本类型。

在内部,Elasticsearch将旧文档标记为已删除,并添加了一个全新的文档。旧版本的文档不会立即消失,尽管您无法访问它。当您继续索引更多数据时,Elasticsearch将清理后台已删除的文档。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值