01-Elasticsearch概念和相关软件的安装

打印 上一主题 下一主题

主题 511|帖子 511|积分 1533

一、ElasticSearch的倒排索引

1.1、数据库存在的问题



  • 问题1: 查询title中包含"手机"的信息

      1. SELECT * FROM goods WHERE title LIKE '%手机%'
      复制代码
    • 使用模糊搜索,左边有通配符,不会走索引,会全表扫描,性能低

  • 问题2:查询title中包含"我要买一部华为手机"的信息

      1. SELECT * FROM goods WHERE title LIKE '%我要买一部华为手机%'
      复制代码
    • 关系型数据库提供的查询,功能太弱

1.2、倒排索引

了解倒排索引的存储原理


  • 使用新华字典查找汉字,先找到汉字的偏旁部首,再根据偏旁部首对应的目录(索引)找到目标汉字



  • ES样例

    • 文档0(编号0):we like java java java
    • 文档1(编号1):we like lucene lucene lucene

  • 建立倒排索引的流程

    • 首先对所有数据的内容进行拆分(分词),拆分成唯一的一个词语(词条Term)
    • 然后建立词条和每条数据的对应关系(词条在文档出现的位置下标,出现频率),如下所示
    • (Term 词条)(Doc ID,Freq 频率)(Pos 位置)we(0,1) (1,1)(0,0)(1,0)like(0,1) (1,1)(0,1)(1,1)java(0,3)(2,3,4)lucene(1,3)(2,3,4)

  • 小结

    • 倒排索引:将每条数据中的内容进行分词,形成词条。然后记录词条和数据的唯一标识(id)的对应关系,形成的产物

二、ElasticSearch存储和搜索原理

理解ElasticSearch存储和搜索原理


  • 假设数据存在以下几条数据



  • ES中存储以及搜索原理图如下所示


    • 说明

      • ES的数据库我们称其为 index (索引库),每条数据我们称之为 document (文档),ES在存储文档的时候,会对它需要分词的字段内容进行切分,切分成一个个词条,再建立每个词条与文档唯一标识(id)的对应关系,即倒排索引


  • 我们再回过头看之间数据库存在的两个问题,通过ES是否能够解决

    • 问题1

      • 性能低:使用模糊查询,左边有通配符,不会走索引,会全表扫描,性能低
      • ES解决方案:如果使用"手机"作为关键字查询,ES生成的倒排索引中,词条会排序,形成一颗树形结构,提升词条的查询速度

    • 问题2

      • 功能弱:如果以"华为手机" 作为条件,查询不出来数据
      • ES解决方案:如果使用"华为手机"作为关键字查询,ES也可以对搜索的关键字进行分词,比如将华为手机拆分成"华为"、"手机",然后根据两个词分词去倒排索引中进行查询,然后取结果的并集


三、ElasticSearch相关概念

理解ElasticSearch和关系型数据库的区别以及分工
3.1、介绍


  • ElasticSearch是Java语言开发的,并作为Apache许可条款下的开放源码发布,基于Lucene实现,是一款分布式、高扩展、近实时的搜索服务,可以基于RESTful web接口进行操作
  • 官网:https://www.elastic.co/
  • 基于Lucene的产品

    • Slor:实时性偏弱,在高并发地写入数据时,Slor需要频繁地构建索引库,而索引库构建影响到查询性能
    • Elasticsearch:实时性非常强(近实时),ES在频繁地构建索引库的同时,不太影响查询的性能

3.2、应用场景


  • 海量数据的查询(京东,淘宝商品搜素)
  • 日志数据分析(ELK ElasticSearch + Logstach + Kibana 搭建日志监控平台)
  • 实时数据分析

3.3、ElasticSearch和MySQL的区别


  • 我们可以把传统关系型数据库MySQL和ElasticSearch进行一下对比

    • MySQLElasticsearch说明DatabaseIndex索引(index),就是文档的集合,类似数据库(Database)TableType类型(Type),就是文档的类型,相当于数据库中的表(Table)RowDocument文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式ColumnField字段(Field),就是JSON文档中的字段,类似数据库中的列(Column)SchemaMappingMapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema)indexEverything is indexedes对存储的所有数据都进行分词建立索引SQLDSL(Domain Specification Lanuage)

  • 不难发现,两者均有其优势

    • MySQL:擅长事务类型操作,可以确保数据的安全和一致性,进行复杂的多表查询
    • ElasticSearch:擅长海量数据的搜索、分析、计算

  • 因此在企业中,往往是两者结合使用

    • 对安全性要求较高的写操作,关系复杂的表需求,使用MySQL实现
    • 对查询性能要求较高的搜索需求,使用Elasticsearch实现
    • 两者再基于某种方式,实现数据的同步,保证数据一致性


3.4、小结


  • 数据库查询存在的问题

    • 性能低
    • 功能较弱

  • 倒排索引

    • 将文档中字段的内容进行分词,形成词条和每条数据id的对应关系

  • Elasticsearch概念以及作用

    • 搜索服务器
    • 高性能、功能强大
    • 不是替换MySQL,es做搜索,MySQL做数据存储
    • 索引库(index)=  数据库
    • 类型(type)= 表
    • 映射(mapping)= 表结构
    • 文档(document)= 一行数据
    • 映射参数(field)= 表字段

四、ElasticSearch的安装

4.1、下载镜像


  • 命令

    • docker pull elasticsearch:7.4.1

  • 如下所示



  • Windows下载很简单,去官网下载,解压后启动即可使用
4.2、启动容器


  • 命令

      1. docker run -di --name=elasticsearch -p 9200:9200 -v /root/elasticsearch/plugins:/usr/share/elasticsearch/plugins -e "discovery.type=single-node" elasticsearch:7.4.1
      复制代码
    • 端口映射:9200
    • 文件夹映射:/usr/share/elasticsearch/plugins
    • 添加环境变量,名为discovery.type=single-node
    • PS:可以暂时不用理解为什么映射这个文件夹,以及后面的"discovery.type=single-node"

  • 如下所示



4.3、浏览器访问

五、Kibana的安装

kibana是elasticsearch的页面可视化工具,类似MySQL的SQLyog等可视化工具
5.1、拉取镜像


  • 命令

    • docker pull kibana:7.4.1

  • 如下所示



5.2、创建容器


  • 命令

      1. docker run -id -p 5601:5601 --link elasticsearch --name=kibana -e "ELASTICSEARCH_URL=http://你的自己的ip地址:9200" kibana:7.4.0
      复制代码

  • 如下所示



5.3、浏览器访问


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张国伟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表