• Elasticsearch基础知识


    写在前面的话:读书破万卷,编码如有神
    --------------------------------------------------------------------

    参考内容:

      《Elasticsearch顶尖高手系列-快速入门篇》,中华石杉

    --------------------------------------------------------------------
    主要内容包括:

    • 什么是搜索?
    • 如果用数据库做搜索会怎么样?
    • 什么是全文检索、倒排索引和Lucene?
    • 什么是Elasticsearch?
    • Elasticsearch的功能,干什么的?
    • Elasticsearch的适用场景,能在什么地方发挥作用?
    • Elasticsearch的特点,跟其它类似的东西不同的地方在哪里?
    • Luence和Elasticsearch的关系
    • Elasticsearch的核心概念
    • Elasticsearch的核心概念 VS 数据库核心概念

    --------------------------------------------------------------------

    1、什么是搜索

      谈起搜索的话,可能我们的第一印象就是 百度搜索、谷歌搜索、360搜索、搜狗搜索等等

     

    如果我们想找寻任何的消息,就可以去上面几个搜索引擎中搜索,比如说找一部自己喜欢的电影,或者说找一本喜欢的书,或者找一条喜欢的新闻。但是呢,搜索并不仅仅有上面的几个搜索引擎,还包括下面的内容:

    垂直搜索(站内搜索)

      互联网的搜索:电商网站,比如 淘宝、京东; 新闻网站;招聘网站;各种app

      IT系统的搜索:OA软件,办公自动化软件、

    搜索,就是在任何场景下,寻找你想到的消息,这个时候,会输入一段你要搜索的关键字,然后就期望找到这个关键字相关的消息。

    --------------------------------------------------------------------

    2、如果用数据库做搜索会怎么样?

      做软件开发的话, 大家都知道,数据都是存储在数据库里面的,比如电商网站的商品消息、招聘网站的职位消息、新闻网站的新闻消息 等等,所以说,很自然的一点,如果说从技术的角度去考虑,如何实现如:电商网站内部的搜索功能的话,就可以考虑去使用数据库进行搜索。

    1. 比如说用户在"电商网站的前端"搜索框里面输入"java开发"
    2. "电商网站的前端"将关键字"java开发"发送到后端系统
    3. 后端系统会拼装查询的sql "select * from product where product_name like '%java开发%'"
    4. 然后就会去数据库里面一条一条的比对

    上面的执行过程会有上面问题呢:

    1. 比方说,每条记录的指定文本,可能会很长,比如说"商品描述"的字段的长度,有长达数千个,甚至数万个字符,这个时候,每次都要对每条记录的所有文本进行扫描,来判断说,你包不包含我指定的这个关键字(比如说:"java开发")
    2. 还不能将搜索词拆分开来,尽可能去搜索更多的符合你的期望的结果,比如输入"java开发",就搜索不出来"java高级教程"

    所以说,用数据库来实现搜索,是不太靠谱的,通常来说,性能会很差的。

    --------------------------------------------------------------------

    3、什么是全文检索、倒排索引和Lucene?

    (1)全文检索(倒排索引)

    比如有如下的信息:
      1   生化危机电影
      2   生化危机海报
      3   生化危机文章
      4   生化危机新闻
    首先对信息进行拆分:
      1   生化危机电影 ---> 生化 危机 电影
      2   生化危机海报 ---> 生化 危机 海报
      3   生化危机文章 ---> 生化 危机 文章
      4   生化危机新闻 ---> 生化 危机 新闻
    建立倒排索引如下:
      关键字    ids
      生化    1、2、3、4
      危机    1、2、3、4
      电影    1
      海报    2
      文章    3
      新闻    4
    当进行搜索时输入“生化机”,首先会对信息进行拆分 “生化” “机”,然后去倒排索引中查询,会发现“生化”关键字对应有ids---> 1、2、3、4
    (
    ps:如果数据库的数据,一共有100W条,按照前面数据库的查询的思路,其实就是要扫描100W次,而且每次扫描,都需要匹配那个文本所有的字符,确认是否包含搜索的关键词,而且不能将搜索词拆解开来进行检索
    )

    (2)Lucene

      就是一个jar包,里面包含了封装好的各种建立倒排索引,以及进行搜索的代码,包括各种算法。我们就用java开发的时候,引入lucene jar,然后基于lucene的api进行开发就可以了。用luence,我们就可以去将已有的数据建立索引,lucene会在本地磁盘上面,给我们组织索引的数据结构。另外的话,我们也可以用Lucene提供的一些功能和api来针对磁盘上的索引,进行搜索。

    --------------------------------------------------------------------

    4、什么是Elasticsearch?

    Elasticsearch是分布式,高性能,高可用,可伸缩的搜索和分析系统。
    (1)Lucene封装了搜索引擎的功能(部署在单台机器上,假设磁盘就500G空间)
    (2)这个时候可能就会有问题,如果我们的数据量很大,比如有1个T的数据。那这个时候在一台机器上是放不下1T的数据的。
    (3)这个时候我们需要添加一个机器来存放,这个时候我们的系统就变成了分布式的了,1T的数据散落在了多个机器上。、
    (4)这个时候电商网站前端要进行搜索的时候,会跟多台机器进行通信,这个过程是很麻烦的;另外还需要考虑在建立索引时放到哪台机器上面去,这个过程需要我们自己来管理;而且搜索数据时还要考虑在哪台机器上面去搜索;还有就是我们如何去保证数据不丢失,所以我们就需要保证数据的高可用性。
    (5)你如果说,数据量很大的话,超过了单台机器的承受范围,你就必须得用多台机器去进行数据的存储和搜索,如果我们自己来实现会很麻烦的。
    (6)所以这个时候Elasticsearch就出现了,它底层封装了Luence,并且能够建立多个分布式节点,然后对外提供统一的访问接口;这时我们在创建索引和搜索数据时会有Elasticsearch自动帮助我们选择在哪个节点上进行。

    --------------------------------------------------------------------

    5、Elasticsearch的功能,干什么的?

    (1)分布式的搜索引擎和数据分析引擎

      搜索引擎:百度、网站的站内搜索、IT系统的检索

      数据分析引擎:电商网站,最近7天牙膏这种商品销量排名前10的商家有哪些;新闻网站,最近一个月访问量排名前3的新闻版块是哪些。

    三个关键词: 分布式、搜索、数据分析

    (2)全文检索、结构化检索、数据分析

      结构化检索:我想搜索商品分类为日化用户的商品都有哪些  ---> select * from products where category_id = '日化用品'

      全文检索:我想搜索商品名称包含牙膏的商品 ---> select * from product where product_name like '%牙膏%'

      部分匹配、自动完成、搜索纠错、搜索推荐

      数据分析:我想分析每一个商品分类下有多少个商品 ---> select category_id,count(*) from products group by category_id

    (3)对好了数据进行近实时的处理

      分布式:ES自动可以将海量数据分散到多台服务器上去存储和检索

      海量数据的处理:分布式以后,就可以采用大量的服务器去存储和检索数据,自然而言就可以实现海量数据的处理了。

      近实时:检索个时间要花费1小时(这就不是近实时了,这是离线批处理,batch-processing);近实时是在秒级别进行搜索和分析。

    跟分布式/海量数据相反的:Luence,单机应用,只能在单台服务器上使用,最多只能处理单台服务器可以处理的数据量。

    --------------------------------------------------------------------

    6、Elasticsearch的适用场景,能在什么地方发挥作用?

    国外:

    1. 维基百科,类似百度百科,牙膏,牙膏的维基百科,全文检索,高亮,搜索推荐
    2. The Guardian(国外新闻网站),类似搜狐新闻,用户行为日志(点击,浏览,收藏,评论)+社交网络数据(对某某新闻的相关看法),数据分析,给到每篇新闻文章的作者,让他知道他的文章的公众反馈(好,坏,热门,垃圾,鄙视,崇拜)
    3. Stack Overflow(国外的程序异常讨论论坛),IT问题,程序的报错,提交上去,有人会跟你讨论和回答,全文检索,搜索相关问题和答案,程序报错了,就会将报错信息粘贴到里面去,搜索有没有对应的答案
    4. GitHub(开源代码管理),搜索上千亿行代码
    5. 电商网站,检索商品
    6. 日志数据分析,logstash采集日志,ES进行复杂的数据分析(ELK技术,elasticsearch+logstash+kibana)
    7. 商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发送通知消息给用户,比如说订阅牙膏的监控,如果高露洁牙膏的家庭套装低于50块钱,就通知我,我就去买
    8. BI系统,商业智能,Business Intelligence。比如说有个大型商场集团,BI,分析一下某某区域最近3年的用户消费金额的趋势以及用户群体的组成构成,产出相关的数张报表,**区,最近3年,每年消费金额呈现100%的增长,而且用户群体85%是高级白领,开一个新商场。ES执行数据分析和挖掘,Kibana进行数据可视化

    国内
      站内搜索(电商,招聘,门户,等等),IT系统搜索(OA,CRM,ERP,等等),数据分析(ES热门的一个使用场景)

    --------------------------------------------------------------------

    7、Elasticsearch的特点,跟其它类似的东西不同的地方在哪里?

    1. 可以作为大型分布式机器(数百台服务器)技术,处理PB级数据,服务大公司;也可以运行在单机上,服务小公司。
    2. Elasticsearch不是什么新技术,主要是将全文检索、数据分析以及分布式技术 合并在一起了,才形成了独一无二的ES。
    3. 对用户而言,ES是开箱即用的,非常简单,作为中小型应用直接3分钟部署一下ES,就可以作为生产环境的系统来使用了,数据量不大,操作不是太复杂。、
    4. 数据库的功能面对很多领域是不够用的(事务,还有各种联机事务型的操作);特殊的功能,比如全文检索、同义词处理、相关度排名、复杂数据分析、海量数据的近实时处理;ES作为传统数据库的一个补充,提供了数据库所不能提供的很多功能。

    --------------------------------------------------------------------

    8、Luence和Elasticsearch的关系

    (1)Luence是最先进、功能最强大的搜索库,直接基于lucene开发,非常复杂,api复杂(实现一些简单的功能,需要些大量的java代码),需要深入理解原理(各种索引结构)。

    (2)Elasticsearch,基于luence,隐藏复杂性,提供简单易用的restful api接口,java api接口(还有其他语言的api接口)

      (2.1)分布式的文档存储引擎

      (2.2)分布式的搜索引擎和分析引擎

      (2.3)分布式、支持PB级数据

    Elasticsearch开箱即用,优秀的默认参数,不需要任何额外配置,完全开源。

    --------------------------------------------------------------------

    9、Elasticsearch的核心概念

    (1)Near Realtime(NRT): 近实时,两个意思:从写入数据到数据可以被搜索到有一个小延迟(大概1秒); 基于es执行搜索和分析可以达到秒级。

    (2)Cluster:集群,包含多个节点,每个节点属于哪个集群是通过一个配置来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常。

    (3)Node:节点,集群中的一个节点,节点也有一个名称(默认是随机分配),节点名称很重要,默认节点会去加入一个名称为"elasticsearch"的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群。

    (4)Document&field:文档,es中的最小数据单元,一个document可以是一条客户数据、一条商品分类数据、一条订单数据,通常用JSON数据结构表示,每个index下的type中都可以去存储多个document。一个document里面有多个field,每个filed就是一个数据字段。

    product document

    {

      "product_id":"1",

      "product_name":"高露洁牙膏",

      "product_desc":"高效美白",

      "category_id":"2",

      "category_name": "日化用品",

    }

    (5)Index:索引,包含一堆有相似结构的文档数据,比如可以有一个客户索引、商品分类索引、订单索引。索引有一个名称。一个index中可以包含很多document,一个index就代表了一类类似的或相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据,所有的商品document。

    (6)Type:类型,每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,比如博客系统,有一个索引,包含用户数据type,博客数据type,评论数据type。

    商品index,里面存放了所有的商品数据,商品document。
    但是商品分类有很多种类,每个种类的document的field可能不太一样,比如说电器商品,可能还包含一些诸如售后时间范围这样的特殊field;生鲜商品,还包含一些诸如生鲜保质期之类的特殊field。
    type: 日化用品type、电器type、生鲜商品type
    日化商品type: product_id、product_name、product_desc、category_id、category_name
    电器商品type:product_id、product_name、product_desc、category_id、category_name、service_period
    生鲜商品type:product_id、product_name、product_desc、category_id、category_name、eat_period

    每一个type里面都会包含一堆document。

    (7)shard: 单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提高吞吐量和性能。每个shard都是一个lucene index.

    (8)replica : 任何一个服务器随时可能故障或宕机,此时shard可能就会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。 primary shard(建立索引时一次设置,不能修改,默认5个),replica shard(随时修改数据,默认1个),默认每个索引10个shard,5个primary shard,5个replica shard。 最小的高可用配置是2台服务器。

    --------------------------------------------------------------------

    10、Elasticsearch的核心概念 VS 数据库核心概念

    Elasticsearch   数据库
    Document                             
    Type        表
    Index                                     

    --------------------------------------------------------------------

  • 相关阅读:
    springloud系列搭建注册中心
    在生产环境下禁用swagger
    consul怎么在windows下安装
    linux上传与下载
    使用git将本地代码提交到码云上去
    springboot整合activemq(三)配置文件
    springboot整合activemq(二),消费均匀分析
    Python3学习之路~3.2 递归、函数式编程、高阶函数、匿名函数、嵌套函数
    Python3学习之路~3.1 函数基本语法及特性、返回值、参数、局部与全局变量
    Python3学习之路~2.9 字符编码与转码
  • 原文地址:https://www.cnblogs.com/xinhuaxuan/p/8439895.html
Copyright © 2020-2023  润新知