上篇文档向读者介绍了Elasticsearch提供的强大的REST API的基本用法,不过这些API的用法都很基础,本文将和读者继续分享更多的API。

本文是Elasticsearch系列的第三篇,阅读前面的文章,有助于更好的理解本文:


1.elasticsearch安装与配置

2.初识elasticsearch中的REST接口


Elasticsearch提供了近乎实时(NRT)的数据操作和搜索功能。默认情况下,对数据进行索引/更新/删除,到该数据出现在搜索结果中,延迟时间不超过1秒,这是和其他SQL一个很大的区别。

索引/替换文档

在前文我们提到过,通过如下命令可以建立一个索引:

curl -X PUT "localhost:9200/customer/_doc/1?pretty" -H 'Content-Type: application/json' -d' 
{
"name": "John Doe"
}
'

执行结果如下:

elasticsearch修改数据_json

上面这个命令,会将 ​​{"name":"John Doe"}​​文档索引到customer索引、_doc类型中。如果对一个不同(或者相同)的文档使用如上命令,Elasticsearch则会使用一个新的文档来重新索引ID为1的那个文档,例如,再次执行上面这个命令,结果如下:

elasticsearch修改数据_json_02

可以看到,响应结果中, ​​_id​​依然为1,但是 ​​_version​​为2, ​​result​​也变为 ​​updated​​了。这是文档内容相同的情况,文档内容要是不同的话,则会更新ID为1的文档,如下:

elasticsearch修改数据_json_03

此时会将ID为1的文档更新,结果如上图。

在创建索引时,ID参数并不是必须的,也可以不指定ID,此时会自动生成一个ID,例如如下请求:

curl -X POST "localhost:9200/customer/_doc?pretty" -H 'Content-Type: application/json' -d'  
{
"name": "Jane Doe"
}
'

执行结果如下:

elasticsearch修改数据_批处理_04

可以看到,此时自动生成了ID。

注意,最后一个是POST请求,而前面的都是PUT请求

更新文档

除了可以索引、替换文档之外,也可以更新一个文档。需要注意的是,Elasticsearch底层并不支持更新操作,所谓的更新,是将旧的文档删除,然后索引一个新的文档。如下:

curl -X POST "localhost:9200/customer/_doc/1/_update?pretty" -H 'Content-Type: application/json' -d'  
{
"doc": { "name": "Jane Doe" }
}
'

这个请求,表示对ID为1的文档内容进行修改,结果如下:

elasticsearch修改数据_批处理_05

还可以在修改字段的同时,再添加上新的字段,如下:

curl -X POST "localhost:9200/customer/_doc/1/_update?pretty" -H 'Content-Type: application/json' -d'  
{
"doc": { "name": "Jane Doe", "age": 20 }
}
'

elasticsearch修改数据_批处理_06

在更新文档时,也可以使用一些简单的脚本,例如给age增加5,请求如下:

curl -X POST "localhost:9200/customer/_doc/1/_update?pretty" -H 'Content-Type: application/json' -d'  
{
"script" : "ctx._source.age += 5"
}
'

执行结果如下:

elasticsearch修改数据_json_07

在这个案例中, ​​ctx._source​​指向当前被更新的文档。

这里介绍的只是更新文档的最基本的API,更多API,我将在未来的文章中继续向读者介绍。

删除文档

删除文档是一个相当直观的操作,如下请求表示删除ID为1的文档:

curl -X DELETE "localhost:9200/customer/_doc/1?pretty"

该请求执行结果如下:

elasticsearch修改数据_json_08

这里介绍的只是删除文档的最基本的API,更多API,我将在未来的文章中继续向读者介绍。

批处理

除了对单个的文档进行索引、更新和删除,Elasticsearch也提供了相关操作的批处理功能,这些批处理功能通过使用_bulk API实现。通过批处理可以非常高效的完成多个文档的操作,同时可以减少不必要的网络请求。

如下案例表示索引两个文档:

curl -X POST "localhost:9200/customer/_doc/_bulk?pretty" -H 'Content-Type: application/json' -d'  
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
'

执行结果如下:

elasticsearch修改数据_批处理_09

如下案例,表示更新id为1的索引,然后然后删除id为2的索引:

curl -X POST "localhost:9200/customer/_doc/_bulk?pretty" -H 'Content-Type: application/json' -d'  
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}
'

执行结果如下:

elasticsearch修改数据_批处理_10

注意,delete动作,由于删除只需要被删除文档的ID,所以并没有对应的源文档。

bulk API按顺序执行这些操作。如果其中一个操作因为某些原因失败了,它将会继续处理后面的操作。当bulk API返回时,它将提供每个操作的状态(按照同样的顺序),所以开发者能够看到每个操作成功与否。

好了,本文先介绍到这里,有问题欢迎留言讨论。


elasticsearch修改数据_批处理_11