Get API - shuiyuebingdian/ElasticSearch GitHub Wiki
get API允许根据其ID从索引获取类型化的JSON文档。以下示例从名为twitter的索引获取一个JSON文档,该索引的类型为tweet,其ID值为0:
GET twitter/tweet/0
上面的get操作的结果是: { "_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 ,如果可以发现(返回结果的found为true)也包括实际文档的_source信息。
该API可以用HEAD方法来检查文档是否存在 ,例如:
HEAD twitter/tweet/0
RealTime
默认情况下,get API是实时的,并且不受索引刷新率的影响(当数据对搜索可见时)。如果文档已更新但尚未刷新,则get API将就地发出刷新调用以使文档可见。自上次刷新以来,这还将使其他文档发生更改。为了禁用实时GET,可以将realtime参数设置为false。
Optional Type
get API允许_type是可选的。将其设置为_all,以获取与所有类型的ID相匹配的第一个文档。
Source filtering
默认情况下,除非已使用stored_fields参数或_source禁用了该字段,否则get操作将返回该字段的内容。您可以使用以下_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参数返回的存储字段。如果未存储请求的字段,则将忽略它们。例如考虑以下映射:
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 上面的get操作的结果是:
{
"_index": "twitter",
"_type": "tweet",
"_id": "1",
"_version": 1,
"found": true,
"fields": {
"tags": [
"red"
]
}
}
从文档本身获取的字段值始终以数组形式返回。由于counter未存储该字段,因此在尝试获取该字段时,get请求只会忽略它stored_fields.
还可以检索元数据字段,例如_routing和_parent字段:
PUT twitter/tweet/2?routing=user1
{
"counter" : 1,
"tags" : ["white"]
}
GET twitter/tweet/2?routing=user1&stored_fields=tags,counter
上面的get操作的结果是: { "_index": "twitter", "_type": "tweet", "_id": "2", "_version": 1, "_routing": "user1", "found": true, "fields": { "tags": [ "white" ] } } 也只能通过该stored_field选项返回叶字段。因此无法返回对象字段,并且此类请求将失败。
直接获取_source
使用/{index}/{type}/{id}/_source端点仅获取_source文档的字段,而周围没有任何其他内容。例如:
GET twitter/tweet/1/_source
您还可以使用相同的源过滤参数来控制_source将返回的哪些部分:
GET twitter/tweet/1/_source?_source_include=*.id&_source_exclude=entities'
注意,_source端点还有一个HEAD变体,可以有效地测试文档_source的存在。如果现有文档在映射中被禁用,则将没有_source 。
HEAD twitter/tweet/1/_source
路由
使用控制路由的索引功能时,为了获取文档,还应该提供路由值。例如:
GET twitter/tweet/2?routing=user1
上面将获得ID为2的推文,但将根据用户进行路由。注意,在没有正确路由的情况下发出get命令将导致无法获取文档。
偏爱
控制在哪个分片副本上执行get请求的preference。默认情况下,该操作在分片副本之间是随机的。
该preference可设置为:
_primary
该操作将仅在主分片上执行。
_local
如果可能,该操作将首选在本地分配的分片上执行。
自定义(字符串)值
自定义值将用于确保将相同的分片用于相同的自定义值。当在不同的刷新状态下击中不同的碎片时,这可以帮助“跳跃值”。示例值可以是Web会话ID或用户名之类的值。
刷新
该refresh参数可以设置为true以刷新有关的碎片get操作之前,并使其可搜索。在仔细考虑和验证这不会对系统造成沉重负担(并减慢索引编制)之后,应将其设置为true。
分散式
get操作将散列到特定的分片ID中。然后将其重定向到该分片ID内的副本之一,并返回结果。副本是主要分片及其在该分片ID组中的副本。这意味着我们将拥有更多的副本,我们将拥有更好的GET缩放比例。
版本支持
version仅当文档的当前版本等于指定的版本时,才可以使用参数检索文档。除FORCE总是检索文档的版本类型外,所有版本类型的行为都相同。请注意,FORCE不赞成使用版本类型。
在内部,Elasticsearch将旧文档标记为已删除,并添加了一个全新的文档。文档的旧版本不会立即消失,尽管您将无法访问它。随着您继续索引更多数据,Elasticsearch在后台清理已删除的文档。