Get API是一个基于文档id,从索引中获取JSON文档的API,例如如下请求表示从twitter索引中获取一个id为1的索引:
curl -X GET “localhost:9200/twitter/_doc/1?pretty”
执行结果如下:
通过阅读前面的文章,相信大家对这个执行结果应该很熟悉了,这里的执行结果中有 _index
、 _type
、 _id
、 _version
等我们常见的信息,也有found字段表示查询的数据是否存在, _source
字段则表示查询到的数据。
开发者也可以使用HEAD请求查看一个文档是否存在,如下:
curl -I -X HEAD "localhost:9200/twitter/_doc/0
执行结果如下:
Realtime
默认情况下,Get API是实时的,并且不受index刷新率的影响(当数据对搜索可见时)。如果文档已更新但尚未刷新,则Get API将发出刷新调用以使文档可见,这也会导致其他文档发生变化。如果开发者想要禁用实时GET,可以将realtime参数设置为false。
Source filtering
默认情况下,完整的source字段将被返回,如果开发者使用了storedfields字段或者禁用了_source字段,则情况可能会发生变化,例如如下请求:
curl -X GET “localhost:9200/twitter/_doc/1?_source=false&pretty”
执行结果如下:
如果开发者只是需要完整的一个或两个字段,则可以使用sourceinclude参数来包含字段或者使用sourceexclude参数来过滤字段,当文档中的字段比较多时,这种做法非常有用,这样还可以节省网络开销。具体用法如下:
curl -X GET “localhost:9200/twitter/_doc/1?_source_include=user&pretty”
和
curl -X GET “localhost:9200/twitter/_doc/1?_source_exclude=message&pretty”
执行结果如下:
Stored Fields
Get操作允许指定一系列的stored字段,这些字段将会在指定stored_fields参数的时候被返回,如果请求的字段没有被储存,那么将会被忽略。如下:
curl -X PUT “localhost:9200/twitter” -H ‘Content-Type: application/json’ -d’
{
“mappings”: {
“_doc”: {
“properties”: {
“counter”: {
“type”: “integer”,
“store”: false
},
“tags”: {
“type”: “keyword”,
“store”: true
}
}
}
}
}
’
在这里我们指定了counter将不会被存储,而tags将被存储,接下来执行如下请求,添加一个文档:
curl -X PUT “localhost:9200/twitter/_doc/1?pretty” -H ‘Content-Type: application/json’ -d’
{
“counter” : 1,
“tags” : [“red”]
}
’
添加成功后,再去查询,查询时指定stored_fileds,如下:
curl -X GET “localhost:9200/twitter/_doc/1?pretty&stored_fields=tags,counter”
执行结果如下:
可以看到,store为false的字段被忽略掉了。
另外,也可以对元数据进行检索,例如执行如下请求添加一条数据:
curl -X PUT “localhost:9200/twitter/_doc/2?routing=user1&pretty” -H ‘Content-Type: application/json’ -d’
{
“counter” : 1,
“tags” : [“white”]
}
’
添加成功后再进行查询,如下:
curl -X GET “localhost:9200/twitter/_doc/2?pretty&routing=user1&stored_fields=tags,counter”
执行结果如下:
只有leaf字段才可以通过stored_field选项返回,如果是一个Object字段,则无法返回,并且请求会失败,报错如下:
Getting the _source directly
使用 /{index}/{type}/{id}/_source
格式的请求,可以只返回一个文档的_source字段,例如如下请求:
curl -X GET “localhost:9200/twitter/_doc/1/_source?pretty”
执行结果如下:
在此基础上,开发者可以继续使用sourcefiltering来决定要返回_source中的哪些字段,如下:
curl -X GET “localhost:9200/twitter/_doc/1/_source?_source_include=counter&pretty”
执行结果如下:
也可以通过HEAD请求查看一个文档中的_source字段是否存在,前提是没有禁止mapping:
curl -I -X HEAD “localhost:9200/twitter/_doc/1/_source”
执行结果如下:
Routing
开发者如果在创建索引时指定了路由,那么在获取文档时也应该指定正确的路由,如果路由设置不一致将获取不到文档。具体可以参考上篇文章,这里不再赘述。