您的位置:首页 > Web前端 > HTML5

ElasticSearch5.x实践_day02_01_ElasticSearch Update

2017-06-05 00:00 411 查看
摘要: ElasticSearch 修改数据更新字段、删除文档、批处理等等

Elasticsearch创建和替换文档

Elasticsearch提供了近乎实时操作和检索数据的能力。默认情况下,在你新增/更新/删除数据之后,大概只有一秒的延迟即可反应在最新的搜索结果中。和其他的平台例如SQL的及时生效比较起来还是有比较大的区别的。

(新建)索引/替换文档
我们之前已经知道了如何索引一个文档,咱们再来复习一下:

PUT /customer/external/1?pretty
{
"name": "John Doe"
}

上面的命令会在customer索引中创建external类型的ID为1的customer文档。如果我们再一次执行上面的命令,Elasticsearch将会替换(重建索引)ID为1的customer文档。

PUT /customer/external/1?pretty
{
"name": "Jane Doe"
}

上面的命令将ID为1的客户名称从John Doe修改为Jane Doe。另外,如果我们使用一个不同的ID,则会创新一个新的文档索引。原ID=1的文档也不会被修改。

PUT /customer/external/2?pretty
{
"name": "Jane Doe"
}

上面的命令将会创建一个新的ID为2的文档。

创建索引的时候,ID是可选的。如果不指定ID,Elasticsearch会生成一个随机ID并使用该ID来索引文档。那个实际的Elasticsearch生成的ID会随调用API的结果一起返回。
下面的例子示意了如何不指定ID而创建一个文档:

POST /customer/external?pretty
{
"name": "Jane Doe"
}

注意上面的例子,我们使用POST方式而非PUT,因为我们没有指定ID。

REST Verb> /<Index>/<Type>/<ID>


Elasticsearch更新文档

除了创建和替换文档,我们也可以更新文档。需要注意的是Elasticsearch在底层并不会整的更新文档。当我们执行更新操作的时候,Elasticsearch会一次性完成先删除,再新建一个文档。
下面的例子示意了如何将我们之前索引的ID为1的文档的name字段修改为“Jane Doe”:

POST /customer/external/1/_update?pretty
{
"doc": { "name": "Jane Doe" }
}

下面的例子示意了如何将我们之前索引的ID为1的文档的name字段修改为“Jane Doe”,并且新增一个age字段:

POST /customer/external/1/_update?pretty
{
"doc": { "name": "Jane Doe", "age": 20 }
}

我们也可以使用简单的额脚本来执行更新操作。下面的例子使用脚本将age的值加5:

POST /customer/external/1/_update?pretty
{
"script" : "ctx._source.age += 5"
}

上面示例中的ctx._source引用的是当前要被更新的文档

需要注意的是使用这个写法,我们一次只能更新一个文档。在未来,Elasticsearch可能会提供根据查询条件更新多个文档的能力。(就像SQL中的UDPATE -WHERE语句)

Elasticsearch删除文档

删除文档非常的简单而直观。下面的例子示意了如何删除我们之前创建的ID为2的客户文档:

DELETE /customer/external/2?pretty

要删除所有满足检索条件的文档可以参考 【Delete By Query API】。(不过这个API并没有太大价值,因为删除整个索引要比删除索引中的满足条件的所有的文档来的更高效)。

Elasticsearch批处理

除了创建、更新和删除个别文档,Elasticsearch还提供了使用_bulk API的上述操作的批量操作方法。这个功能很重要,因为他提供了一种有效的机制来在尽可能少的网络传输过程中执行多次操作。

作为一个快速示例,下面的命令在一次批量操作中索引了两个文档(ID=1 John Doe和ID=2的Jane doe):

POST /customer/external/_bulk?pretty
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }

下面的示例在一次批量操作中更新了ID为1的文档并且删除了第二个文档(ID为2的):

POST /customer/external/_bulk?pretty
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}

注意,上面的delete命令并没有source作为参数,因为删除操作需要文档的ID即可完成。

批量API中的某个动作失败并不会导致整个事务失败,如果因为某种原因其中一个动作失败了,其他的动作仍然会继续执行。当该API调用执行完毕,在返回值中会提供每个动作的状态(与提交请求时的动作顺序相同),所以从中你可以得知哪个动作失败或成功了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ElasticSearch