ES底层检索原理和读写原理

本文介绍了ES,一个基于Lucene的开源搜索引擎,其分布式架构、工作原理(包括写入和读取机制)、搜索原理以及如何通过内存缓存、冷热分离和数据预热提高查询效率。同时提到了相关资源链接。

ES简介

ES是一个开源分布式搜索和分析引擎,它建立在Lucene库之上,是一个全文搜索引擎,可以快速地从海量数据中搜索和查询。

ES是强大,灵活和高性能的搜索和分析引擎,底层使用分布式架构和Lucene库来处理和存储数据,并且隐藏了 lucene 的复杂性,提供了简单易用的 RESTful api提供给用户。

ES 的分布式架构设计

ES的设计理念就是分布式搜索引擎,底层基于lucene。通过启动ES多个实例形成一个集群

分布式的情况下可以把一个index分成多个shard,每个shard存放部分数据,这样可以提高性能,数据分到多个shard,请求可以分布式进行,每个shard有一个primary shard和多个replica shard,写请求会打到primary上,primary会把数据同步给replica,primary挂掉,其中一个replica会重新成为primary,保证高可用

es写入工作原理

客户端发送请求到coordinate node(协调节点)中,coordinate node通过document_id的hash值路由到对应的node中,由primary处理,处理完成之后同步给replica,同步完成后primary返回给coordinate node,coordinate node响应结果给客户端

node在写入数据的时候先写入内存 buffer,然后每隔 1s,将数据 refresh 到 os cache,到了 os cache

数据就能被搜索到(所以 es 从写入到能被搜索到,中间有 1s 的延迟,es是准时的)。每隔 5s,将数据写入 translog 文件(这样如果机器宕机,内存数据全没,最多会有 5s 的数据丢失),

translog 大到一定程度,或者默认每隔 30mins,会触发 commit 操作,将缓冲区的数据都 flush

到 segment file 磁盘文件中。

es读取工作原理

可以通过doc id查询,客户端发送请求到任意节点,节点通过doc id进行hash,判断doc id分配到哪一个shard中,然后使用随机轮询算法,在primary和replica中选择一个,接收到请求的node返回数据给协调节点

写请求是写入 primary shard,然后同步给所有的 replica shard;读请求可以从 primary

shardreplica shard 读取,采用的是随机轮询算法。

es搜索原理
  1. 客户端发送请求到coordinate node
  2. coordinate node发送请求到所有的shard
  3. 每个shard都会返回结果给coordinate node,coordinate node整合,汇总,排序数据响应给客户端
    注意:如果是分页查询,每一个shard都会返回全量的数据给coordinate node,由coordinate node整合,排序后把第n页数据响应给客户端,所以ES分页查询效率较低,ES自动设置了分页查询的时候,超过第n页,会抛出异常给客户端
es搜索中倒排索引原理

在ES中,每一个doment都有对应的docment ID,文档内容被表示成一组关键词的集合,一个docment在分词器进行分词之后会被分成n个单词,每个关键词都会记录他在文档中出现的次数和位置,

索引是以ID为索引进行排序搜索,倒排索引就是以单词为索引进行排序搜索,以下是一个简单示例(实际上倒排索引的数据结构不只是Word和Docment ID List,其余不展开 ):

docment IDcontent
1北京清汤火锅好吃
2成都火锅好吃

对文档进行分词之后,得到以下倒排索引。

WordIdWordDocment ID List
1北京1
2清汤1
3火锅1,2
4好吃1,2
5成都2

有了倒排索引之后,用户请求比如火锅时,node就可以查询倒排索引,查到包含这个单词的文档,把文档集合返回给用户

ES 在数据量很大的情况下如何提高查询效率

es 的搜索引擎严重依赖于底层的 filesystem cache ,你如果给 filesystem cache 更多的内存,尽量让内存可以容纳所有的 idx segment file 索引数据文件,那么你搜索的时候就基本都是走内存的,性能会非常高

冷热分离:把冷热数据放到不同的节点中

数据预热:提前访问热点数据,将热点数据加载到内存中

ES(Elasticsearch)相关文献

ES官方网站:https://www.elastic.co

ES社区官方网址: https://www.elastic.co/community

ES独立的社区网站 https://discuss.elastic.co/,其中包括ES用户和开发人员的论坛和讨论

elasticSearch-权威指南-中文版:https://www.elastic.co/guide/cn/elasticsearch/guide/current/foreword_id.html

权威指南GitHub 仓库:https://github.com/elastic/elasticsearch-definitive-guide/

Kibana 用户手册:https://www.elastic.co/guide/cn/kibana/current/index.html
elasticSearch-中文社区:https://elasticsearch.cn/
elasticSearch-参考手册-api:https://www.elastic.co/guide/index.html
elasticSearch-客户端-api:https://www.elastic.co/guide/en/elasticsearch/client/index.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值