ELK系列(十五)、Elasticsearch核心原理一篇全搞定

目录

Lucene

介绍

核心术语

如何理解倒排索引?

检索方式

分段存储

段合并策略

Elasticsearch

核心概念

节点类型 

集群状态

3C和脑裂

1.共识性(Consensus)

2.并发(Concurrency)

3.一致性(Consistency)

脑裂

事务日志TransLog

路由Route


答应我,看完这篇文章,别再说你不会ES了好吗!

本文会从ES底层Lucene开始,到ES 读写原理分别介绍,希望对大家有帮助,谢谢。

ELK系列(一)、安装ElasticSearch+Logstash+Kibana+Filebeat-v7.7.0

ELK系列(二)、在Kibana中使用RESTful操作ES库

ELK系列(三)、安装Logstash插件及打包离线安装包

ELK系列(四)、Logstash读取nginx日志写入ES中

ELK系列(五)、Logstash修改@timestamp时间为日志的产生时间

ELK系列(六)、修改Nginx日志为Json格式并使用Logstash导入至ES

ELK系列(七)、Filebeat+Logstash采集多个日志文件并写入不同的ES索引中

ELK系列(八)、使用Filebeat+Redis+Logstash收集日志数据

ELK系列(九)、配置ES和Kibana的用户密码

ELK系列(十)、ES中文分词器IK插件安装和配置远程词库热加载

ELK系列(十一)、ElasticSearch7.7.0插件es-head安装及使用

ELK系列(十二)、使用SQL查询ElasticSearch7.7.0

ELK系列(十三)、在Hive中操作ES的索引数据,创建/查询/更新/插入

ELK系列(十四)、在Python中操作ES,创建/查询/插入/更新/删除

ELK系列(十五)、Elasticsearch核心原理一篇全搞定 


Lucene

介绍

Lucene是一种高性能、可伸缩的信息搜索(IR)库,在2000年开源,最初由鼎鼎大名的Doug Cutting开发,是基于Java实现的高性能的开源项目。Lucene采用了基于倒排表的设计原理,可以非常高效地实现文本查找,在底层采用了分段的存储模式,使它在读写时几乎完全避免了锁的出现,大大提升了读写性能。我们所熟知的Elasticsearch,Solr都是基于Lucene工具包进行开发的全文搜索引擎,因此理解Lucene也可以帮助我们更好的理解Elasticsearch原理。

核心术语

Lucene为什么可以实现全文检索主要是因为它实现了倒排索引的查询结构,下面是关于Lucene的核心术语:

  • 词条(Term):索引里面最小的存储和查询单元,对于英文来说是一个单词,对于中文来说一般指分词后的一个词。
  • 词典(Term Dictionary):或字典,是词条Term的集合。搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。
  • 倒排表(Post list):一个文档通常由多个词组成,倒排表记录的是某个词在哪些文档里出现过以及出现的位置。每条记录称为一个倒排项(Posting)。倒排表记录的不单是文档编号,还存储了词频等信息。
  • 倒排文件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件被称之为倒排文件,倒排文件是存储倒排索引的物理文件。
  • 段(Segment):索引中最小的独立存储单元。一个索引文件由一个或者多个段组成。在Luence中的段有不变性,段一旦生成,在其上只能有读操作,不能有写操作。

 

如图所示,倒排索引中主要有两部分:词典和倒排文件。词典和倒排表是Lucene中很重要的两种数据结构,是实现快速检索的重要基石。词典和倒排文件是分两部分存储的,词典在内存中而倒排文件存储在磁盘上。

图中的词典包含五个词条(Term):rick,wang,works,on,csdn。在lucene中会记录每个词条出现在哪些文档中,并且将这些文档的编号存储成一个有序链表(倒排表)1->5>8>12... 基于这种索引方式,lucene可以很方便的从海量文档中返回匹配到的检索词。

如何理解倒排索引?

举个例子,当我们在翻一本书的时候最先看到的一定是目录页,根据目录里每个标题找到对应的篇幅文章,这种就是典型的KV关系,标题就是Key,文章内容是Value。 那么如果我们想找到文章里包含"CSDN"关键字的文章在哪些标题里呢? 如果在RDBMS中,我们只能用模糊查询遍历所有记录,非常消耗性能又特别的龟速。

而Lucene以倒排表存储索引,同样是刚才的文章,在录入文章的时候,Lucene会先对文章做分词识别出所有的词条(Term),然后记录这些词条出现在的文章编号,当文章多了时候,同样的词条会出现在多个文章中,对于同一个词条,它所出现过的文章编号就会组成一个有序链表(倒排表),这样又是一个KV关系,Key就是我们的词条(Term),而Value是倒排表,当我们想查询"CSDN"这个单词出现过的文章的时候我们会找到一个"CSDN"-->"2,3,8,11" 这样的KV关系,即表示"CSDN"关键词在编号为2,3,8,11的文章中出现过,只要将这四个文章返回就达到了我们的目的,因此基于倒排索引的Lucene不需要去遍历索引全部的数据就可以将我们的检索内容返回。

检索方式

Lucene基于倒排表存储索引,因此在查找的过程中只需要在词典中找到检索的词条,然后根据词条找到对应的倒排列表。然后根据下面四种查询方式对结果做交并差集等操作即可返回我们想要的结果。

1.单关键字查询

根据输入的单个词条(Term)进行查询,只需要在词典中查到该词条的倒排列表即可返回结果。

2.AND

查询同时包含多个词条的文档,取交集。如:首先查询词条A的倒排列表[1,2,3],然后查询词条B的倒排列表[2,3,4],将两个倒排列表做交集取[2,3],就是即包含词条A又包含词条B的文档结果集。

3.OR

查询包含这些词条的文档,取并集。如

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王义凯_Rick

遇见即是缘,路过就给个评论吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值