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在后台清理已删除的文档。