三、文档的基本CRUD操作
create 一个文档
支持自动生成文档ID和指定文档ID两种方式
通过调用post /movies/_doc 系统会自动生成文档ID
使用http put movies/_create/1 创建时,url中显示指定_create ,如果该id的文档已经存在,操作失败
Index 文档
Index和Create区别在于,如果文档不存在,就索引新的文档。否则现有文档会被删除,新的文档被索引并且版本信息+1
可以看到之前的文档已经被更新为最新的niuniu,是因为之前就存在文档id=1,并且能看到版本信息也加了1
update 文档
update方法不会删除原有文档,而是实现真正的数据更新
get 一个文档
检索文档找到,返回状态码200,文档元信息,这里需要注意一下版本信息,同一个id的文档,即被删除版本号也会不断增加
找不到文档,返回状态码404
Bulk Api
支持在一次Api调用中,对不同的索引进行操作,支持index、create、update、delete
可以在url中指定index,也可以在请求的payload中进行
操作中单条操作失败,不会影响其它继续操作,并且返回结果包括了每一条操作执行的结果
多索引bulk批量操作案例:
post _bulk {"index":{"_index" : "test1","_id" : "1"}} {"name":"kaka_bulk"} {"delete":{"_index":"test1","_id":"2"}} {"create":{"_index":"test2","_id":"3"}} {"name":"kaka_create"} {"update":{"_id":"1","_index":"test1"}} {"doc":{"name":"kaka_bulk"}}
返回结果:
{ "took" : 165, "errors" : false, "items" : [ { "index" : { "_index" : "test1", "_type" : "_doc", "_id" : "1", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 0, "_primary_term" : 1, "status" : 201 } }, { "delete" : { "_index" : "test1", "_type" : "_doc", "_id" : "2", "_version" : 1, "result" : "not_found", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 1, "_primary_term" : 1, "status" : 404 } }, { "create" : { "_index" : "test2", "_type" : "_doc", "_id" : "3", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 0, "_primary_term" : 1, "status" : 201 } }, { "update" : { "_index" : "test1", "_type" : "_doc", "_id" : "1", "_version" : 1, "result" : "noop", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "status" : 200 } } ] }
这里需要大家注意:bulk api 对json语法有严格的要求,每个json串不能换行,只能放一行,同时一个json和另一个json串之间必须有一个换行。
单索引bulk批量操作
如果操作的是同一个索引时,bulk语句还可以变化为以下方式
post test1/_bulk {"index":{"_id" : "1"}} {"name":"kaka_bulk"} {"delete":{"_id":"2"}} {"create":{"_id":"3"}} {"name":"kaka_create"} {"update":{"_id":"1"}} {"doc":{"name":"kaka_bulk"}}
单条的返回结果可以自己尝试一下,可以看到单索引bulk跟多索引bulk之间的区别显而易见。
bulk size的最佳大小
bulk request 会加载到内存里,如果太大的话,性能反而会下降,因此需要不断尝试最佳的bulk size,大小最好控制在5~15MB即可,至于条数需要根据当下数据量再调整。
批量读取_mget
道理跟MySQL都一样,只要是批量在一定合理的范围内都会减少网络连接所产生的开销,从而提高性能
需要注意批量获取每个json之间是需要逗号隔开的,否则会报json解析异常
get /_mget { "docs": [ {"_index":"test","_id":"1"}, {"_index":"movies","_id":"2"} ] }
批量搜索_msearch
post kibana_sample_data_ecommerce/_msearch {} {"query":{"match_all":{}},"size":1} {"index":"kibana_smaple_sample_data_flights"} {"query":{"match_all":{}},"size":1}