【Elasticsearch7.0】文档接口之get接口

star2017 1年前 ⋅ 541 阅读

简介

get接口可以根据id获取一个json格式的文档,如:

curl -XGET "http://127.0.0.1:9200/test/_doc/1?pretty"

返回值为:

{
  "_index" : "test",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 3,
  "_seq_no" : 6,
  "_primary_term" : 5,
  "found" : true,
  "_source" : {
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
  }
}

结果中返回了_index_id_version字段,如果数据被找到了,那么还会返回_source字段,found字段会返回true。
可以通过HEAD接口来检查文档是否存在,

curl -XHEAD "http://127.0.0.1:9200/test/_doc/1?pretty"

实时性

默认情况下,get接口是实时的,不受数据刷新频率影响,如果一个文档被更新了,但是还没有被刷新,那么调用get接口会立马进行刷新,让文档变得可见,这个刷新也会影响其他文档,如果你不想开启实时性,那么可以把realtime参数设置为false。

结果过滤

默认情况下,get接口会返回所有你设置的参数结果,也可以不返回source结果,通过_source参数。如:

curl -XGET "http://127.0.0.1:9200/test/_doc/1?_source=false&pretty"

返回值为:

{
  "_index" : "test",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 3,
  "_seq_no" : 6,
  "_primary_term" : 5,
  "found" : true
}

如果你只需要输出具体某几个字段或者不想输出某些字段,那么可以使用_source_includes或者_source_excludes参数来包含或者排除某些字段,这几个参数很有用,尤其是有很多字段的结果,可以节省网络开销,这两个参数都可以使用逗号或者通配符来表示,如:

curl -XGET "http://127.0.0.1:9200/test/_doc/1?_source_includes=*s*&_source_excludes=mes*&pretty"

返回值为:

{
  "_index" : "test",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 3,
  "_seq_no" : 6,
  "_primary_term" : 5,
  "found" : true,
  "_source" : {
    "post_date" : "2009-11-15T14:12:12",
    "user" : "kimchy"
  }
}

也可以单独指定返回那些结果,如:

curl -XGET "http://127.0.0.1:9200/test/_doc/1?_source=user&pretty"

返回值为:

{
  "_index" : "test",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 3,
  "_seq_no" : 6,
  "_primary_term" : 5,
  "found" : true,
  "_source" : {
    "user" : "kimchy"
  }
}

存储字段

get接口允许指定一组存储字段,通过stored_fields参数,如果没有指定,那么该属性会被忽略,看看下面的映射,如:

curl -XPUT "http://127.0.0.1:9200/test2?pretty" -H "Content-Type: application/json" -d'
{
   "mappings": {
       "properties": {
          "counter": {
             "type": "integer",
             "store": false
          },
          "tags": {
             "type": "keyword",
             "store": true
          }
       }
   }
}'

接着我们来添加文档

curl -XPUT "http://127.0.0.1:9200/test2/_doc/1?pretty" -H "Content-Type: application/json" -d'

{
    "counter" : 1,
    "tags" : ["red"]
}'

接着去查询

curl -XGET "http://127.0.0.1:9200/test2/_doc/1?stored_fields=tags,counter&pretty"

返回的结果为:

{
  "_index" : "test2",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "fields" : {
    "tags" : [
      "red"
    ]
  }
}

该属性总是以数组的形式返回,当获取stored_fields属性的值时,没有设置stored_fields的字段不会返回,也可以使用在_routing属性里,如:

curl -XPUT "http://127.0.0.1:9200/test2/_doc/2?routing=user1&pretty" -H "Content-Type: application/json" -d'
{
    "counter" : 1,
    "tags" : ["white"]
}'

接着获取结果

curl -XGET "http://127.0.0.1:9200/test2/_doc/2?routing=user1&stored_fields=tags,counter&pretty"

返回结果为:

{
  "_index" : "test2",
  "_type" : "_doc",
  "_id" : "2",
  "_version" : 1,
  "_seq_no" : 1,
  "_primary_term" : 1,
  "_routing" : "user1",
  "found" : true,
  "fields" : {
    "tags" : [
      "white"
    ]
  }
}

此外,只能通过stored_field选项来返回叶子节点,因此对象属性不能返回,所有该请求将失败。

直接获取source

可以使用/{index}/_source/{id}来获取source属性,没有其他附加的内容,如:

curl -XGET "http://127.0.0.1:9200/test/_source/1?pretty"

返回值为:

{
  "user" : "kimchy",
  "post_date" : "2009-11-15T14:12:12",
  "message" : "trying out Elasticsearch"
}

也可以使用上面的_source_includes和_source_excludes参数,如

curl -XGET "http://127.0.0.1:9200/test/_source/1?pretty&_source_includes=*s*&_source_excludes=mess*"

返回值为:

{
  "post_date" : "2009-11-15T14:12:12",
  "user" : "kimchy"
}

还可以通过HEAD来验证source是否存在,如果在映射中禁用了文档,那么将不返回_source属性,如:

curl -XHEAD "http://127.0.0.1:9200/test/_source/1?pretty"

路由

如果在创建文档的时候使用了路由,那么在使用get去获取的时候也需要使用相同的路由,如:

curl -XGET "http://127.0.0.1:9200/test/_doc/2?routing=user1&pretty"

返回结果为:

{
  "_index" : "test",
  "_type" : "_doc",
  "_id" : "2",
  "_version" : 1,
  "_seq_no" : 2,
  "_primary_term" : 4,
  "found" : true,
  "_source" : {
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
  }
}

用根据用户进行路由,在获取id为2的文档,注意,如果没有正确的路由,那么将没办法获取到数据。

preference

通过该参数可以控制哪个分片副本被优先查询,默认情况下是随机的。preference可以配置为:
_local:表示优先在本地分片上执行
自定义:通过相同的自定义值确保可以查询相同的分片上,在不同的刷新状态下查询不同的分片,可以自动进行转移,可以使用web session id或者用户名等。

刷新

可以把refresh设置为true,在get之前进行刷新操作,确保数据可以被查询到,设置为true的时候应该好好思考下,是否真的有必要,因为设置完之后会对系统带来很大的负载,并减慢索引速度。

分布式

get操作默认是根据id进行散列的,es支持重定向,get的时候会重定向到该数据所在的分片上,主分片的副本也拥有相同的id,所以副本越多那么可以处理更多的get请求。

版本控制

可以使用version参数来获取相同版本号的数据,可以使用FORCE来强制获取数据,注意FORCE值已经弃用了。
在es内部,已经把旧文档删除了,并生成了一个新文档,老版本的文档没有立即消失,但是你没办法获取到他,又创建了很多文档的时候,es会在后台把删除的文档进行清除。

本文为博主原创文章,未经博主允许不得转载。
更多内容请访问:IT源点

相关文章推荐

全部评论: 0

    我有话说: