Elasticsearch杂谈

:::success 官方下载链接
https://www.elastic.co/cn/downloads/past-releases#elasticsearch :::

  1. elastic:富有弹性的 search:搜索
  2. 在计算机开发界简称ES 他还有一个名称全文搜索引擎
  3. 这个软件不是SpringCloud的组件,甚至其他语言都可以使用它 , 它是一个java开发的软件,所以启动需要java环境变量
  4. 功能 : 从大量数据中根据指定的关键字搜索出匹配的结果
  5. 使用它的方式是访问它提供的控制器方法,它开发了多种控制器方法 , 访问不同方法实现对数据的增删改查
  6. ES也是将数据保存在硬盘上
  7. java有一套名为Lucene的API , 是搜索引擎的核心支持,Elasticsearch在Lucene的基础上开发出了一个功能全面的开箱即用的全文搜索引擎
  8. 市面上ES的竞品有 : Solr/MongoDB

    Elasticsearch的优点

    因为mysql\mariaDB\oracle\DB2等关系型数据库都有一个严重的性能缺陷 : 就是前模糊的模糊查询不能使用索引 , 例如: :::success select from spu where spu_name like ‘%鼠标%’这样的查询在*一张千万级别的数据库表进行模糊查询需要20秒以上 , 主要是因为这些数据库对前模糊查询不支持索引 , 但是采用ES优化后可以提速100倍, :::

    Elasticsearch查询原理

    如果不使用ES的数据库查询,没有索引加持的模糊查询就是全表搜索性能差 , 但是Elasticsearch可以利用添加数据库完成对数据的分词倒排索引形成索引库 , 在查询时直接查询索引库,获得符合查询条件的数据信息
    image.png

    关于数据库的索引

    所谓索引其实就是数据库中数据的目录 ; 目的是能够提高查询的效率
    数据库索引分类
  • 聚集索引 : 数据库保存数据的物理顺序,一般都是id,所以按物理顺序查询也就是按id查询效率非常高
  • 非聚集索引 : 如果再定义其他索引,就是非聚集索引了,比如按名字查找,相对就会慢很多

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

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

    ES基本使用

    Elasticsearch的启动

    下载好后,找到bin后 , 双击elasticsearch.bat运行
    image.png
    我们需要保证ES是开启的,否则用到它的项目是会报错的 , 最后验证ES是否在运行 , 浏览器输入地址:localhost:9200看到如下内容即可
    image.png
    mac系统启动 :::success tar -xvf elasticsearch-7.6.2-darwin-x86_64.tar.gz
    cd elasticsearch-7.6.2/bin
    ./elasticsearch ::: linux: :::success tar -xvf elasticsearch-7.6.2-linux-x86_64.tar.gz
    cd elasticsearch-7.6.2/bin
    ./elasticsearch :::

    如何操作ES

    :::success 我们已经讲过 , 操作ES是对es发送请求 , 我们创建一个子项目search, 在这个子项目中创建一个专门发送各种类型请求的文件来操作ES :::

  7. 我们在父项目中创建search项目 , pom文件如下 ```html <?xml version=”1.0” encoding=”UTF-8”?> 4.0.0

    1. <groupId>cn.study</groupId>
    2. <artifactId>mall</artifactId>
    3. <version>0.0.1-SNAPSHOT</version>

    cn.study search 0.0.1-SNAPSHOT search

    Demo project for Spring Boot org.springframework.boot spring-boot-starter

  1. 2. 下面创建这个能够发送各种请求的文件
  2. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/26235396/1656414634242-46522297-d7bb-4940-a8c4-0ed240cb75bd.png#clientId=u360e16ed-6890-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=701&id=uc8e529de&margin=%5Bobject%20Object%5D&name=image.png&originHeight=631&originWidth=1032&originalType=binary&ratio=1&rotation=0&showTitle=false&size=92734&status=done&style=none&taskId=uaf5b4a73-97ac-497e-ace3-bcbc6e97a80&title=&width=1146.6666970429605)<br />文件类型叫HTTP Request文件 , 行业中有人将它称之为http client(http客户端)<br />创建完毕之后,我们向ES发送一个最简单的请求 : GET [http://localhost:9200](http://localhost:9200)<br />获得的结果和之前浏览器响应结果一致,表示当前http client文件正常运行
  3. ```java
  4. ### 注释和分隔符,每次编写请求前,都要先编写3个#
  5. GET http://localhost:9200
  6. ### ES分词测试 analyze(分析)
  7. POST http://localhost:9200/_analyze
  8. Content-Type: application/json
  9. {
  10. "text": "罗技激光无线游戏鼠标",
  11. "analyzer": "standard"
  12. }

image.png 我们代码中编写的”analyzer”: “standard”是默认分词器, , 如果不写出这行,也时默认这个分词器得 , 这个分词器只能对英文等西文字符(有空格的),进行分词 , 但是中文分词不能按空格分 , 下面我们要安装中文分词插件,实现中文分词效果 , 我们使用开源的分词词库IK实现中文分词
image.png
安装插件之后要重启ES才能生效 , 关闭ES窗口之后再启动ES即可 , ES启动之后,将中文分词器插件设置完成,在运行分词 :

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

ik分词插件的使用

ik_smart

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

    ES分词测试 analyze(分析)

    POST http://localhost:9200/_analyze Content-Type: application/json

{ “text”: “北京顺利举办了冬季奥林匹克运动会”, “analyzer”: “ik_smart” }

  1. <a name="ICHlu"></a>
  2. #### ik_max_word
  3. - 优点:特征是详细的文字片段进行分词,查询时查全率高,不容易遗漏数据
  4. - 缺点:因为分词太过详细,导致有一些无用分词,占用空间较大,查询速度慢
  5. ```java
  6. ### ES分词测试 analyze(分析)
  7. POST http://localhost:9200/_analyze
  8. Content-Type: application/json
  9. {
  10. "text": "北京顺利举办了冬季奥林匹克运动会",
  11. "analyzer": "ik_max_word"
  12. }

ES保存数据的结构

image.png

  • ES启动后,可以创建多个index(索引),index相当于数据库中表的概念
  • 一个index可以创建保存多个document(文档),一个document相当于表中的一行数据
  • 一个document中可以有多个属性和对应的值,相当于一行数据中字段和字段的值