9.2 批处理接口
9.2.1 Multi Get接口
Multi Get允许基于索引、类型以及ID获取多个文档,响应具有一个docs
数组,其中所有获取的文档按顺序对应于原始的multi-get请求,如果多个get
请求中存在个别get
失败了,那么doc
数组中用含有这些错误的对象来代替原本应该是文档的位置。下面是多get
请求的案例:
GET /_mget
{
"docs" : [
{
"_index" : "test",
"_type" : "_doc",
"_id" : "1"
},
{
"_index" : "test",
"_type" : "_doc",
"_id" : "2"
}
]
}
其实就是将原来的get
请求的条件放在了请求体中,这个请求体中可以放多个请求条件,但是发现上述的索引、类型都相同,所以可以进一步提取为:
GET /test/_doc/_mget
{
"docs": [
{
"_id": "1"
},
{
"_id": "2"
}
]
}
总而言之,这里可以把相同的都提取出来,不同的留在请求体的docs
数组中,上述的文档的id可以直接搞成一个数组,更加简洁:
// 注,这里id数组里面的数字虽然不加引号,但是ES生成的id都为String类型,最好加上
GET /test/_doc/_mget
{
"ids": ["1","2"]
}
过滤
默认情况下,get
是取回整个文档中的所有字段,mget
也是一样,但它和get
一样也提供了过滤的功能,只过滤出部分属性进行显示,参数也一样_source_include
和_source_exclude
,_source
可以整体过滤文档属性,下面的_mget
案例展示了一些用法:
GET /test/_doc/_mget
{
"docs": [
// 直接不开启过滤,所以返回的结果中没有文档的具体属性
{
"_id": "1",
"_source": false
},
// 过滤出文档中的name和age属性进行显示
{
"_id": "3",
"_source": ["name", "age"]
},
// 将age属性丢弃,将name属性过滤出来
{
"_id": "4",
"_source": {
"exclude": ["age"],
"include": ["name"]
}
}
]
}
除了上述使用_source
源过滤外,还可以使用字段过滤,关键字为stored_fields
(这个字段不知道是用来干嘛的,有人说是独立于_source
之外单独存储的),比如下面的:
GET /_mget
{
"docs" : [
{
"_index" : "test",
"_type" : "_doc",
"_id" : "1",
"stored_fields" : ["field1", "field2"]
},
{
"_index" : "test",
"_type" : "_doc",
"_id" : "2",
"stored_fields" : ["field3", "field4"]
}
]
}
在实操时,这个字段没搞懂啥意思,只能过滤_source
,测试下来好像就只能选择是否显示_source
,下面是测试过程:
// 取出原始文档
GET /_mget
{
"docs" : [
{
"_index": "glodon",
"_id": "2"
},
{
"_index": "shardstest",
"_id": 1
}
]
}
// 最原始的结果
{
"docs": [
{
"_index": "glodon",
"_type": "employee",
"_id": "2",
"_version": 2,
"found": true,
"_source": {
"user": "test",
"likes": 3,
"post_date": 1542347983,
"message": "trying out Elasticsearch"
}
},
{
"_index": "shardstest",
"_type": "_doc",
"_id": "1",
"_version": 2,
"found": true,
"_source": {
"product": "xiaomi",
"price": 20890.89
}
}
]
}
// 使用stored_fields字段过滤
GET /_mget
{
"docs": [
{
"_index": "glodon",
"_id": "2",
"stored_fields": ["user", "message"]
},
{
"_index": "shardstest",
"_id": 1,
"stored_fields": ["_source"]
}
]
}
// 过滤后的结果
{
"docs": [
{
"_index": "glodon",
"_type": "employee",
"_id": "2",
"_version": 2,
"found": true
},
{
"_index": "shardstest",
"_type": "_doc",
"_id": "1",