ElasticSearch-多索引检索与批量操作,elasticsearch-索引
ElasticSearch的速度已经很快了,但甚至能更快。将多个请求合并成一个,避免单独处理每个请求话费的网络延时和开销。如果你需要从ElasticSearch中检索很多文档,那么使用multi_get或者mgetAPI来将这些检索请求放在一个请求中,将比逐个文档请求更快的检索到全部文档。
mgetAPI要求有一个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:类型
- _id:id
- _source:过滤输出想要的字段
如果你想要的数据在同一个_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在列表的顺序一致。
批量操作-bulk
与mgetAPI可以一次性取回多个文档的方式相同,bulk允许在一个步骤进行多次create、index、update和delete请求。如果你需要索引一个数据量,比如日志事件,他可以排队和索引数百或数千批次。
bulk基本格式如下:
{action:{metadata}}\n
{request body}\n
{action:{metadata}}\n
{request body}\n
...
这种格式类似一个有效的JSON文档流,它通过换行符(\n)连接到了一起。注意两个要点:
- 每行以\n结尾,==包括最后一行==,它是一个结束标记,也是一个连接的标记符
- 每行不能包含未转义的换行符,因为他们将会对解析造成干扰
格式说明:
- {action:{metadata}}:动作,并且指定哪一个文档
- {request body}:具体信息
action必须是以下选项之一:
- create:如果文档不存在就创建它
- index:创建一个新文档或者覆盖旧文档
- update:部分更新文档
- delete:删除文档
例如,一个完整的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中,为每一个文档指定相同的元数据是一种浪费。_bulkAPI也具有类似于_mgetAPI功能相似的功能,可以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'
- 在以c开头或以g开头的索引下进行搜索
curl -XGET 'http://localhost:9200/c*,g*/_search'
- 在csdn和grade3索引、blog类型和class2类型下进行搜索
curl -XGET 'http://localhost:9200/csdn,grade3/blog,class2/_search'
- 在所有索引下进行搜索
curl -XGET 'http://localhost:9200/_all/_search'