获取多个文档

尽管Elasticsearch已经很快了,但是它依旧可以更快。你可以将多个请求合并到一个请求中以节省网络开销。如果你需要从Elasticsearch中获取多个文档,你可以使用multi-get 或者 mget API来取代一篇又一篇文档的获取。

mgetAPI需要一个docs数组,每一个元素包含你想要的文档的_index, _type以及_id。你也可以指定_source参数来设定你所需要的字段:

  1. GET /_mget
  2. {
  3. "docs" : [
  4. {
  5. "_index" : "website",
  6. "_type" : "blog",
  7. "_id" : 2
  8. },
  9. {
  10. "_index" : "website",
  11. "_type" : "pageviews",
  12. "_id" : 1,
  13. "_source": "views"
  14. }
  15. ]
  16. }

返回值包含了一个docs数组,这个数组以请求中指定的顺序每个文档包含一个响应。每一个响应都和独立的get请求返回的响应相同:

  1. {
  2. "docs" : [
  3. {
  4. "_index" : "website",
  5. "_id" : "2",
  6. "_type" : "blog",
  7. "found" : true,
  8. "_source" : {
  9. "text" : "This is a piece of cake...",
  10. "title" : "My first external blog entry"
  11. },
  12. "_version" : 10
  13. },
  14. {
  15. "_index" : "website",
  16. "_id" : "1",
  17. "_type" : "pageviews",
  18. "found" : true,
  19. "_version" : 2,
  20. "_source" : {
  21. "views" : 2
  22. }
  23. }
  24. ]
  25. }

如果你所需要的文档都在同一个_index或者同一个_type中,你就可以在URL中指定一个默认的/_index或是/_index/_type

你也可以在单独的请求中重写这个参数:

  1. GET /website/blog/_mget
  2. {
  3. "docs" : [
  4. { "_id" : 2 },
  5. { "_type" : "pageviews", "_id" : 1 }
  6. ]
  7. }

事实上,如果所有的文档拥有相同的_index 以及 _type,直接在请求中添加ids的数组即可:

  1. GET /website/blog/_mget
  2. {
  3. "ids" : [ "2", "1" ]
  4. }

请注意,我们所请求的第二篇文档不存在,这是就会返回如下内容:

  1. {
  2. "docs" : [
  3. {
  4. "_index" : "website",
  5. "_type" : "blog",
  6. "_id" : "2",
  7. "_version" : 10,
  8. "found" : true,
  9. "_source" : {
  10. "title": "My first external blog entry",
  11. "text": "This is a piece of cake..."
  12. }
  13. },
  14. {
  15. "_index" : "website",
  16. "_type" : "blog",
  17. "_id" : "1",
  18. "found" : false <1>
  19. }
  20. ]
  21. }
  1. 文档没有被找到。

当第二篇文档没有被找到的时候也不会影响到其它文档的获取结果。每一个文档都会被独立展示。

注意:上方请求的HTTP状态码依旧是200,尽管有个文档没有找到。事实上,即使所有的文档都没有被找到,响应码也依旧是200。这是因为mget这个请求本身已经成功完成。要确定独立的文档是否被成功找到,你需要检查found标识。