ES已经够快了,但是还能更快。把若干的请求合并到一个,避免了单个的线程请求的网络压力,ES能运行的更快。如果你知道你要检索的很多的document,使用multi-get或mget
API把请求放到一个请求里要比逐次的检索效率要更高。
mget
API期望得到一个docs的数组作为参数,每个参数元素指定你想要检索的_index,_type和_id这三个document的元数据,你也能指定_source参数,如果你仅仅要检索部分的field:
GET /_mget
{
"docs":[
{
"_index":"website",
"_type": "blog",
"_id": 2
},
{
"_index":"website",
"_type": "pageviews",
"_id": 1,
"_source":"views"
}
]
}
响应体也包含了docs数组,并且相对应包含了document的相应信息。每一个相应和执行单个的请求的相应是一样的:
{
"docs":[
{
"_index": "website",
"_id": "2",
"_type": "blog",
"found": true,
"_source":{
"text": "This is a piece of cake...",
"title":"My first external blog entry"
},
"_version":10
},
{
"_index": "website",
"_id": "1",
"_type": "pageviews",
"found": true,
"_version":2,
"_source":{
"views":2
}
}
]
}
如果你要检索的document在同一个_index(也可能在同一个_type),然后你就可以在URL中指定默认的/_index或者/_index/_type,当然你也可以在docs的集合中的单个个体的请求中重写URL中的_index和_type:
GET /website/blog/_mget
{
"docs":[
{"_id":2},
{"_type":"pageviews","_id": 1}
]
}
事实上,如果所有的document有相同的_index和_type。你就可以仅仅传递ids的数组就行了:
GET /website/blog/_mget
{
"ids":["2","1"]
}
要注意的是,有可能请求的第二个document不存在。我们指定type是blog。但是document是1的type是pageviews。这个不存在的document将会在
相应体中体现:
{
"docs":[
{
"_index": "website",
"_type": "blog",
"_id": "2",
"_version":10,
"found": true,
"_source":{
"title": "My first external blog entry",
"text": "This is a piece of cake..."
}
},
{
"_index": "website",
"_type": "blog",
"_id": "1",
"found": false
}
]
}
标记1表示这个document没有找到。
第二个document没有找到并不影响第一个被检索的document,每个docs中的doc都是独立的。
上面这个检索虽然一个document没有找到,但是HTTP状态码是200,事实上,即使所有的document都没有找到,HTTP的状态码也是200。这是因为mget请求的本身是完整的,成功的。要验证document是否是成功的,可以对单个的document的found这个标记进行验证。
原文:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_retrieving_multiple_documents.html