2 文档的基本CRUD与批量操作
2.1 文档的CRUD
Type名,约定都用_doc
Create — 如果ID已经存在,会失败
Index — 如果ID不存在,创建新的文档。否则,先删除现有的文档,再创建新的文档,版本会增加
Update — 文档必须已经存在,更新只会对相应字段做增量修改
2.1.1 Create
PUT users/_create/1
支持自动生成文档ID和指定文档ID两种方式
通过调用“post /users/_doc”
使用HTTP PUT user/_create/1创建时,URI中显示指定_create,此时如果该id的文档已经存在,操作失败
2.1.2 Get
GET users/_doc/1
找到文档,返回HTTP 200
找不到文档,返回HTTP 404
2.1.3 Index
PUT users/_doc/1
和Create不同的地方:如果文档不存在,就索引新的文档。否则,现有文档会被删除,新的文档被索引。版本信息+1
2.1.4 Update
Update不会删除原来的文档,而是实现真正的数据更新
Post方法 / Payload需要包含在“doc”中
POST users/_update/1
{
"doc": {
"albums":["Album1","Album2"]
}
}
2.2 Bulk API
在Rest请求时,重新建立网络开销是非常损耗性能的。而Bulk API的核心思想是在一次Rest请求中就执行多次不同的操作
POST _bulk
{ "index" : { "_index" : "test", "_id" : 1 } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : 2 } }
{ "create" : { "_index" : "test2", "_id" : 3 } }
{ "field1" : "value3" }
{ "update" : {"_id" : 1, "_index" : "test" } }
{ "doc" : {"field2" : "value2" } }
支持在一次API调用中,对索引进行不同操作
支持四种类型操作:Index,Create,Update,Delete
可以在URI中指定Index,也可以在请求的Payload中进行
操作中单条操作失败,并不会影响其他操作
返回结果包括了每一条操作执行的结果
2.3 批量读取 — mget
批量操作,可以减少网络连接所产生的开销,提高性能
GET _mget
{
"docs":[
{
"_index": "user",
"_id": 1
},
{
"_index": "comment",
"_id": 1
}
]
}
2.4 批量查询 — msearch
POST users/_msearch
{}
{"query" : {"match_all" : {}}, "from" : 0, "size" : 10}
{}
{"query" : {"match_all" : {}}}
{"index" : "twitter2"}
{"query" : {"match_all" : {}}}
2.5 常见错误返回
无法连接:网络故障或集群挂了
连接无法关闭:网络故障或节点出错
429:集群过于繁忙
4xx:请求体格式有错
500:集群内部错误
批量操作可以提高性能,但是需要注意,在每次API请求时不要一次发送过多数据,否则可能会对ES集群产生过大压力,反而造成性能下降