ElasticSearch的速度已经很快了,但甚至能更快。将多个请求合并成一个,避免单独处理每个请求话费的网络延时和开销。如果你需要从ElasticSearch中检索很多文档,那么使用multi_get
或者mget
API来将这些检索请求放在一个请求中,将比逐个文档请求更快的检索到全部文档。
mget
API要求有一个docs
数组作为参数,每个元素包含检索文档的元数据,包括_index
,_type
,_id
。如果你想检索一个或多个特定的字段,那么你可以通过_source
参数来指定这些字段的名字
curl -XGET 'http://localhost:9200/_mget' -d '
{
"docs":[
{
"_index":"csdn",
"_type":"blog",
"_id":"1"
},
{
"_index":"grade3",
"_type":"class2",
"_id":"1",
"_source":["name","age"]
}
]
}
'
字段说明:
如果你想要的数据在同一个_index
(或者同一个_type
)中,那么你可以URL中指定默认的/_index
或者/_index/_type
,但你仍然可以覆盖这些值:
curl -XGET 'http://localhost:9200/csdn/blog/_mget' -d '
{
"docs":[
{
"_id":"1"
},
{
"_index":"grade3",
"_type":"class2",
"_id":"1",
"_source":["name","age"]
}
]
}
'
如果你想要的数据都在同一_index
并且在同一_type
中,那么你只需要传递一个ids
数据即可:
curl -XGET 'http://localhost:9200/csdn/blog/_mget' -d '
{
"ids":["7","8"]
}
'
返回数据结果如下:
{
"docs" : [
{
"_index" : "csdn",
"_type" : "blog",
"_id" : "7",
"_version" : 6,
"found" : true,
"_source" : {
"name" : "python developer",
"addr" : "广东省 深圳市",
"count" : 2,
"favorite" : [
"music",
"football"
]
}
},
{
"_index" : "csdn",
"_type" : "blog",
"_id" : "8",
"found" : false
}
]
}
注意:ID为8的文档未找到,但这并不影响ID为7的文档可以被找到。从数据可以看出,ID为8的数据未找到时,返回{“found” : false}。并且数据的顺序跟请求时,ID在列表的顺序一致。
与mget
API可以一次性取回多个文档的方式相同,bulk
允许在一个步骤进行多次create
、index
、update
和delete
请求。如果你需要索引一个数据量,比如日志事件,他可以排队和索引数百或数千批次。
bulk基本格式如下:
{action:{metadata}}\n
{request body}\n
{action:{metadata}}\n
{request body}\n
...
这种格式类似一个有效的JSON文档流,它通过换行符(\n)连接到了一起。注意两个要点:
格式说明:
action必须是以下选项之一:
例如,一个完整的update
请求应该是这样的:
{"update":{"_index":"csdn","_type":"blog","_id":"1","_retry_on_conflict":5}}
{"title":"测试"}
上面代码为更新标题操作,值得注意的是:delete
请求是没有request body
的,即一个完整的delete
请求如下:
{"delete":{"_index":"csdn","_type":"blog","_id":"1"}}
把所有的请求整合到一起,一个完整的_bulk
请求如下:
curl -XPOST 'http://localhost:9200/_bulk' -d '
{"delete":{"_index":"csdn","_type":"blog","_id":"1"}}
{"create":{"_index":"csdn","_type":"blog","_id":"1"}}
{"title":"测试"}
{"index":{"_index":"csdn","_type":"blog"}}
{"title":"index测试"}
{"update":{"_index":"csdn","_type":"blog","_id":"1","_retry_on_conflict":5}}
{"doc":{"title":"测试1"}}
'
将会返回如下结果:
{
"took" : 46,
"errors" : false,
"items" : [
{
"delete" : {
"found" : true,
"_index" : "csdn",
"_type" : "blog",
"_id" : "1",
"_version" : 15,
"result" : "deleted",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"status" : 200
}
},
{
"create" : {
"_index" : "csdn",
"_type" : "blog",
"_id" : "1",
"_version" : 16,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"created" : true,
"status" : 201
}
},
{
"index" : {
"_index" : "csdn",
"_type" : "blog",
"_id" : "AV8zdG7wEgThxiHZqqaM",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"created" : true,
"status" : 201
}
},
{
"update" : {
"_index" : "csdn",
"_type" : "blog",
"_id" : "1",
"_version" : 17,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"status" : 200
}
}
]
}
看返回的数据可以看出,将会返回一个{"errors" : false}
,表示所有的请求都成功完成了,若有相关的请求并未完成或出错,那么将会是{"errors" : true}
,并在相应的请求中出现错误明细。
delete请求后面不能带有请求体,delete请求后面不能带有请求体,delete请求后面不能带有请求体;最后一行也要换行,最后一行也要换行,最后一行也要换行。重要的事情说三遍
也许你索引的数据到相同的index
和type
中,为每一个文档指定相同的元数据是一种浪费。_bulk
API也具有类似于_mget
API功能相似的功能,可以URL中指定默认的/_index
或者/_index/_type
,但你仍然可以覆盖这些值:
curl -XPOST 'http://localhost:9200/csdn/blog/_bulk' -d '
{"delete":{"_id":"1"}}
{"create":{"_id":"1"}}
{"title":"测试"}
{"index":{"_index":"grade3","_type":"class2"}}
{"title":"index测试"}
'
在上一篇博客ElasticSearch-简介中,介绍了轻量搜索
,我们知道了如何通过URL进行一些简单的搜索,但那只能针对于在同一索引下并且在同一类型下搜索,然而在很多情况下,我们希望能够在多个索引并且在多个类型下进行搜索,我们也可以通过URL来指定特殊的索引和类型到达这种效果:
csdn
和grade3
索引下进行搜索curl -XGET 'http://localhost:9200/csdn,grade3/_search'
curl -XGET 'http://localhost:9200/c*,g*/_search'
curl -XGET 'http://localhost:9200/csdn,grade3/blog,class2/_search'
curl -XGET 'http://localhost:9200/_all/_search'