• Elasticsearch概述


    什么是Elasticsearch

    elastic:富有弹性的

    search:搜索

    在计算机开发界简称ES

    这个软件不是SpringCloud的组件,甚至其他语言都可以使用它

    是一个java开发的软件,所以启动需要java环境变量

    功能是从大量数据中根据指定的关键字搜索出匹配的结果

    这样的软件有一个名称全文搜索引擎

    使用它的方式是访问它提供的控制器方法,它开发了多种控制器方法

    访问不同方法实现对数据的增删改查

    ES也是将数据保存在硬盘上的

    常见面试题ES的实现结构

    java有一套名为Lucene的API

    是搜索引擎的核心支持,Elasticsearch在Lucene的基础上开发出了一个功能全面的开箱即用的全文搜索引擎

    市面上ES的竞品有

    Solr/MongoDB

    为什么使用Elasticsearch

    所有关系型数据库都有一个严重的性能缺陷

    mysql\mariaDB\oracle\DB2等

    就是前模糊的模糊查询不能使用索引

    select * from spu where spu_name like '%鼠标%'
    

    测试证明一张千万级别的数据库表进行模糊查询需要20秒以上

    当今需求"三高"的需求下,不能接受这样的性能

    我们使用ES来优化后同样的查询我们能将效率提高100倍

    将大型的查询也能控制在毫秒级别

    Elasticsearch查询原理

    如果不使用ES让数据库查询,没有索引加持的模糊查询就是全表搜索性能差

    但是Elasticsearch可以利用添加数据库完成对数据的分词倒排索引形成索引库

    在查询时直接查询索引库,获得符合查询条件的数据信息

     

    关于数据库的索引

    所谓索引其实就是数据库中数据的目录

    目的是能够提高查询的效率

    数据库索引分类

    • 聚集索引
    • 非聚集索引

    聚集索引就是数据库保存数据的物理顺序,一般都是id,所以按物理顺序查询也就是按id查询效率非常高

    如果再定义其他索引,就是非聚集索引了

    如果数据表中有一个姓名列,我们为姓名列创建索引

    例如有"张三"这个姓名,添加索引后,查询的话效率会明显提升

    但是如果不创建索引,去查询张三,就只能逐行检索姓名列是否为张三,查询效率低

    常见面试题:索引的使用规则和注意事项

    1. 索引会占用数据库空间
    2. 对数据进行增删改操作,可能会引起索引的更新,效率会低
    3. 操作数据库时先添加数据,再创建索引
    4. 不要对数据样本少的列添加索引
    5. 每次查询从数据库中查询结果越多,索引的效果越低
    6. 使用where字句查询时,将具有索引的列放在第一个条件

    经过我们对索引的简单了解,我们需要知道索引的基本概念和使用

    所有关系型数据库都有一个缺陷,就是模糊查询时(查询条件前模糊),是不能利用索引进行查询的

    一定会引起全表搜索,查询效率非常低

     

    Elasticsearch的启动

    官方下载链接

    https://www.elastic.co/cn/downloads/past-releases#elasticsearch

    7.6.2版本

    压缩包280M左右,复制到没有中文,没有空格的目录下解压

    双击elasticsearch.bat运行

     

    运行之后可能看到下面界面

     

    这个界面不能关闭,一旦关闭ES就停止了

    启动ES双击这个bat文件即可,当然也可以设置Idea的shell script

    验证ES是否在运行

    浏览器输入地址:localhost:9200看到如下内容即可

     

    mac系统启动

    1. tar -xvf elasticsearch-7.6.2-darwin-x86_64.tar.gz
    2. cd elasticsearch-7.6.2/bin
    3. ./elasticsearch

    linux:

    1. tar -xvf elasticsearch-7.6.2-linux-x86_64.tar.gz
    2. cd elasticsearch-7.6.2/bin
    3. ./elasticsearch

     

    ES基本使用

    ES启动完成后

    操作ES是对es发送请求

    创建一个子项目search,在这个子项目中创建一个专门发送各种类型请求的文件来操作ES

    创建search项目也要父子相认

    然后子项目pom文件如下

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0</modelVersion>
    5. <parent>
    6. <groupId>xxx</groupId>
    7. <artifactId>xxx</artifactId>
    8. <version>0.0.1-SNAPSHOT</version>
    9. </parent>
    10. <groupId>xxx</groupId>
    11. <artifactId>search</artifactId>
    12. <version>0.0.1-SNAPSHOT</version>
    13. <name>search</name>
    14. <description>Demo project for Spring Boot</description>
    15. <dependencies>
    16. <dependency>
    17. <groupId>org.springframework.boot</groupId>
    18. <artifactId>spring-boot-starter</artifactId>
    19. </dependency>
    20. </dependencies>
    21. </project>

    下面创建这个能够发送各种请求的文件

     

    文件类型叫HTTP Request文件

    行业中有人将它称之为http client(http客户端)

    创建完毕之后,我们向ES发送一个最简单的请求

    GET http://localhost:9200

    获得的结果和之前浏览器响应结果一致,表示当前http client文件正常运行

    1. ### 注释和分隔符,每次编写请求前,都要先编写3个#
    2. GET http://localhost:9200
    3. ### ES分词测试 analyze(分析)
    4. POST http://localhost:9200/_analyze
    5. Content-Type: application/json
    6. {
    7. "text": "罗技激光无线游戏鼠标",
    8. "analyzer": "standard"
    9. }

     

    代码中编写的"analyzer": "standard"是默认分词器

    如果不写出这行,也时默认这个分词器得

    这个分词器只能对英文等西文字符(有空格的),进行分词

    但是中文分词不能按空格分

    下面我们要安装中文分词插件,实现中文分词效果

    使用开源的分词词库IK实现中文分词

     

    安装插件之后要重启ES才能生效

    关闭ES窗口之后再启动ES即可

    ES启动之后,将中文分词器插件设置完成,在运行分词

    1. {
    2. "text": "罗技激光无线游戏鼠标",
    3. "analyzer": "ik_smart"
    4. }

    再次运行分词测试,应该看到正常的中文分词效果

    ik分词插件的使用

    我们安装的ik实际上不只一个分词器

    实际上除了ik_smart之外还有ik_max_word

    1. ### ES分词测试 analyze(分析)
    2. POST http://localhost:9200/_analyze
    3. Content-Type: application/json
    4. {
    5. "text": "北京顺利举办了冬季奥林匹克运动会",
    6. "analyzer": "ik_smart"
    7. }
    1. ### ES分词测试 analyze(分析)
    2. POST http://localhost:9200/_analyze
    3. Content-Type: application/json
    4. {
    5. "text": "北京顺利举办了冬季奥林匹克运动会",
    6. "analyzer": "ik_max_word"
    7. }

    上面的运行会有不同的分词效果

    总体来说区别如下

    ik_smart

    • 优点:特征是粗略快速的将文字进行分词,占用空间小,查询速度快
    • 缺点:分词的颗粒度大,可能跳过一些分词,导致查询结果不全面

    ik_max_word

    • 优点:特征是详细的文字片段进行分词,查询时查全率高,不容易遗漏数据
    • 缺点:因为分词太过详细,导致有一些无用分词,占用空间较大,查询速度慢

    使用ES操作数据

    我们先了解一下ES保存数据的结构

     

    • ES启动后,可以创建多个index(索引),index相当于数据库中表的概念

    • 一个index可以创建保存多个document(文档),一个document相当于表中的一行数据

    • 一个document中可以有多个属性和对应的值,相当于一行数据中字段和字段的值

  • 相关阅读:
    git的下载与初始配置
    移动应用买量越来越难,APP增长的新机遇在哪里?
    Linux操作系统的发展
    GCN笔记:Graph Convolution Neural Network,ChebNet
    前端:nodejs版本管理神器nvm软件使用笔记
    常用的辅助网站(持续更新)
    【LSTM-Attention】基于长短期记忆网络融合注意力机制的多变量时间序列预测研究(Matlab代码实现)
    云技术分享 | 快速构建 CodeWhisperer 代码生成服务,让 AI 辅助编程
    解决https页面加载http资源报错
    网络安全中接口测试的解决方案
  • 原文地址:https://blog.csdn.net/ClearDream__/article/details/125491160