Elasticsearch介绍及基本操作 ---- HTTP协议方式

Elasticsearch基本操作

一、概述

Elasticsearch,简称为ES, 是一个开源的、高扩展的、RESTful 风格的分布式全文搜索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。

这里说到的全文搜索引擎指的是目前广泛应用的主流搜索引擎,它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。

Elasticsearch 是面向文档型数据库,一条数据就是一个文档,Elasticsearch 中存储的文档数据和 MySQL 存储数据的对比:

image-20211212160132708

注:Elasticsearch 中 Type 的概念已经被删除了。

1.1 正排索引和倒排索引

正排索引:

MySQL中采用的是正排索引,比如根据主键索引查询某一记录中对应字段的值。但是如果模糊查询(查询某一个字段中某一部分),根据索引只能定位到完整的字段值,所以这种索引就可能会失效。

倒排索引:

ES采用的是倒排索引,对文章进行分词拆解操作,对每一个词都建立索引,根据某一个具体的词就可以查询到对应的索引值,根据这个索引值就可以查询到整个文章内容,这就是倒排索引。

二、安装程序

  • 下载地址:Past Releases of Elastic Stack Software | Elastic(本文使用7.8.0版本的Win格式)

  • 对压缩包进行解压,得到如下目录结构:

    image-20211212155007133
  • 解压后,进入 bin 目录,点击 elasticsearch.bat 文件启动 ES 服务:

    image-20211212155218890

    注意: 9300 端口为 Elasticsearch 集群间组件的通信端口, 9200 端口为浏览器访问的 HTTP 协议 RESTful 端口。

  • 打开浏览器,输入网址:http://localhost:9200/,出现如下界面表示启动成功:

    image-20211212155443658
  • 为了能够方便的使用 RESTful 风格的请求,所以安装 Postman 软件,下载地址:https://www.getpostman.com/apps

三、HTTP操作

3.1 索引操作

3.1.1 创建索引

对比关系型数据库,创建索引就相当于创建数据库。

创建索引的 PUT 请求:http://127.0.0.1:9200/索引名称

image-20211212161055391
# 响应结果,true表示成功
"acknowledged": true,  
# 分片操作成功
"shards_acknowledged": true,
# 创建的索引名称
"index": "shopping"

如果重复添加相同索引,会返回错误信息:

image-20211212161346577

3.1.2 查看索引

查看所有索引:

查看所有索引的 GET 请求:http://127.0.0.1:9200/_cat/indices?v

  • _cat:表示查看的意思
  • indices:表示所有索引
  • ?v:表示结果使用表格的形式展示
image-20211212161922149

响应结果详细内容如下:

image-20211212162218127

查看单个索引:

查看单个索引的 GET 请求:http://127.0.0.1:9200/索引名

image-20211212162351496

对响应结果的解析:

# 索引名
shopping
# 别名
aliases
# 映射
mappings
# 设置
settings
# 设置-索引
settings-index
# 设置-索引-创建时间
settings-index-creation_date
# 设置-索引-主分片数量
settings-index-number_of_shards
# 设置-索引-副分片数量
settings-index-number_of_replicas
# 设置-索引-唯一标识
settings-index-uuid
# 设置-索引-版本
settings-index-version
# 设置-索引-名称
settings-index-provided_name

3.1.3 删除索引

删除索引的 DELETE 请求:http://127.0.0.1:9200/索引名

image-20211212163738753

再次访问索引,响应索引不存在:

image-20211212163956886

3.2 文档操作

3.2.1 创建文档

随机生成id值:

创建文档就相当于创建表的记录,这条记录的格式为 JSON 格式。

创建文档的 POST 请求为:http://127.0.0.1:9200/索引名/_doc + JSON格式请求体

  • _doc:表示文档:
image-20211212171517434

注:由于 PUT 操作是幂等的,多次发出相同的请求,后一个会把前一个覆盖掉,而创建文档返回的 _id 值是不同的,所以需要使用 POST 来创建,而 PUT 一般用来改资源。

生成固定id值:

创建文档的 POST 请求为:http://127.0.0.1:9200/索引名/_doc/id值 + JSON格式请求体

image-20211212171642630

注:如果创建文档时明确数据主键(id)值,那么请求方式也可以使用PUT。

3.2.2 查看文档

查看文档时,需要指明文档的唯一标识,类似于 MySQL 的主键查询。

查询文档的 GET 请求:http://127.0.0.1:9200/索引名/_doc/文档主键值

image-20211212172240931

3.2.3 修改文档

修改整个文档

修改整个文档的 POST 请求:http://127.0.0.1:9200/索引名/_doc/文档主键值 + JSON请求体

image-20211212180635009

修改文档部分字段

修改文档部分字段的 POST 请求:http://127.0.0.1:9200/索引值/_update/文档主键值 + JSON格式请求体

image-20211212180929860

3.2.4 删除文档

删除一个文档并不会立即从磁盘中删除,他只是被标记为已删除(逻辑删除)。

删除文档的 DELETE 请求:http://127.0.0.1:9200/索引值/_doc/文档主键值

image-20211212181350543

3.3 多种查询方式

3.3.1 条件查询

