• 一、初识 Elasticsearch:概念,安装,设置分词器


    01、初识 Elasticsearch

    本次ES基于:7.12.1 版本
    学习资源为:https://www.bilibili.com/video/BV1Gh411j7d6

    什么是ES(Elasticsearch)

    elasticsearch 结合 kibana、Loastash、Beats,也就是elastic stack (ELK)。被广泛应用在日志数据分析、实时监控等领域。

    elasticsearch 是 elastic stack 的核心,负责存储、搜索、分析数据。

    在这里插入图片描述

    ES的发展

    ES底层基于 Lucene

    Lucene 是一个 Java 语言的搜索引擎类库,是 Apache 公司的顶级项目,由 DougCutting 于1999年研发官网地址: https://lucene.apache.org/。

    Lucene的优势:

    • 易扩展
    • 高性能(基于倒排索引)

    Lucene的缺点:

    • 只限于Java语言开发
    • 学习曲线陡峭
    • 不支持水平扩展

    2004年shay Banon基于Lucene开发了Compass

    2010年shay Banon 重写了 Compass,取名为Elasticsearch。官网地址: https://www.elastic.co/cn/。相比与lucene,elasticsearch具备下列优势:

    • 支持分布式,可水平扩展
    • 提供 Restful 接口,可被任何语言调用

    为什么学习elasticsearch?

    搜索引擎技术排名:

    1. Elasticsearch:开源的分布式搜索引擎

    2. Splunk:商业项目

    3. Solr:Apache的开源搜索引擎

    正向索引和倒排索引

    传统数据库(如MySQL)采用正向索引,例如给下表 (tb goods)中的id创建索引

    在这里插入图片描述

    elasticsearch采用倒排索引:

    • 文档(document):每条数据就是一个文档

    • 词条(term):文档按照语义分成的词语

    在这里插入图片描述

    倒排索引是根据词条查找文档。

    索引

    索引(index):相同类型的文档的集合。不同的JSON结构就代表一个不同的索引。

    映射 (mapping):索引中文档的字段约束信息,类似表的结构约束

    在这里插入图片描述

    MySQL与ES的概念映射

    在这里插入图片描述

    Mysql: 擅长事务类型操作,可以确保数据的安全和一致性。

    Elasticsearch:擅长海量数据的搜索、分析、计算。

    在这里插入图片描述

    安装ES

    使用docker创建网络,拉取镜像。

    docker network create es-net
    docker pull elasticsearch:7.12.1
    docker pull kibana:7.12.1
    
    • 1
    • 2
    • 3

    运行命令

    docker run -d \
    --name es  \
    -e"ES_JAVA_OPTS=-Xms512m -Xmx512m"  \
    -e"discovery.type=single-node" \
    -v es-data:/usr/share/eTasticsearch/data \
    -v es-plugins:/usr/share/elasticsearch/plugins \
    --privileged \
    --network es-net \
    -p 9200:9200 \
    -p 9300:9300 \
    elasticsearch:7.12.1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • discovery.type=single-node:单点模式
    • es-data:数据目录
    • es-plugins:插件目录
    • 9200:HTTP端口。9300:各个ES容器互联的端口。

    访问

    http://ip:9200/
    {
    "name": "a340f52223b0",
    "cluster_name": "docker-cluster",
    "cluster_uuid": "ppw1gfsiQbqDdsNfmivM0A",
    "version": {
        "number": "7.12.1",
        "build_flavor": "default",
        "build_type": "docker",
        "build_hash": "3186837139b9c6b6d23c3200870651f10d3343b7",
        "build_date": "2021-04-20T20:56:39.040728659Z",
        "build_snapshot": false,
        "lucene_version": "8.8.0",
        "minimum_wire_compatibility_version": "6.8.0",
        "minimum_index_compatibility_version": "6.0.0-beta1"
    },
    "tagline": "You Know, for Search"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    运行Kibana

    docker run -d \
    --name kibana \
    -e ELASTICSEARCH_HOSTS=http://es:9200 \
    --network=es-net \
    -p 5601:5601 \
    kibana:7.12.1  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • ELASTICSEARCH_HOSTS=http://es:9200 : es:9200 为上述 --name es \ 时设置的名字。

    分词器

    es在创建倒排索引时需要对文档分词;在搜索时,需要对用户输入内容分词。但默认的分词规则对中文处理并不友好。

    我们在kibanaDevTools中测试:

    POST /_analyze
    {
      "analyzer": "standard",
      "text": "南京市长江大桥。"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    安装分词器

    下载:https://github.com/medcl/elasticsearch-analysis-ik/releases?page=6

    解压后上传到 es-plugins 中,可通过如下目录查看。

    docker volume inspect es-plugins
    {
        "Mountpoint": "/var/lib/docker/volumes/es-plugins/_data",
    }
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    docker restart es
    
    • 1

    测试ik分词

    ik_smart:粗粒度

    请求:
    POST /_analyze
    {
      "analyzer": "ik_smart",
      "text": "南京市长江大桥。"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    响应:

    {
      "tokens" : [
        {
          "token" : "南京市",
          "start_offset" : 0,
          "end_offset" : 3,
          "type" : "CN_WORD",
          "position" : 0
        },
        {
          "token" : "长江大桥",
          "start_offset" : 3,
          "end_offset" : 7,
          "type" : "CN_WORD",
          "position" : 1
        }
      ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    请求:ik-max-word:细粒度

    请求:
    POST /_analyze
    {
      "analyzer": "ik_max_word",
      "text": "南京市长江大桥。"
    }
    -----------------------------
    {
      "tokens" : [
        {
          "token" : "南京市",
          "start_offset" : 0,
          "end_offset" : 3,
          "type" : "CN_WORD",
          "position" : 0
        },
        {
          "token" : "南京",
          "start_offset" : 0,
          "end_offset" : 2,
          "type" : "CN_WORD",
          "position" : 1
        },
    ....
      ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    分词器的设置

    添加字典

    要拓展ik分词器的词库,只需要修改一个ik分词器目录中的config目录中的IkAnalyzer.cfg.xml文件。

    
    DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
    	<comment>IK Analyzer 扩展配置comment>
        
        <entry key="ext_dict">ext_dict.dicentry>
        
        <entry key="ext_stopwords">stopword.dicentry>
    	
    	
    	
    	
    properties>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    去除停用词

    <entry key="ext_stopwords">stopword.dicentry>
    
    • 1

    结束语

    下一篇:二、ElasticSearch中索引库与文档操作
    学习资源为:https://www.bilibili.com/video/BV1Gh411j7d6

  • 相关阅读:
    Windows-vscode安装与简单配置
    un7.28:redis客户端常用命令。
    计算机视觉 01(介绍)
    锅炉防磨防爆可视化管理系统
    【小白专属03】SpringBoot实现增删改查
    分布式全局唯一ID (学习总结---从入门到深化)
    Centos7卸载minio
    JZ11 旋转数组的最小数字
    基于Java的微小企业人事管理系统的设计与实现 毕业设计-附源码231012
    两个难搞的Java Error/Exception
  • 原文地址:https://blog.csdn.net/Array_dear/article/details/133894715