Elasticsearch的一些介绍

53 阅读5分钟

Es介绍

1.场景

  • 京东、淘宝等电商搜索

    • 搜索手机壳

      • 能够搜索到手机壳、手机等商品数据
      • 搜索到内容还有高亮显示
      • 还能搜索到手机相关的品牌数据等
  • 百度、Google等搜索引擎搜索

  • 掘金、CSDN、博客园等论坛搜索

  • 打车软件搜索附近的车

2、ES介绍

  • 2.1、概述

    • 一款非常强大的开源搜索引擎,能够实现在海量数据中快速检索到满足条件的数据,同时还可以实现分页、高亮显示等功能

    • 其他功能

      • 日志统计、分析、系统监控等
  • 2.2、ELK技术栈

    • Elasticsearch

      • 存储、搜索、分析数据
    • Kibana

      • 数据可视化
      • 提供了图形化界面,可以操作ES
    • Logstash、Beats

      • 数据抓取
  • 2.3、相关产品

    • lucene

      • 是Apache的开源搜索引擎类库,提供了搜索引擎的核心API,由Java语言开发

      • ES底层是基于lucene来实现的

      • 官网

    • Solr

      • ES流行之前最火的开源搜索引擎

        • 底层也是lucene
      • ES在搜索实时数据的性能要强于Solr

3、倒排索引

-   3.1、ES实现快速搜索功能的核心概念

-   3.2、正向索引

    -   先通过文件名找到具体的文件,再获取文件中的内容过程

    -   mysql的查询功能就是正向索引的思想

        -   先根据ID查询记录,再从记录中获取相关字段的数据

-   3.3、倒排索引

    -   1、概述

        -   从文件的内容查找,得到包含这些内容的文件列表,再得到文件对应的信息,如文件名、作者、文件大小、创建时间等

    -   2、过程

        -   1、将文档的内容通过算法进行分词,得到一个词条列表

        -   2、将词条列表当作key,包含该词条的文档id列表作为值,形成一张表

            -   原始文档

                -

image.png - 词条表

                -

image.png

     -   3、词条是唯一的,所以给词条创建索引,提高搜索效率

        -   4、通过词条查询,得到文档ID,再通过文档ID查询到具体的文档

    -   3、总结

        -   把文档内容进行分词,得到一个词条表【词条:文档ID列表】,给词条创建索引。把要搜索的内容进行分词,根据分词后的结果去词条表中根据词条进行匹配,得到文档ID列表,再通过文档ID返回具体的文档信息

-   3.4、整个搜索过程分为如下几步

    -   对搜索的内容进行分词
    -   基于内容搜索到相关的文档ID
    -   再通过文档ID找到对应的文档
    -   展示你要展示的文档数据

4、ES相关概念对比MySQL

image.png

5、安装ES、Kibana、IK分词器

-   5.1、安装ES

    -   1、创建网络

        -   docker network create es-net

        -   查看网络

            -   docker network ls

        -   如果网络已经存在,则不用创建

    -   2、导入es.tar

        -   docker load -i tar包位置

    -   3、安装ES

        -   docker run -d \ --name es \ -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \ -e "discovery.type=single-node" \ -v es-data:/usr/share/elasticsearch/data \ -v es-plugins:/usr/share/elasticsearch/plugins \ --privileged \ --network es-net \ -p 9200:9200 \ -p 9300:9300 \ elasticsearch:7.12.1

-   5.2、安装Kibana

    -   导tar包
    -   docker run -d \ --name kibana \ -e ELASTICSEARCH_HOSTS=http://es:9200 \ --network=es-net \ -p 5601:5601 \ kibana:7.12.1

-   5.3、测试

    -   访问ES

        -

image.png - 访问Kibana,并进入 Dev Tools

        -
        -
        -

-   5.4、测试IK分词器

    -   1、标准分词器的分词效果

        -   -

    -   2、安装

        -   查看es插件数据卷挂载位置

            -   docker volume inspect es-plugins

                -

image.png - ES插件目录

                -   /var/lib/docker/volumes/es-plugins/_data

        -   把 资料\ik 目录复制到 ES插件目录 下

        -   重启ES让插件生效

    -   3、分词方式

        -   ik_smart

            -   粗粒度
            -   拆分结果少

        -   ik_max_word

            -   细粒度
            -   拆分结果多

 
            -

    -   4、扩展词典

        -   一些网络红词,以前不是词,现在因为网络太发达,已经变成了词,譬如:奥利给、卷王

        -   配置

            -   ik\config\ext.dic

                -   写上要扩展的词,一个词占一行,必须UTF-8编码

        -   重启ES生效

    -   5、停用词典

        -   一些不好的词,例如对国家不友好的词,这里就不打比方了

        -   配置

            -   ik\config\stopword.dic

                -   写上要停用的词,一个词占一行,必须UTF-8编码

        -   重启ES生效

    -   6、在 IkAnalyzer.cfg.xml 文件中查看是否开启扩展词和停用词
    
    

6.索引库操作

- 1、概述

    -   存放文档的表

        -   相当于数据库表

- 2、mapping映射

    -   2.1、是对索引库中文档的约束

        -   1、指定字段的类型、分词器、是否索引、是否存储等信息

        -   2、字段类型

            -   type

                -   https://www.elastic.co/guide/en/elasticsearch/reference/7.12/mapping-types.html

                -   字符串

                    -   text(可分词的文本)

                        -   文章标题
                        -   商品标题
                        -   小说内容
                        -   小说介绍

                    -   keyword(精确值,不分词)

                        -   例如:品牌、国家、作者、ip地址

                -   数值

                    -   long、integer、short、byte、double、float

                -   布尔

                    -   boolean

                -   日期

                    -   date

                -   对象

                    -   object

                -   位置

                    -   经纬度

                        -   geo_point

        -   3、分词器

            -   analyzer

                -   针对要分词的字段

                    -   一般就是text

                -   一般都会选择 ik_max_word、ik_smart

        -   4、是否索引

            -   index

                -   针对要搜索的字段

                    -   例如:商品标题、商品价格
                    -   不需要搜索的字段:商品图片

                -   默认是true

        -   5、是否存储

            -   store

                -   针对是否要展示给用户看

                    -   小说内容,不存储

                -   默认是true

    -   2.2、相当于数据库表的约束
    

3、创建索引库并指定mapping

  • PUT /索引库名

    • #创建索引 PUT /[名字] { "mappings": { "properties": { "info":{ "type": "text", "analyzer": "ik_smart", "index": true, "store": true }, "email":{ "type": "text", "analyzer": "ik_max_word" }, "brand":{ "type": "keyword" }, "name":{ "properties": { "firstName":{ "type":"keyword" }, "lastName":{ "type":"keyword" } } }, "birth":{ "type": "date", "format": "yyyy-MM-dd" } } } }

image.png

4、查询索引库

-   GET /索引库名

5、修改索引库

-   索引库,一旦创建,无法修改。但是可以向其中增加字段

-   增加字段

    -   PUT /索引库名/_mapping

        -

image.png -

image.png

6、删除索引库

-   DELETE /索引库名