Multi Get API
Multi GET API允许基于索引、类型(可选)和id(以及可能的路由)获取多个文档。响应包括一个具有所有获取的文档的docs
数组,每个元素的结构与get API提供的文档相似。这是一个例子:
GET _mget
{
"docs" : [
{
"_index" : "test",
"_type" : "type",
"_id" : "1"
},
{
"_index" : "test",
"_type" : "type",
"_id" : "2"
}
]
}
mget
端点也可以用于索引(在这种情况下,它不需要在主体中):
GET test/_mget
{
"docs" : [
{
"_type" : "type",
"_id" : "1"
},
{
"_type" : "type",
"_id" : "2"
}
]
}
以及类型:
GET test/type/_mget
{
"docs" : [
{
"_id" : "1"
},
{
"_id" : "2"
}
]
}
在这种情况下,ids
元素可以直接用于简化请求:
GET test/type/_mget
{
"ids" : ["1", "2"]
}
可选的类型
mget API允许_type
是可选的。将其设置为_all
或将其留空,以便获取与所有类型的id
匹配的第一个文档。
如果您没有设置类型,并且有很多文档共享相同的_id
,您将最终只得到第一个匹配的文档。
例如,如果您在类型A和类型B中有文档1
,则以下请求将仅返回相同的文档两次:
GET test/_mget
{
"ids" : ["1", "1"]
}
在这种情况下需要明确设置_type
:
GET test/_mget/
{
"docs" : [
{
"_type":"typeA",
"_id" : "1"
},
{
"_type":"typeB",
"_id" : "1"
}
]
}
Source过滤
默认情况下,将为每个文档(如果存储)返回_source
字段。与get API类似,您只能使用_source
参数来检索_source
(或不是所有)的部分。您还可以使用url参数_source
、_source_include
和_source_exclude
来指定默认值,当没有每个文档的指令时,它将被使用。
例如:
GET _mget
{
"docs" : [
{
"_index" : "test",
"_type" : "type",
"_id" : "1",
"_source" : false
},
{
"_index" : "test",
"_type" : "type",
"_id" : "2",
"_source" : ["field3", "field4"]
},
{
"_index" : "test",
"_type" : "type",
"_id" : "3",
"_source" : {
"include": ["user"],
"exclude": ["user.location"]
}
}
]
}
字段
可以根据Get API的stored_fields参数指定特定的存储字段,以便每个文档检索。例如:
GET _mget
{
"docs" : [
{
"_index" : "test",
"_type" : "type",
"_id" : "1",
"stored_fields" : ["field1", "field2"]
},
{
"_index" : "test",
"_type" : "type",
"_id" : "2",
"stored_fields" : ["field3", "field4"]
}
]
}
或者,您可以将查询字符串中的stored_fields
参数指定为默认值以应用于所有文档。
GET test/type/_mget?stored_fields=field1,field2
{
"docs" : [
{
"_id" : "1" //①
},
{
"_id" : "2",
"stored_fields" : ["field3", "field4"] //②
}
]
}
① 返回field1
与field2
② 返回field3
与field4
生成的字段
有关仅在创建索引时生成的字段,请参见生成的字段章节。
路由
你可以通过参数值指定路由值:
GET _mget?routing=key1
{
"docs" : [
{
"_index" : "test",
"_type" : "type",
"_id" : "1",
"_routing" : "key2"
},
{
"_index" : "test",
"_type" : "type",
"_id" : "2"
}
]
}
在这个例子中,文档test/type/2
将从对应于路由键key1
的分片中获取,但是文档test/type/1
将从对应于路由键key2
的分片中获取。