上篇文档向读者介绍了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"
}
'
执行结果如下:
上面这个命令,会将 {"name":"John Doe"}
文档索引到customer索引、_doc类型中。如果对一个不同(或者相同)的文档使用如上命令,Elasticsearch则会使用一个新的文档来重新索引ID为1的那个文档,例如,再次执行上面这个命令,结果如下:
可以看到,响应结果中, _id
依然为1,但是 _version
为2, result
也变为 updated
了。这是文档内容相同的情况,文档内容要是不同的话,则会更新ID为1的文档,如下:
此时会将ID为1的文档更新,结果如上图。
在创建索引时,ID参数并不是必须的,也可以不指定ID,此时会自动生成一个ID,例如如下请求:
curl -X POST "localhost:9200/customer/_doc?pretty" -H 'Content-Type: application/json' -d'
{
"name": "Jane Doe"
}
'
执行结果如下:
可以看到,此时自动生成了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的文档内容进行修改,结果如下:
还可以在修改字段的同时,再添加上新的字段,如下:
curl -X POST "localhost:9200/customer/_doc/1/_update?pretty" -H 'Content-Type: application/json' -d'
{
"doc": { "name": "Jane Doe", "age": 20 }
}
'
在更新文档时,也可以使用一些简单的脚本,例如给age增加5,请求如下:
curl -X POST "localhost:9200/customer/_doc/1/_update?pretty" -H 'Content-Type: application/json' -d'
{
"script" : "ctx._source.age += 5"
}
'
执行结果如下:
在这个案例中, ctx._source
指向当前被更新的文档。
这里介绍的只是更新文档的最基本的API,更多API,我将在未来的文章中继续向读者介绍。
删除文档
删除文档是一个相当直观的操作,如下请求表示删除ID为1的文档:
curl -X DELETE "localhost:9200/customer/_doc/1?pretty"
该请求执行结果如下:
这里介绍的只是删除文档的最基本的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" }
'
执行结果如下:
如下案例,表示更新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"}}
'
执行结果如下:
注意,delete动作,由于删除只需要被删除文档的ID,所以并没有对应的源文档。
bulk API按顺序执行这些操作。如果其中一个操作因为某些原因失败了,它将会继续处理后面的操作。当bulk API返回时,它将提供每个操作的状态(按照同样的顺序),所以开发者能够看到每个操作成功与否。
好了,本文先介绍到这里,有问题欢迎留言讨论。
本文分享自微信公众号 - 江南一点雨(a_javaboy)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。