Elasticsearch CRUD基本操作

前言

本次我们聊一聊Elasticsearch的基本操作CRUD,他跟我们常用的关系型数据库的操作又有什么不一样的地方呢?今天我们就来好好讲解一番。

目录

说明

本次演示用的版本是7.11。

工具可以使用Kibana的控制台,界面美观且有一定的缩进,而且能简化命令行的curl操作,如果对安装有问题的,可以看一下我之前的文章。

API约定

关系型数据库用的是SQL进行数据的访问,而Elasticsearch用的是REST进行数据的访问,HTTP的请求头PUT、GET、POST、DELETE正好可以对应CRUD(create、read、update、delete)四种数据操作。

数据的格式用的是JSON。

索引操作

创建索引

创建索引movie

PUT /movie
{
"settings": {
"index": {
"number_of_shards": 1,
"number_of_replicas": 0
}
}
}

number_of_shards是主分片数,number_of_replicas是一个主分片有多少个本,那么总的分片数就是“(number_of_replicas + 1) * number_of_shards”

查看索引

GET /movie/

删除索引

DELETE /movie/

文档操作

插入文档

7.x版本,type默认是“_doc”。可以用POST,也可以用PUT

// 自动生成_id
POST /movie/_doc
{
"title": "The Pursuit of Happyness",
"actors": [
"Will Smith",
"Jaden Smith",
"Thandie Newton"
]
}
// 指定_id=1
PUT /movie/_doc/1
{
"title": "The Pursuit of Happyness",
"actors": [
"Will Smith",
"Jaden Smith",
"Thandie Newton"
]
}
// 演示覆盖
PUT /movie/_doc/1
{
"title": "xxx"
}

如果是指定_id的情况下(称为index操作),那么如果文档已经存在的话,会直接进行覆盖,也就是如果里面有些字段没传,那个字段就不会存储了,比如上面第三个请求,执行完后去获取“_id=1”的数据,只能获取到title字段,actors字段是不存在的。

更新文档

更新“_id=1”的数据,注意需要有“doc”。如果用“POST /movie/_update/1”这种语法,就直接覆盖了。

POST /movie/_update/1
{
"doc":{
"title": "The Pursuit of Happyness xxx"
}
}

删除文档

删除“_id=1”的数据

DELETE /movie/_doc/1

获取文档

获取“_id=1”的数据

GET /movie/_doc/1

搜索文档

GET /movies/_search
{
"profile": "true",
"_source": ["movieId", "title","genres"],
"sort": [{"movieId": "desc"}],
"from": 0,
"size": 3,
"query": {
"match_all": {}
}
}
  • movies是之前导入的数据,非前面用的movie,需要测试的话要先导入一下数据。
  • profile 相当于MySQL中的explain
  • _source 是要返回的字段

上面的请求,类比SQL如下

select movieId, title, genres from movies order by movieId desc limit 0, 3

更复杂的搜索查询,后面持续更新。

批量文档操作

批量操作

POST movie/_bulk
{"index":{"_index":"movie","_id":1}}
{"title": "xxx xx"}
{"index":{"_index":"movie","_id":2}}
{"title": "The Pursuit of Happyness"}
{"update":{"_index":"movie","_id":2}}
{"doc":{"title": "xxx xx"}}

支持在一次API调用中,对不同的索引做不同的操作,减少网络请求的次数,提高性能。支持的操作有index、create、update、delete。批量操作,如果其中一条有错误没法执行,不会阻碍其他的请求,会继续执行下去。

请求体要特别注意一下,不能格式化,而且第一行指定index跟id,第二行指定数据,以此类推。

批量读取

请求体可以格式化

GET _mget
{
"docs": [
{
"_index": "movie",
"_id": 1
},
{
"_index": "movie",
"_id": 2
}
]
}

如果是对同一个index进行操作,可以在URI指定index

GET movie/_mget
{
"docs": [
{
"_id": 1
},
{
"_id": 2
}
]

批量查询

GET /movies/_msearch
{}
{"from":0,"size":1,"query":{"match_all":{}}}
{}
{"from":0,"size":2,"query":{"match_all":{}}}

与_bulk操作类似,不能进行格式化。

博客园精华区
我还没有学会写个人说明!
上一篇

如何使用GraphQL Client: Apollo Android

你也可能喜欢

评论已经被关闭。

插入图片