接下来讲讲如何修改数据。
es提供数据操作和近实时搜索能力。创建索引、更新你的数据、删除你的数据之后会有1秒钟延迟。这个跟关系型数据库有所区别。
替换文档
我们之前使用下面的命令来创建文档。创建了id为1的文档。
PUT /user/_doc/1?pretty
{
"name": "张三"
}
如果再次执行上面的命令,那么es会替换之前的文档,
PUT /user/_doc/1?pretty
{
"name": "李四"
}
那么会把张三替换为李四,
如果我们使用不同的id,那么es会创建新的文档,但是不影响之前的数据。
PUT /user/_doc/2?pretty
{
"name": "王五"
}
上面的命令生成了id为2的文档。
创建文档时,id是可选的,如果没有指定id,那么es会自动生成一个随机的唯一id。自动生成的id会在查询的时候返回。
POST /user/_doc?pretty
{
"name":"李白"
}
注意,这里使用POST命令。
返回值
{
"_index": "user",
"_type": "_doc",
"_id": "eCsHzmoBN2PYSSeP37g-",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 1
}
更新文档
除了索引文档和替换文档之外,还可以更新文档。es在底层并不是去做更新操作,而是删除老的文档,新建一个文档。
让我们来看下更新文档的例子:
POST /user/_update/1
{
"doc": {
"name": "小王"
}
}
也可以添加其他属性,像age是新增的属性。
POST /user/_update/1
{
"doc": {
"name": "小王",
"age":30
}
}
可以使用简单的脚本来更新文档。如给年龄加5。
POST /user/_update/1
{
"script":"ctx._source.age+=5"
}
上面的例子,通过ctx._source来获取原数据。
es也可以根据查询条件来更新某个属性。
POST /user/_update_by_query
{
"script":"ctx._source.name=100",
"query":{
"term":{
"name":"77777"
}
}
}
删除文档
删除文档非常简单,看下面的例子:
DELETE /user/_doc/1
返回值
{
"_index": "user",
"_type": "_doc",
"_id": "1",
"_version": 9,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 8,
"_primary_term": 1
}
从result看状态为deleted。表示已经删除了。可以通过_delete_by_query接口来根据条件删除。删除整个索引的性能要比根据条件删除所有文档的性能要高。
批处理
除了提供单个文档的创建、修改、删除操作外,es还支持通过_bulk接口批量创建、修改、删除文档操作。该操作可以减少网络io请求。
批量创建索引
POST /user/_bulk
{"index":{"_id":3}}
{"name":"小张"}
{"index":{"_id":4}}
{"name":"小李"}
使用上面的接口,发现The bulk request must be terminated by a newline错误。
需要在json结束之后,加一个空格,这样就可以执行成功了。
{
"took": 11,
"errors": false,
"items": [
{
"index": {
"_index": "user",
"_type": "_doc",
"_id": "1",
"_version": 4,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 14,
"_primary_term": 2,
"status": 200
}
},
{
"index": {
"_index": "user",
"_type": "_doc",
"_id": "2",
"_version": 3,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 15,
"_primary_term": 2,
"status": 200
}
}
]
}
批量修改和删除文档
POST /user/_bulk?pretty
{"update":{"_id":"1"}}
{"doc": {"name":"John Doe"} }
{"delete":{"_id":"2"}}
返回值
{
"took": 98,
"errors": false,
"items": [
{
"update": {
"_index": "user",
"_type": "_doc",
"_id": "1",
"_version": 4,
"result": "noop",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"status": 200
}
},
{
"delete": {
"_index": "user",
"_type": "_doc",
"_id": "2",
"_version": 4,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 16,
"_primary_term": 2,
"status": 200
}
}
]
}
上面的删除操作,只需要根据文档id删除。
Bulk接口不会因为某个操作失败而失败。如果某个操作因为某些原因失败了,Bulk将继续执行下面的操作。当Bulk执行完成之后,会根据执行顺序返回执行状态,方便查询操作是否成功。
注意:本文归作者所有,未经作者允许,不得转载