简介
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会在后台把删除的文档进行清除。
注意:本文归作者所有,未经作者允许,不得转载