ElasticSearch核心概念和原理

ES核心概念和原理

ElasticSearch作为目前比较流行的企业级搜索引擎框架,在面试和工作的比重越来越大,掌握ES将会让你去大厂面试的成功率大大提高,因此笔者将从ES的使用到ES核心原理到核心源码,逐步讲解深入剖析,从概念到代码的实现都尽量解释的清楚,那么最后将会做一个完整的搜索引擎项目,当然因作者能力有限,难免有错误之处,烦请指正,谢谢

1、什么是搜索:

早期的搜索引擎是把因特网中的资源服务器的地址收集起来,由其提供的资源的类型不同而分成不同的目录,再一层层地进行分类。人们要找自己想要的信息可按他们的分类一层层进入,就能最后到达目的地,找到自己想要的信息。这其实是最原始的方式,只适用于因特网信息并不多的时候。随着因特网信息按几何式增长,出现了真正意义上的搜索引擎,这些搜索引擎知道网站上每一页的开始,随后搜索因特网上的所有超级链接,把代表超级链接的所有词汇放入一个数据库。这就是搜索引擎的原型。

搜索:通过一个关键词或一段描述,得到你想要的(相关度高)结果。

2、如何实现搜索功能?

可以使用关系型数据库来进行处理,例如MySQL,但是同样会有很多的问题让我们不得不去考虑其他实现方式,比如性能差、不可靠、结果不准确(相关度低)

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

倒排索引

What is it?

首先我们看看数据库中的索引分布。

image-20201005205506886

ok,这是我们数据库索引的一张表,我们看到有三种手机,小米手机、小米NFC手机、红米手机,按照id1、2、3来进行排列

image-20201005205643104

在这张图里,小米出现的次数是在id为1、2之中,手机在123中均出现,NFC和红米也如此排列,这就是倒排索引

image-20201005205840566

那么在我们的select * from product where brand like '%小米 NFC 智能 手机'之中,小米、手机、NFC是会被匹配到的。小米手机在我们匹配到的结果中是出现了2次,小米NFC手机出现了3次...后面的依次按照该规律进行排列。匹配数字其实就是我们所谓的相关度,那么小米NFC手机出现了3次,那么它的相关度就是3,是最大的,那么就可能是我们最想要的结果,即这就是倒排索引最简单的一个demo,那么以后我们会对其进行更深入的讲解,目前了解有个认识即可。

数据结构:

  1. 包含这个关键词的document list (理解为表中一行)
  2. 关键词在每个doc中出现的次数 TF term frequency
  3. 关键词在整个索引中出现的次数 IDF inverse doc frequency
  4. 关键词在当前doc中出现的次数
  5. 每个doc的长度,越长相关度越低
  6. 包含这个关键词的所有doc的平均长度

Lucene:

就是一个jar包,帮我们创建倒排索引,提供了复杂的API

Lucene集群问题

如果用Lucene做集群实现搜索,会有那些问题?

① 节点一旦宕机,节点数据丢失,后果不堪设想,可用性差。

② 自己维护,麻烦(自己创建管理索引),单台节点的承载请求的能力是有限的,需要人工做负载(雨露均沾)。

image-20201006202032725

4、Elasticsearch

分布式、高性能、高可用、可伸缩、易维护

But!! ES≠搜索引擎

(1) 分布式

分布式的搜索,存储和数据分析引擎:

(2) 优点:

① 面向开发者友好,屏蔽了Lucene的复杂特性,集群自动发现(cluster discovery)

② 自动维护数据在多个节点上的建立

③ 会帮我做搜索请求的负载均衡

④ 自动维护冗余副本,保证了部分节点宕机的情况下仍然不会有任何数据丢失

⑤ ES基于Lucene提供了很多高级功能:复合查询、聚合分析、基于地理位置等。

⑥ 对于大公司,可以构建几百台服务器的大型分布式集群,处理PB级别数据;对于小公司,开箱即用,门槛低上手简单。

⑦ 相遇传统数据库,提供了全文检索,同义词处理(美丽的cls>漂亮的cls),相关度排名。聚合分析以及海量数据的近实时(NTR)处理,这些传统数据库完全做不到。

(3) 应用领域:

① 百度(全文检索、高亮、搜索推荐)

② 各大网站的用户行为日志(用户点击、浏览、收藏、评论)

③ BI(Business Intelligence商业智能),数据分析:数据挖掘统计。

④ Github:代码托管平台,几千亿行代码

⑤ ELK:Elasticsearch(数据存储)、Logstash(日志采集)、Kibana(可视化)

5、ES核心概念:

(1) cluster(集群):每个集群至少包含两个节点.

(2) node:集群中的每个节点,一个节点不代表一台服务器

(3) field:一个数据字段,与index和type一起,可以定位一个doc

(4) document:ES最小的数据单元 Json

{
  "id": "1",
  "name": "小米",
  "price": {
    "标准版": 3999,
    "尊享版": 4999,
    "吴磊签名定制版": 19999
  }
}

Type:逻辑上的数据分类,es 7.x中删除了type的概念

Index:一类相同或者类似的doc,比如一个员工索引,商品索引。

6.Shard分片:

1:一个index包含多个Shard,默认5P,默认每个P分配一个R,P的数量在创建索引的时候设置,如果想修改,需要重建索引。

2:每个Shard都是一个Lucene实例,有完整的创建索引的处理请求能力。

3:ES会自动在nodes上为我们做shard 均衡。

4:一个doc是不可能同时存在于多个PShard中的,但是可以存在于多个RShard中。

5: P和对应的R不能同时存在于同一个节点,所以最低的可用配置是两个节点,互为主备。

分片

image-20201006201948208

原文地址:https://www.cnblogs.com/pengcode/p/13775380.html