将结果全部查询出来之后进行过滤,仅显示符合指定字段值的文档。

方式一:

发送 GET 请求:http://127.0.0.1:9200/索引值/_search?q=字段名:字段值

image-20211218150230289

方式二:

发送 GET 请求:http://127.0.0.1:9200/索引值/_search + JSON格式请求体

image-20211218150710344

3.3.2 全量查询

查询某一索引下的全部文档。

方式一:

发送 GET 请求:http://127.0.0.1:9200/索引名/_search

方式二:

发送 GET 请求:http://127.0.0.1:9200/索引名/_search + JSON格式请求体

image-20211218151334012

3.3.3 分页查询

对查询结果进行分页操作。

image-20211218152149379

分页结果:

{
    
    
    "took": 2,
    "timed_out": false,
    "_shards": {
    
    
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
    
    
        "total": {
    
    
            "value": 3,
            "relation": "eq"
        },
        "max_score": null,
        "hits": [
            {
    
    
                "_index": "shopping",
                "_type": "_doc",
                "_id": "86XdrX0BhPod2Sb5T3VE",
                "_score": null,
                "_source": {
    
    
                    // 仅指定的title字段被显示出来
                    "title": "小米手机" 
                },
                "sort": [
                    3999.0
                ]
            },
            {
    
    
                "_index": "shopping",
                "_type": "_doc",
                "_id": "XndgzH0BZ5WKFcQMlsuM",
                "_score": null,
                "_source": {
    
    
                    "title": "华为手机"
                },
                "sort": [
                    2503.36
                ]
            }
        ]
    }
}

3.3.4 多条件查询

情况1:且条件

image-20211218164609947

情况2:或条件

image-20211218164751240

3.3.5 范围查询

image-20211218165131531

注意:

image-20211218165527292

3.3.6 全文检索

情况一:

有时在查询时,并没有输入字段完整的值,也可以将结果查询出来,比如:

image-20211218170123547

出现的原因:保存文档时,ES 会将数据文字进行分词拆解操作,并将拆解结果保存在倒排索引中,这样,即使使用文字的一部分也能将对应的结果查询出来。

情况二:

输入两个文档中不同的字段值组合结构,本身这个值不存在任何文档的字段中,但会将两篇文档全部查询出。如下:

image-20211218170748748

出现的原因:ES 会将查询条件也进行分词拆解操作,分成了 “小” 和 “华” 两部分,两个字分别对应情况1(进行倒排索引的匹配),所以会将两篇文档全部查询出。

3.3.7 完全匹配

如果不想出现全文检索部分匹配的情况,而想要完全的匹配查询值,需要使用关键字 match_phrase

image-20211218171157151

3.3.8 聚合查询

可以对查询结果进行分组、求平均值、最大值等操作。

分组操作示例:

image-20211218173206701

查询结果:

"aggregations": {
    
    
    //自定义分组结果名称
    "price_group": {
    
    
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [
            //表示价格为2503.3的文档个数为2个
            {
    
    
                "key": 2503.3,
                "doc_count": 2
            },
            //表示价格为3999.0的文档个数为1个
            {
    
    
                "key": 3999.0,
                "doc_count": 1
            }
        ]
    }
}

求平均值操作示例:

请求体:

{
    
    
    //agg表示聚合操作
    "aggs" : {
    
    
        //自定义名称,作为结果的名称
        "price_avg" : {
    
    
            //avg表示求平均值操作
            "avg" : {
    
    
                //表示对所有文档的price字段求平均值
                "field" : "price"
            }
        }
    },
    //仅显示平均值结果,而不显示所有的文档具体内容
    "size" : 0
}

查询结果:

{
    
    
    "took": 2,
    "timed_out": false,
    "_shards": {
    
    
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
    
    
        "total": {
    
    
            "value": 3,
            "relation": "eq"
        },
        "max_score": null,
        //不显示具体的文档内容,如果不使用size=0,则这里会显示所有的文档具体内容
        "hits": []
    },
    "aggregations": {
    
    
        //自定义名称
        "price_avg": {
    
    
            //平均值结果
            "value": 3001.90673828125
        }
    }
}

3.3.9 映射关系

文本类型可以进行全文检索部分匹配,而 K-V 类型只能进行完全匹配。

1. 创建user索引

http://127.0.0.1:9200/user

2. 定义字段的映射类型

发送的请求:

image-20211218175510073

携带的请求体:

{
    
    
    //设置映射关系
    "properties" : {
    
    
        //name字段的类型是文本,而且此字段可以使用索引
        "name" : {
    
    
            "type" : "text",
            "index" : true
        },
        //sex字段的类型是K-V,而且此字段可以使用索引
        "sex" : {
    
    
            "type" : "keyword",
            "index" : true
        },
        //sex字段的类型是K-V,而且此字段不能使用索引
        "tel" : {
    
    
            "type" : "keyword",
            "index" : false
        }
    }
}

3. 创建文档

image-20211218180422812

4. 查询字段值

情况一:

image-20211218180103265

情况二:

image-20211218180314919

情况三:

image-20211218180520268

猜你喜欢

转载自blog.csdn.net/weixin_49343190/article/details/122015364