elasticsearch之Document APIs【Get API】

来源:互联网 发布:淘宝网服装女装秋装 编辑:程序博客网 时间:2024/05/18 01:48

环境

虚拟机:centos7
操作系统:win7
elasticsearch:5.5

Get API

get API允许你从索引(数据库)中通过id来查询得到json类型的文档。
下面的例子是从名为twitter的数据库中的一个叫tweet表中查询id0json文档。

GET twitter/tweet/0

结果如下:

{    "_index" : "twitter",    "_type" : "tweet",    "_id" : "0",    "_version" : 1,    "found": true,    "_source" : {        "user" : "kimchy",        "date" : "2009-11-15T14:12:12",        "likes": 0,        "message" : "trying out Elasticsearch"    }}

上述的结果包括_index_type_id_version。如果查询有结果的话,实际上还会返回_source字段。(found字段表示查询是否有结果)。

也可以通过HEAD api来检查文档是否存在:

HEAD twitter/tweet/0

Realtime

默认情况下,get api是实时的,并且不受索引(数据库)(当数据搜索可见时)刷新频率的影响。如果一个文档已经更新但是没有刷新,get api将会就地发送一个刷新请求以使得文档可见。这也会使得在至上次刷新后,修改的其他文档变得可见。想要禁止实时查询,可以把realtime参数设置为false

Optional Type

get api允许使用可选参数_type。将其设置为_all时,其将会匹配所有type(即:表),并返回根据id匹配到的第一个文档。

Source filtering

默认情况下,get操作返回的文档的内容是在_source字段里,除非你使用stored_fields参数或者如果_source字段是禁用的。你可以使用_source参数来关闭_source的检索。

GET twitter/tweet/0?_source=false

如果从完整的_source中,你仅仅需要一个或者两个字段,你可以使用_source_include_source_exclude参数来包含或者排除(过滤)你需要的部分。
这对于大型文档是尤其有用的,因为局部的检索可以节省网络开销。两个参数将采用逗号分隔的字段列表或者通配符的表达式。

GET twitter/tweet/0?_source_include=*.id&_source_exclude=entities

如果你仅仅想指定包含的字段,你可以使用简写:

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

Stored Fields

get 操作允许指定一组stored fields(存储字段),该字段将通过stored_fields参数来指定返回。如果请求的字段没有被存储的,他们将会被忽略掉。例如:考虑下面的映射:

PUT twitter{   "mappings": {      "tweet": {         "properties": {            "counter": {               "type": "integer",               "store": false            },            "tags": {               "type": "keyword",               "store": true            }         }      }   }}

现在我们添加一个文档:

PUT twitter/tweet/1{    "counter" : 1,    "tags" : ["red"]}

1、尝试去查询它们:

GET twitter/tweet/1?stored_fields=tags,counter

结果是:

{   "_index": "twitter",   "_type": "tweet",   "_id": "1",   "_version": 1,   "found": true,   "fields": {      "tags": [         "red"      ]   }}

从文档中获取字段值,返回其自身,即:要是是数组,就返回数组。当尝试获取stored_fields时,由于counter字段没有被存储,get请求要直接忽视它。

也可以提取(或者叫 得到)元数据字段,比如:_routing_parent字段:

PUT twitter/tweet/2?routing=user1{    "counter" : 1,    "tags" : ["white"]}
GET twitter/tweet/2?routing=user1&stored_fields=tags,counter

结果为:

{   "_index": "twitter",   "_type": "tweet",   "_id": "2",   "_version": 1,   "_routing": "user1", //<-   "found": true,   "fields": {      "tags": [         "white"      ]   }}

也可以通过stored_field选项,只返回叶子字段(我认为就是局部字段)。因此,对象字段不能被返回,并且请求将会失败。

Getting the _source directly(直接获取_source)

使用/{index}/{type}/{id}/_source来只获取_source字段的文档,不会有任何不加的内容。例如:

GET twitter/tweet/1/_source

你也可以使用source filtering参数来控制,_source 字段将要返回的部分:

GET twitter/tweet/1/_source?_source_include=*.id&_source_exclude=entities'

注意,也可以在HEAD请求中使用_source,来高效的测试文档_source是否存在。如果在映射中禁止了_source,那么已存在的文档将不会有_source

HEAD twitter/tweet/1/_source

Routing(路由)

当在索引(即:数据库)中使用routing(具有控制路由的能力)时,为了得到文档,也应该提供routing的值,例如:

GET twitter/tweet/2?routing=user1

上面请求是得到tweetid为2的文档,但是其路由是基于user1。注意,发送一个get请求,而没有正确的路由的话,那将会造成查询不到文档。

Preference(偏好)

控制哪个分片副本来执行get请求的preference,默认情况下,是随机选择的。

preference可以设置为:

_primary:

操作将只会在主分片上执行。

_local:

如果可能的话,操作将会优先在本地分配的分片上执行。

Custom (string) value:

自定义的值将被用于确保同一个自定义的值将会被同一个分片上执行。
这有助于在不同刷新状态下,击中不同分片的jumping values。比如:像websession id或者user name

Refresh(刷新)

refresh参数可以设置为true,为了在get操作和使数据可被搜索之前刷新相关分片。
设置为true,应该是建立在仔细思考和验证之后,以确保不会造成系统的沉重负担(和索引缓慢)。

Distributed(分布式)

get操作会得到被哈希的特定的分片id。接着会重定向到该分片id中的其中一个副本上并返回结果。副本是指该分片id组中的主分片和其副本分片。这意味着我们有更多的副本,我们更高效的使用get

Versioning support(版本支持)

只有在当前版本号等于指定的时,你才可以使用version参数来取回文档。
对所有的版本类型而言,这个行为是相同的,除了FORCE版本类型,因为其总是会取回文档。注意:FORCE版本类型,已经启用。

在内部,elasticsearch会将旧文档标记为已删除,并添加一个全新的文档。旧版本号的文档不会立即删除,尽管你已经无法访问到它了。在你继续索引更多的数据时,elasticsearch会在后台清除(标记为)已删除文档。

原创粉丝点击