Multi Get API

MULTI GET API 能够基于索引名,没醒(可选)和id获取多个文档。响应结果包括一个包含了所有获取结果的 docs 数组,每个元素都和 get api 的返回结果的结构类似,例子如下:

  1. curl 'localhost:9200/_mget' -d '{
  2. "docs" : [
  3. {
  4. "_index" : "test",
  5. "_type" : "type",
  6. "_id" : "1"
  7. },
  8. {
  9. "_index" : "test",
  10. "_type" : "type",
  11. "_id" : "2"
  12. }
  13. ]
  14. }'

mget 也可以用在一个索引上(这样请求体就无需指定索引名了):

  1. curl 'localhost:9200/test/_mget' -d '{
  2. "docs" : [
  3. {
  4. "_type" : "type",
  5. "_id" : "1"
  6. },
  7. {
  8. "_type" : "type",
  9. "_id" : "2"
  10. }
  11. ]
  12. }'

加上type:

  1. curl 'localhost:9200/test/type/_mget' -d '{
  2. "docs" : [
  3. {
  4. "_id" : "1"
  5. },
  6. {
  7. "_id" : "2"
  8. }
  9. ]
  10. }'

在这种情况下,直接使用 ids 元素可以简化请求体:

  1. curl 'localhost:9200/test/type/_mget' -d '{
  2. "ids" : ["1", "2"]
  3. }'

可选的Type

mget API 中的参数 _type 是可选的,设置 _all 或者不设置该参数将返回所有type中第一个匹配的文档。(译者批注:言外之意就是每个文档只出现一次

如果 type 没有指定并且有多个文档id相同(_type不同),那么将只返回第一个命中的文档。

例如,文档1出现在 typeA 和 typeB 中,下面的查询将会把同样的文档返回两次给你:

  1. curl 'localhost:9200/test/_mget' -d '{
  2. "ids" : ["1", "1"]
  3. }'

你需要明确指定 _type :

  1. GET /test/_mget/
  2. {
  3. "docs" : [
  4. {
  5. "_type":"typeA",
  6. "_id" : "1"
  7. },
  8. {
  9. "_type":"typeB",
  10. "_id" : "1"
  11. }
  12. ]
  13. }

source过滤

默认情况,每个文档都会返回 _source 字段(该字段被存储)。和 get API 类似,你可以使用 _source 参数来指定 _source 特定的字段。你也可以使用 url 参数 _source,_source_include & _source_exclude 来根据情况指定。

例如:

  1. curl 'localhost:9200/_mget' -d '{
  2. "docs" : [
  3. {
  4. "_index" : "test",
  5. "_type" : "type",
  6. "_id" : "1",
  7. "_source" : false
  8. },
  9. {
  10. "_index" : "test",
  11. "_type" : "type",
  12. "_id" : "2",
  13. "_source" : ["field3", "field4"]
  14. },
  15. {
  16. "_index" : "test",
  17. "_type" : "type",
  18. "_id" : "3",
  19. "_source" : {
  20. "include": ["user"],
  21. "exclude": ["user.location"]
  22. }
  23. }
  24. ]
  25. }'

Fields

指定 store 字段能够返回文档特定字段,和 GET API 中的 fields字段类似,例如:

  1. curl 'localhost:9200/_mget' -d '{
  2. "docs" : [
  3. {
  4. "_index" : "test",
  5. "_type" : "type",
  6. "_id" : "1",
  7. "fields" : ["field1", "field2"]
  8. },
  9. {
  10. "_index" : "test",
  11. "_type" : "type",
  12. "_id" : "2",
  13. "fields" : ["field3", "field4"]
  14. }
  15. ]
  16. }'

fields 字段可以在url中指定,默认返回文档全部内容:

  1. curl 'localhost:9200/test/type/_mget?fields=field1,field2' -d '{
  2. "docs" : [
  3. {
  4. "_id" : "1"
  5. },
  6. {
  7. "_id" : "2",
  8. "fields" : ["field3", "field4"]
  9. }
  10. ]
  11. }'

上面的结果文档1中获得字段 field1 field2; 文档2获得field3 field4。

Routing

你可以指定路由参数:

  1. curl 'localhost:9200/_mget?routing=key1' -d '{
  2. "docs" : [
  3. {
  4. "_index" : "test",
  5. "_type" : "type",
  6. "_id" : "1",
  7. "_routing" : "key2"
  8. },
  9. {
  10. "_index" : "test",
  11. "_type" : "type",
  12. "_id" : "2"
  13. }
  14. ]
  15. }'

上面的例子,文档2将通过 key1 寻找对应的分片,但是文档1将通过 key2 寻找对应的分片。