Get API(提取接口)
get API可以根据跟定的id
来获取在索引库中存放的文档。下面演示了从一个叫twitter
的索引库的tweet
type下获取文档,id
是0
:
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
标识了是否找到文档)。
API也可以使用HEAD
请求来判断文档是否存在,例如:
HEAD twitter/tweet/0
实时
默认情况下,get API 是实时的,而且它不受创建索引文档的刷新频率的影响(当数据对search操作可见)。如果文档已经修改完,但没还有冲刷,get API将会发起 就地冲刷操作使得文档可见。这也会导致其他文档在上一次冲刷之后发生改变的也会可见。若要禁止GET
的实时操作,可以设置realtime
参数为false
。
可选的Type
get API允许_type
是可选的,设置为_all
后将会从所有的type
中按顺序返回第一个匹配的文档。
Source
过滤
默认情况下,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
存储字段
get 操作允许指定一系列的存储字段,这些字段将会被通过传递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"]
}
然后提取它:
GET twitter/tweet/1?stored_fields=tags,counter
上面操作的返回结果为:
{
"_index": "twitter",
"_type": "tweet",
"_id": "1",
"_version": 1,
"found": true,
"fields": {
"tags": [
"red"
]
}
}
从文档中获取的字段的值通常是返回一个数组。由于counter
字段没有存储,当尝试获取stored_fields
时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
选项返回。所以object
字段无法返回并且这个请求会失败
生成的字段
如果在创建索引和冲刷过程中没有发生冲刷操作,GET会访问事务日志来获取文档。然而,一些字段只会在创建索引时生成,如果你尝试访问那些只有在创建索引时才会创建的字段,默认情况下会得到一个异常。你可以通过设置ignore_errors_on_generated_fields=true
来忽略那些字段。
直接获取_source
使用/{index}/{type}/{id}/_source
可以只获取文档的_source
字段,不会有其他多余的内容,例如:
GET twitter/tweet/1/_source
你也可以使用过滤参数来控制_source
的哪些部分可以被返回:
GET twitter/tweet/1/_source?_source_include=*.id&_source_exclude=entities'
注意,同样可以使用HEAD操作来检测文档的_source
是否存在。如果它在mapping里被禁止,一个存在的文档也不会有_source
。例如:
HEAD twitter/tweet/1/_source
路由
当创建索引时想要控制路由,为了获取文档,路由的值也因该提供,例如:
GET twitter/tweet/2?routing=user1
以上的操作会获取id为2
的tweet,但是是基于用户来路由的。注意,如果没有设置正确的路由,将会导致问无法被获取。
偏好
可以控制preference
来让get请求在哪个副本分片上进行搜索,默认情况下,操作将随机在各个副本分片上执行。
_primary
操作将只在主分片上执行。
_local
操作将尽可能的在本地分配的分片上执行。
自定义(字符串)值
自定义值将用于保证相同的分片将使用相同的自定义值。这可以帮助在不同冲刷状态下击中不同分片时的“跳跃值”。譬如可以是一些像会话id或者用户名这样的值。
冲刷(Refresh)
refresh
参数可以被设置为true
,用来在get
操作之前冲刷相关的分片,使其变得可搜索。将其设置为true
应在仔细思考和验证后,不会对系统造成重负荷(并减慢索引)。
分布式
get操作被散列到一个指定的分片id。然后被重定向到这个id对于的一个分片并返回结果。这个分片的id是主分片和副本分片组中的一个。这意味着我们在拥有更多的副本时,我们将拥有更好的GET扩展性。
版本控制支持
我们可以在提取文档时使用version
参数,只有在它的当前版本等于指定的版本时才会返回。对于所有版本类型而言,此行为是相同的,但FORCE的版本类型除外,它始终检索文档。注意:FORCE
版本类型已弃用。
在内部,Elasticsearch已将旧文档标记为已删除,并添加了全新的文档。文档的旧版本不会立即消失,尽管您将无法访问该文档。当您继续索引更多数据时,Elasticsearch会在后台清理已删除的文档。