Eltasticsearch的restful增删改:
(提前声明:文章由作者:张耀烽/CSDN主页:https://blog.csdn.net/youbitch1/
结合自己生产中的使用经验整理,最终形成简单易懂的文章,写作不易,转载请注明)
(整个教程的ES版本以及Kibana版本都是基于5.6.8)
(文章参考:Elasticsearch权威指南(书籍),Elasticsearch官方文档JavaApi5.6.8,实际项目中的应用场景)
(帮到到您请点点关注,文章持续更新中!)
(个人Git主页:https://github.com/Mydreamandreality)
ES的查询体系较为庞大,所以这章只写了增删改,下一章单独写个博客写ES的查询,聚合,全文检索
本章我做了Mysql与ES的对比学习,尽量让兄弟萌一次就能看懂
注:代码块中的#是注释
-
先从一个简单的案例说起,就写一个文章的CRUD吧
-
需求(我这里先搞的简单一些,由浅入深):
-
文章内容包括:标题,分类,作者,内容,点赞,
-
文章可以更新,新增,删除,查询
-
-
-
Mysql该怎么做?
-
首先创建数据库, 设计表结构,设置索引
-
控制面板操作:
-
insert新增测试数据
-
select查询数据
-
update更新数据
-
delete删除数据
-
-
-
Elasticsearch该怎么做?
-
打开Kibana(监测工具)-Dev Tools页
-
新增测试数据(POST请求方式)
#为了创建文章数据,我们的操作是:
#1.为每篇文章的(文档)Document建立索引,每个文档包含了文章的所有信息 ->(要记住ES是面向文档的数据库)
#2.每个文档的类型为article ->article代表Mysql中的表
#3.article类型属于blog索引 ->blog代表Mysql中的数据库
#4.blog索引存储在Elasticsearch集群中 ->物理存储位置
#如下,一个索引就建好了,实际上特别简单
POST /blog/article/1
{
"title":"史上最简单的Elasticsearch教程",
"classify":"Elasticsearch教程",
"author":"张耀烽",
"content":"第一章初识Elasticsearch",
"likenum":10
}
#返回"created": true代表创建成功
# 这里 POST /blog/article/1{...JSON内容省略} 包含了五个信息
# POST:请求方式
# blog:文章索引名称
# article:文章类型名称
# 1:文章的ID
# {...json内容省略}:请求实体(JSON文档),包含了文章的所有内容:标题是史上最简单的Elasticsearch教程,分类是Elasticsearch教程,作者张耀烽,内容...,点赞数量10个
## 重点:
#我刚开始学习时,在做这个操作时有很多的疑问,我列举并且解释一下,看一下你们是否也存在这个问题
#1.不创建数据库创建表直接就新增数据?而且还新增成功了?
#解疑:POST或者PUT的请求方式,如果Index或者Type不存在会默认创建
#2.数据类型不需要指定?比如Mysql中指定字段类型
#解疑:这些不是必须的,如果不指定的话,ES有内置缺省参数,会默认帮我们加上的
#3.索引不需要设置吗?
#解疑:默认情况下,文档中的所有字段都会被索引(倒排索引,后续会讲一下具体的实现)
#如果还有什么疑惑的地方可以在下面评论,兄弟萌一起讨论一下!
#OK,到这里大致应该就了解ES的POST(新增)请求了,咱们再多加几个数据,方便一面全文检索更直观的看到效果
POST /blog/article/2
{
"title":"史上最简单的Elasticsearch教程二",
"classify":"Elasticsearch教程",
"author":"张耀烽",
"content":"第二章进阶Elasticsearch",
"likenum":100
}##...我这里省略,兄弟萌多加几条
##重点啊这里有个坑:注意第四个参数ID,一定不要重复,如果重复之前的数据会被覆盖,相当于更新了,而且ES没有ID自增这个概念
-
更新文章文档(PUT请求)
PUT /blog/article/1
{
"title":"更新后的史上最简单的Elasticsearch教程",
"classify":"Elasticsearch教程",
"author":"张耀烽",
"content":"第一章初识Elasticsearch",
"likenum":10
}
#响应体
{
"_index": "blog",
"_type": "article",
"_id": "1",
"_version": 2,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": false
}
#可以看到,之前新增的时候created是true,现在变成了false,代表当前数据以前是存在的
#_version已经从一变为二,代表数据更改的第几个版本
#当时学习时遇到的坑:
#ES的更新底层是这个样子的:
##ES执行更新操作的时候,ES首先将旧的文档标记为删除状态,然后添加新的文档,
##旧的文档不会立即消失,但是你也无法访问,
##ES会在你继续添加更多数据的时候在后台清理已经标记为删除状态的文档
#所以在后续使用JAVAAPI的时候你会感觉到明显的延迟,但是这都是小事!首先既然你选择了ES,那么应该很少对数据进行大批量的增删改,大部分操作都是检索和统计
#如果你实在接受不了ES更新的缓慢,我们可以对JavaApi进行优化,(后续写到JavaApi的时候会讲解)
-
删除文章||索引|
#删除指定的文章,根据ID删除
DELETE /blog/article/1
#响应体
{
"found": true,
"_index": "blog",
"_type": "article",
"_id": "1",
"_version": 3,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
}
}
#可以看到这条数据的version已经变为三,第一次是新增,第二次是更新,这次的操作是删除
->>>>>>>>>>>>>>>
#删除指定索引
DELETE /blog
#响应体
{
"acknowledged": true
}
#true代表删除成功
->>>>>>>>>>>>>>>>>>>
#如果此时我们删除一个不存在的索引或者文档,将得到一个404 Not Found状态码,响应体是这样的:
{
"found": false,
"_index": "11",
"_type": "article",
"_id": "1",
"_version": 1,
"result": "not_found",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
}
}
OK,到这里ES基于HTTP协议的restful请求:增删改操作就完成了,当然还可以更复杂的增删改,但是首先:
我更新的重点是JavaApi,所以JavaApi中的复杂操作会写的更多,ESJavaApi的操作和restful风格的请求是完全不同的.
其次你的技术团队既然选择了ES,那么你的增删改就应该是少量的,毕竟ES的优势在于检索
下一章我会单独写个博客做ES的查询,聚合,全文检索,各种姿势的骚操作,这章节要是有什么问题就留言一起探讨!