Elasticsearch几乎能实时提供数据操作和搜索功能。默认情况下,从开始索引/更新/删除数据到出现搜索结果的时间可以认为需要一秒的时间。这是与SQL等其他平台的重要区别,其中数据在事务完成后可以立即使用。
在上节中我们给索引创建了一个文档,命令为
PUT /customer/_doc/1?pretty { "name": "John Doe" }
如果不存在id为1的文档,索引中将新建一个文档id为1,如果索引中在之前已经存在id为1的文档,新文档将覆盖历史文档。如果我们存入的文档id和已存在的文档id都不相同将不会影响。索引文档时,ID部分是可选的。如果未指定,Elasticsearch将生成一个随机ID,然后用它来索引文档。示例如下,注意这里使用关键词post而不是put因为我们没有指定ID。
1.更新文档内容。
我们不仅能索引和替换文档,还可以更新文档内容,但请注意,Elasticsearch实际上并没有在原文档进行就地更新。无论何时我们进行更新,Elasticsearch都会删除旧文档,索引一个新文档来立刻替换它。示例如下
1.通过替换名字来更新文档。
POST /customer/_doc/1/_update?pretty { "doc": { "name": "Janeee Doe" }
}
2.将名称字段更改为“Jane Doe”并同时向其添加年龄字段来更新我们以前的文档(ID为1)
POST /customer/_doc/1/_update?pretty { "doc": { "name": "Jane Doe", "age": 20 } }
3.更新也可以通过使用简单的脚本来执行。本示例使用脚本将年龄增加5:
POST /customer/_doc/1/_update?pretty { "script" : "ctx._source.age += 5"
}
在上面的例子中,ctx._source引用了即将更新的当前源文档。
Elasticsearch提供了在查询条件下更新多个文档的能力(如SQL UPDATE-WHERE语句),
具体可以参考https://www.elastic.co/guide/en/elasticsearch/reference/6.2/docs-update-by-query.html
2.删除文档
删除文档也很简单
DELETE /customer/_doc/2?pretty
我们也可以在官网查看删除相关api 地址https://www.elastic.co/guide/en/elasticsearch/reference/6.2/docs-delete-by-query.html
3.批量处理
除了能够索引,更新和删除单个文档之外,Elasticsearch还提供了使用_bulk API批量执行上述任何操作的功能。此功能非常重要,因为它提供了一种非常高效的机制,尽可能快地完成多项操作,尽可能少的网络往返。_bulk API的地址为https://www.elastic.co/guide/en/elasticsearch/reference/6.2/docs-bulk.html
示例如下
POST /customer/_doc/_bulk?pretty
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
上述命令在调用在一次批量操作中索引两个文档(ID 1 - John Doe和ID 2 - Jane Doe)。现在我们使用批量操作更新第一个文档并删除id为2的文档
POST /customer/_doc/_bulk?pretty
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}
请注意,对于删除操作,后面没有对应的源文档,因为删除操作只需要删除文档的标识。批量API不会因其中一个操作失败而失败。即不支持事务,如果一个动作因任何原因失败,它将继续处理其后的其余动作。当批量API返回时,它将为每个操作提供一个状态(按照它发送的相同顺序),以便您可以检查特定操作是否失败。