Elasticsearch基本概念及CRUD常用操作

2023-10-27

一、介绍

Elasticsearch 是面向文档型数据库,一条数据在这里就是一个文档。为了方便大家理解,我们将 Elasticsearch 里存储文档数据和关系型数据库 MySQL 存储数据的概念进行一个类比;

ES 里的 Index 可以看做一个库,而 Types 相当于表,Documents 则相当于表的行。这里 Types 的概念已经被逐渐弱化,Elasticsearch 6.X 中,一个 index 下已经只能包含一个 typeElasticsearch 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、多条件必须同时匹配

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch基本概念及CRUD常用操作 的相关文章

随机推荐