Elasticsearch基本概念及CRUD常用操作
一、介绍
Elasticsearch 是面向文档型数据库,一条数据在这里就是一个文档。为了方便大家理解,我们将 Elasticsearch 里存储文档数据和关系型数据库 MySQL 存储数据的概念进行一个类比;
ES 里的 Index
可以看做一个库,而 Types
相当于表,Documents
则相当于表的行。这里 Types
的概念已经被逐渐弱化,Elasticsearch 6.X 中,一个 index
下已经只能包含一个 type
,Elasticsearch 7.X 中, Type 的概念已经被删除了
。
可以理解成Elsticsearch是一库一表;
二、REST 风格
REST 即表述性状态传递(英文:Representational State Transfer,简称 REST)是一种软件架构风格。REST 是一种规范。即参数通过封装后进行传递,响应也是返回的一个封装对象。
我们可以通过:
HTTP GET
HTTP POST
HTTP PUT
HTTP DELETE
HTTP PATCH
来对数据进行增加(Create),查询(Read),更新(Update)及删除(Delete)。也就是我们通常说是的 CRUD。
方法 |
用法 |
GET |
读取数据 |
POST |
插入数据 |
PUT 或 PATCH |
更新数据,或如果是一个新的 id,则插入数据(具有幂等性) |
DELETE |
删除数据 |
Elasticsearch 里的接口都是通过 REST 接口来实现的。接下来具体介绍一下使用 REST 接口来实现对数据的操作及查询。
幂等性:无论发送多少次同样的请求,其产生的结果都是一样的(结果:在服务器产生的结果,而不是相应结果)
三、索引CRUD
3.1、创建索引
# 创建一个名为shopping的索引
PUT /shopping
3.2、查询索引
# 查询名为shopping的索引
GET /shopping
# 结果
{
"shopping": { // 索引名
"aliases": {}, // 别名
"mappings": {}, // 映射
"settings": { // 设置
"index": { // 索引
"creation_date": "1656747006767", // 创建时间
"number_of_shards": "1",
"number_of_replicas": "1",
"uuid": "JId_JTCbQuu3E4MDqmhbIw",
"version": {
"created": "7080099"
},
"provided_name": "shopping"
}
}
}
}
# 查询ES下所有索引
GET /_cat/indices?v
# 结果
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open shopping 9ze02VyCRfahA-dsxoCWww 1 1 33 0 17kb 17kb
v
表示希望获得响应结果的详细信息,包括索引名称、文档数量、占用空间等
表头 |
含义 |
health |
当前服务器健康状态: green(集群完整) yellow(单点正常、集群不完整) red(单点不正常) |
status |
索引打开、关闭状态 |
index |
索引名称 |
uuid |
索引统一编号 |
pri |
主分片数量 |
rep |
副本数量 |
docs.count |
可用文档数量 |
docs.deleted |
文档删除状态(逻辑删除) |
store.size |
主分片和副分片整体占空间大小 |
pri.store.size |
主分片占空间大小 |
3.3、删除索引
# 查询名为shopping的索引
DELETE /shopping
四、文档CRUD
4.1、添加文档
4.1.1、普通添加(随机ID)
指定索引添加单个文档(会生成随机ID)
# 在shopping索引下添加一个文档(添加一条数据)
POST /shopping/_doc
{
"title": "小米手机",
"category": "小米店铺",
"images": "http://dummyimage.com/468x60",
"price": 68
}
4.1.2、普通添加(指定ID)
指定索引添加单个文档(指定ID)
# 在shopping索引下添加一条id为1001的文档
POST /shopping/_doc/1001
{
"title": "小米手机",
"category": "小米店铺",
"images": "http://dummyimage.com/468x60",
"price": 68
}
4.2、查询文档
# 查询shopping索引下id为1002的文档
GET /shopping/_doc/1002
# 查询shopping索引下所有文档
GET /shopping/_search
4.3、修改文档
4.3.1、完全覆盖修改
# 全量修改shopping索引id为1002的文档
PUT /shopping/_doc/1002
{
"title": "小米手机",
"category": "小米店铺",
"images": "http://dummyimage.com/468x60",
"price": 547457
}
4.3.2、局部修改
# 只修改shopping索引id为1002下的title字段
POST /shopping/_update/1002
{
"doc":{
"title":"华为手机"
}
}
4.4、删除文档
# 删除shopping索引id为1002的文档
DELETE /shopping/_doc/1002
五、匹配查询
Elsticsearch在进行查询时,会将 查询条件进行分词处理
后再进行 全文检索
。若不想将查询条件进行分词处理,需要将 match
改为 match_phrase
5.1、GET方式查询文档
# 查询shopping索引下文档中category字段为小米的文档
GET /shopping/_search?q=category:小米
q
代表查询
这种在请求路径中的查询方式容易出现乱码,不推荐使用,建议使用POST方式进行查询;
5.2、指定字段匹配查询
# 查询shopping索引下文档中category字段为小米的文档
POST /shopping/_search
{
"query": {
"match": {
"category": "小米"
}
}
}
match
代表 匹配查询
5.3、全量查询(不分页)
# 查询shopping索引下所有文档
POST /shopping/_search
{
"query": {
"match_all": {
}
}
}
match_all
代表 全量查询
5.4、全量查询(分页)
# 查询shopping索引下第1页的文档,每页条数为2
POST /shopping/_search
{
"query": {
"match_all": {
}
},
"from": 0,
"size": 2
}
match_all
代表 全量查询
from
代表 当前页数据的起始位置
size
代表 每页的数据条数
假如要查询第5页的数据:(页码 - 1) * 每页数据条数
也就是:(5 - 1) * 2
5.5、全量分页查询指定字段,并排序
# 查询shopping索引下第2页的文档,每页条数为2,只查询title字段,并根据price字段进行降序
POST /shopping/_search
{
"query": {
"match_all": {
}
},
"from": 1,
"size": 2,
"_source" : ["title"],
"sort": {
"price": {
"order": "desc"
}
}
}
_source
表示要查询的字段
sort
使用sort指定字段进行排序
六、高亮显示
# 查询shopping索引下文档中category字段为小米的文档,并将category数据进行高亮显示
POST /shopping/_search
{
"query": {
"match": {
"category": "小米"
}
},
"highlight": {
"fields": {
"category": {}
}
}
}
match
代表 匹配查询
highlight
代表高亮显示
fields
代表要高亮的字段对象
七、组合条件查询
7.1、多条件必须同时匹配
# 查询shopping索引下category字段数据为小米,price字段数据为4399的文档
POST /shopping/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"category": "小米"
}
},
{
"match": {
"price": 4399
}
}
]
}
}
}
bool
表示条件查询
must
表示多个条件必须同时匹配
7.2、任意条件匹配
# 查询shopping索引下category字段数据为小米,或category字段数据为华为的文档
POST /shopping/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"category": "小米"
}
},
{
"match": {
"category": "华为"
}
}
]
}
}
}
bool
表示条件查询
should
表示任意条件匹配
7.3、范围查询
# 查询shopping索引下category字段为小米,或category字段为华为的文档,并过滤出price大于3000的文档(不是过滤掉)
POST /shopping/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"category": "小米"
}
},
{
"match": {
"category": "华为"
}
}
],
"filter": {
"range": {
"price": {
"gt": 3000
}
}
}
}
}
}
bool
表示条件查询
should
表示任意条件匹配
filter
表示过滤条件
range
表示范围查询
gt
表示大于
八、聚合查询
7.1、多条件必须同时匹配