您的位置:首页 > 其它

elasticsearch Getting Started (四)-修改数据

2016-09-21 16:05 253 查看
@[ElasticSearch]

作者博客地址

原文链接(英文)

Elasticsearch
提供准实时的数据操作和查询能力。默认情况下,从你索引,删除,更新数据到可以查询之间有1s的延时(refresh interval),这是
Elasticsearch
和其他完成事务之后数据立即可用的平台(例如SQL)之间最大的区别。

索引和替换数据

前文我们提到过如何索引一个单独的索引,现在重新拿过来,如下所示:

curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
{
"name": "John Doe"
}'


我们将数据索引到了指定的
customer
索引
external
类型的ID1中。接下来我们可以执行下面的命令,将新的文档替换(reindex)掉原来已经存在的ID为1的文档:

curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
{
"name": "Jane Doe"
}'


上面的命令将文档中,ID为1的
name
John Doe
替换成了
Jane Doe
,如果我们使用其他的ID而不是1的话,一条新的文档将会索引到
Elasticsearch
,而原来的数据保持不变。

curl -XPUT 'localhost:9200/customer/external/2?pretty' -d '
{
"name": "Jane Doe"
}'


上面的命令索引了一条数据到ID2中。

在索引数据过程中,
ID
是可选的,如果没有指定的话,
Elasticsearch
会随机生成一个ID,用这个ID去索引数据。不论是指定的还是自动生成的ID都会作为数据索引的结果返回。

curl -XPOST 'localhost:9200/customer/external?pretty' -d '
{
"name": "Jane Doe"
}'


注意在上面的命令中,我们使用了
POST
代替
PUT
,而且没有指定ID。

更新文档

除了可以索引和替换数据,我们也可以更新数据,但是
Elasticsearch
做不到在原来的数据中进行更新。当我们做更新操作时,
Elasticsearch
会删除原来的数据,索引一个更新过数据的新的文档到
Elasticsearch
中。

下面的命令更新了前文中我们的ID为1的文档,将
name
字段的值更改为了
Jane Doe


curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
{
"doc": { "name": "Jane Doe" }
}'


下面的命令更新了前文中我们的ID为1的文档,将
name
字段的值更改为了
Jane Doe
,同时添加了一个新的字段
age


curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
{
"doc": { "name": "Jane Doe", "age": 20 }
}'


还可以通过使用简单的脚本来进行更新操作。下面的例子用脚本语言将
age
字段加了5:

curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
{
"script" : "ctx._source.age += 5"
}'


上面例子中,
ctx._source
指定的是当前需要更新的文档。

在本文完成时,更新操作只能一次在一条文档中进行,以后
Elasticsearch
可能会提供更新多个文档的能力,就像SQL中的
UPDATE-WHERE
语句。

删除文档

删除文档相当的简单。下面的命令展示了怎样删除我们前文
customer
中ID为2的文档:

curl -XDELETE 'localhost:9200/customer/external/2?pretty'


delete-by-query
插件可以指定查询中所有的文档。

批处理

除了可以对单个文档进行索引,更新,删除操作,
Elasticsearch
也提供了对多个文档进行上述操作的批处理的能力。
_bulk API
提供了一种高效的机制进行快速的多个操作而且尽量少的进行网络交换。

作为一个简单的例子,下面的命令可以使用一条
bulk
命令索引两条数据:

curl -XPOST 'localhost:9200/customer/external/_bulk?pretty' -d '
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
'


下面的例子在一条
bulk
操作中先更新了第一条文档,然后删除了第二条文档:

curl -XPOST 'localhost:9200/customer/external/_bulk?pretty' -d '
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}
'


对于上面的删除操作后面没有指定的相应的文档,因为删除操作只需要被删除的文档ID。

bulk
操作会顺序执行所有的
actions
。如果一个单个的操作失败了,会继续执行剩下的部分。在返回结果中,它会提供每个操作的执行状态,顺序跟执行顺序相同,这样就可以看到所有操作的执行状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  elasticsearch