ElasticSearch的原理

【ES专题】ElasticSearch功能详解与原理剖析 使用:搜索和聚合操作语法,理解分词,倒排索引,相关性算分(文档匹配度)优化: 数据预处理,文档建模,集群架构优化,读写性能优化学习了ES的预处理器弄明白了ES的读写流程,以及ES写原理。 阅读详情

大部分内容转自:https://www.cnblogs.com/dreamroute/p/8484457.html

Elasticsearch最关键的就是提供强大的索引能力了,其实InfoQ的这篇时间序列数据库的秘密(2)——索引写的非常好,我这里也是围绕这篇结合自己的理解进一步梳理下,也希望可以帮助大家更好的理解这篇文章。

Elasticsearch索引的精髓:

一切设计都是为了提高搜索的性能

另一层意思:为了提高搜索的性能,难免会牺牲某些其他方面,比如插入/更新,否则其他数据库不用混了。前面看到往Elasticsearch里插入一条记录,其实就是直接PUT一个json的对象,这个对象有多个fields,比如上面例子中的name, sex, age, about, interests,那么在插入这些数据到Elasticsearch的同时,Elasticsearch还默默1的为这些字段建立索引--倒排索引,因为Elasticsearch最核心功能是搜索。

Elasticsearch是如何做到快速索引的

InfoQ那篇文章里说Elasticsearch使用的倒排索引比关系型数据库的B-Tree索引快,为什么呢?

什么是B-Tree索引?

上大学读书时老师教过我们,二叉树查找效率是logN,同时插入新的节点不必移动全部节点,所以用树型结构存储索引,能同时兼顾插入和查询的性能。因此在这个基础上,再结合磁盘的读取特性(顺序读/随机读),传统关系型数据库采用了B-Tree/B+Tree这样的数据结构:

什么是倒排索引?

继续上面的例子,假设有这么几条数据(为了简单,去掉about, interests这两个field):

| ID | Name | Age  |  Sex     |
| -- |:------------:| -----:| -----:| 
| 1  | Kate         | 24 | Female
| 2  | John         | 24 | Male
| 3  | Bill         | 29 | Male

ID是Elasticsearch自建的文档id,那么Elasticsearch建立的索引如下:

Name:

| Term | Posting List |
| -- |:----:|
| Kate | 1 |
| John | 2 |
| Bill | 3 |

Age:

| Term | Posting List |
| -- |:----:|
| 24 | [1,2] |
| 29 | 3 |

Sex:

| Term | Posting List |
| -- |:----:|
| Female | 1 |
| Male | [2,3] |

Posting List

Elasticsearch分别为每个field都建立了一个倒排索引,Kate, John, 24, Female这些叫term,而[1,2]就是Posting List。Posting list就是一个int的数组,存储了所有符合某个term的文档id。

通过posting list这种索引方式似乎可以很快进行查找,比如要找age=24的同学,爱回答问题的小明马上就举手回答:我知道,id是1,2的同学。但是,如果这里有上千万的记录呢?如果是想通过name来查找呢?

Term Dictionary(就像List<term>或term[]一样,就是多个term组成的)

Elasticsearch为了能快速找到某个term,将所有的term排个序,二分法查找term,logN的查找效率,就像通过字典查找一样,这就是Term Dictionary。现在再看起来,似乎和传统数据库通过B-Tree的方式类似啊,为什么说比B-Tree的查询快呢?

Term Index(就是利用FST的数据结构,把所有的term不重复的存在内存上),FST主要是省内存

B-Tree通过减少磁盘寻道次数来提高查询性能,Elasticsearch也是采用同样的思路,直接通过内存查找term,不读磁盘,但是如果term太多,term dictionary也会很大,放内存不现实,于是有了Term Index,就像字典里的索引页一样,A开头的有哪些term,分别在哪页,可以理解term index是一颗树:

所以term index不需要存下所有的term,而仅仅是他们的一些前缀与Term Dictionary的block之间的映射关系,再结合FST(Finite State Transducers)的压缩技术,可以使term index缓存到内存中。从term index查到对应的term dictionary的block位置之后,再去磁盘上找term,大大减少了磁盘随机读的次数。

总结如上:通过倒排索引,建立term-postlist的对应关系,为了提高查询效率,将所有的term都排了序,所有term就变成一个term Dictionary,然后为了进一步提高查询效率,在term Dictionary基础上,多了一个

这时候爱提问的小明又举手了:"那个FST是神马东东啊?"

一看就知道小明是一个上大学读书的时候跟我一样不认真听课的孩子,数据结构老师一定讲过什么是FST。但没办法,我也忘了,这里再补下课:

FSTs are finite-state machines that map a term (byte sequence) to an arbitrary output.

假设我们现在要将mop, moth, pop, star, stop and top(term index里的term前缀)映射到序号:0,1,2,3,4,5(term dictionary的block位置)。最简单的做法就是定义个Map<string, integer="">,大家找到自己的位置对应入座就好了,但从内存占用少的角度想想,有没有更优的办法呢?答案就是:FST(理论依据在此,但我相信99%的人不会认真看完的)

压缩技巧

Elasticsearch里除了上面说到用FST压缩term index外,对posting list也有压缩技巧。 
小明喝完咖啡又举手了:"posting list不是已经只存储文档id了吗?还需要压缩?"

嗯,我们再看回最开始的例子,如果Elasticsearch需要对同学的性别进行索引(这时传统关系型数据库已经哭晕在厕所……),会怎样?如果有上千万个同学,而世界上只有男/女这样两个性别,每个posting list都会有至少百万个文档id。 Elasticsearch是如何有效的对这些文档id压缩的呢?

Frame Of Reference

增量编码压缩,将大数变小数,按字节存储

首先,Elasticsearch要求posting list是有序的(为了提高搜索的性能,再任性的要求也得满足),这样做的一个好处是方便压缩,看下面这个图例: 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Elasticsearch 搜索引擎原理与实践 Elasticsearch 是开源分布式搜索引擎,提供搜素、分析、数据可视化等功能。它是一个基于 Lucene 的全文搜索服务器,能够把结构化或非结构化的数据经过索引生成一个索引库,使其可以被搜索到。在现代 Web 应用中,搜索功能已经成为不可或缺的一项功能。但是传统上,传统搜索方式需要依赖于数据库查询或者其他复杂的查询接口。而 Elasticsearch 提供了一种高效、稳定的、快速的方式进行数据的检索。 阅读详情

相关推荐

Elasticsearch 搜索引擎原理

作者:禅与计算机程序设计艺术 1.简介 Elasticsearch是一个开源分布式搜索和分析引擎,它可以帮助用户快速、高效地进行复杂的全文检索、结构化搜索以及数据分析等。它提供了一个分布式存储、搜索和分析引擎,能够解决目前最常见的搜索和分析应用场景。其主要特性包括:分布式架构、水平扩展性、自动发现、索引

AI天才研究院 192

ElasticSearch 介绍

一、ElasticSearch介绍 一个采用RESTful API标准的高扩展性的和高可用性的实时性分析的全文搜索工具 基于Lucene[开源的搜索引擎框架]构建 ElasticSearch是一个面向文档类型的数据库 es为非关系型数据,存储非结构化的数据 二、ElasticSearch概念 版本:version:7.x Near Realtime [准实时] ES 是一个准实时的搜索平台,从一个索引创建到可搜索会有轻微的延迟,一般在1秒以内。 Cluster [集群] 集群..

lockie的博客 829

Paypal开发者中心获取“ClientId”和“ClientSecret”参数

正式环境设置 1、登录到 paypal开发者中心 网址:https://developer.paypal.com/developer/ 点击右上角登录按钮登录 2、左侧栏 - 我的应用程序和凭证 - 点击“创建新应用” 新注册的paypal账号,需要进行邮箱验证,验证通过后,需要等待一段时间(或重新登录),才会出现相关设置项位置 验证邮箱通过后,点击创建新应用 3、按提示填写,保存创建应用 4、点击刚创建的应用进入应用详情页 5、应用详情页获得网站开发人员所需要的“ClientId”和“Client

龚清林的博客 1万+

了解非关系型数据库 NoSQL - ElasticSearch

了解非关系型数据库 NoSQL - ElasticSearch是什么?优点、缺点、特性!

夏寻的博客 929

wireshark抓包分析TCP协议和用Fiddler抓包Https分析

wireshark抓包分析TCP协议和用Fiddler抓包Https分析 1.实验说明: 以某种游戏的客户端连接服务器、断开服务器为例,用wireshark抓包分析TCP协议的三次握手连接、四次握手断开,与计算机网络原理进行验证;用Fiddler抓包,分析验证一个HTTPS网站的TCP连接过程 2.实验过程: wireshark实验: (1)实验准备:安装《洛克王国》游戏客户端, 运行洛克王国客户端,打开内存资源管理器查看PID 根据PID查看洛克王国服务端的IP地址和端口号 并打开命令行运行以下命令: n

qq_42032327的博客 1258

[数据转换]将NetCDF(NC)文件转换成单个GeoTIFF文件

有时候要提取tif格式数据中的气象数据,但从气象网站上下载的却是NC格式的文件。这就需要我们将NC格式的文件转换成TIF格式的文件。

G_sea_young的博客 1004

ElasticSearch概述

ElasticSearch的作用 ElasticSearch属于Nosql,是一款非关系型数据库,主要用于数据的全文检索. 搜索 Mysql不具备快速搜索海量数据的能力. 强事务控制 redis做数据缓存,降低mysql的压力 数据库排行榜: https://db-engines.com/en/ ElasticSearch引入倒排索引技术,来解决传统关系型数据库无法快速搜索海量数据的能力; 传统的关系型数据库的查找流程,即遍历查找,假若我们现在拥有500w个数据需要检索,直接拜拜; ES提供了倒排索引的

m0_56356993的博客 1341

奥顺居PHP测算引流SEO程序_八字风水_起名解梦_星座生肖综合门户源码

奥顺居PHP测算引流SEO程序_八字风水_起名解梦_星座生肖综合门户源码 S30新框架适合多种奥顺插件。

xl1407的博客 1751

Elasticsearch介绍

正向索引通常记录的是每个文档中出现的词汇及其位置,而倒排索引则相反,它基于词项来组织信息,可以快速找到包含特定词汇的所有文档。如果不在当前的协调节点上,需要将请求转发给到对应的分片主副本所在的机器,然后写入数据。2- 当数据有分片和副本的时候,写入数据到从节点的主副本的时候,负责将数据同步到其他从副本上。注意: 从节点上面,存放的副本,可能是主副本,也可能是从副本。2- 协调节点计算当前写入的数据应该存储在哪个分片的主副本(因为只有主副本才负责数据的写入操作)上,底层是基于文档ID的Hash取模方案。

无 743

【软件介绍】GWAS meta分析软件:METAL

Meta-analysis是对多个GWAS分析结果进行综合评价。METAL是GWAS meta分析最常用的工具之一,本文简单介绍METAL软件基本用法。

hucy_Bioinfo 1万+

智能车竞赛新手必看:单车定向组直线竞速与八字慢速实战技巧

本文为智能车竞赛新手提供单车定向组直线竞速与八字慢速的实战技巧,涵盖赛道分析、动力调校、传感器配置等关键环节。通过真实案例和代码示例,详细讲解如何平衡速度与稳定性,帮助选手避免常见失误,提升比赛成绩。特别针对智能车竞赛中的直线竞速和八字慢速项目,提供从硬件选型到临场策略的全方位指导。

weixin_28718793的博客 434

Elasticsearch简介及架构介绍

一、Elasticsearch简介 官网:https://www.elastic.co/cn/products/elasticsearch Elasticsearch是一个采用Restful API标准的高扩展性和高可用性的实时数据分析的全文搜索工具。 二、Elasticsearch的优势 2.1 弹性、高可用 2.2 可预见,可信 2.3 简单透明 三、elasticsearch与关系型数据库的对比 关系型数据库(MySQL) 非关系型数据库

wr_java的博客 1675

NX/UG二次开发—CAM—设置程序修剪边界Boundary

最近做了一个设置CAM程序边界的小工具,分享一下经验(官方的代码在文章末尾处),以下均以修剪边界曲线为例。 以下为官方提供的源码: /***************************** Include Files **********************************/ #include <stdlib.h> #include <uf.h> #include <uf_obj.h> #include <uf_object_type

门前大桥下,游过一群鸭,快来看一看,原来是C++ 3733

互联网大厂技术-elasticsearch(es)原理-ES架构、elasticsearch架构原理、ES数据写入、数据删除、数据读取、搜索过程、检索原理、节点协调过程、搜索引擎、索引原理

Elasticsearch 是由Lucene提供支持的搜索引擎。 它为 “搜索部分” 提供了强大的动力,而 Elasticsearch 为你提供了可扩展性,可用性,REST API,专门的数据结构等(从广义上来说)。 Elasticsearch 架构的概略示意图 从图中可以看出,Elasticsearch 在可用节点上对每个 Lucene 索引进行了分片。 分片可以是主分片或副本分片。 每个分片都是一个 Lucene 索引,这些索引中的每个索引都可以具有多个 segment,每个 segem...

码者人生的技术博客 6423

6、基于深度强化学习的无人机路径规划

本文研究了基于深度强化学习的无人机路径规划方法,提出了一种融合改进DQN算法与人工势场法的路径规划策略。通过设计合理的网络结构、状态空间、动作空间和奖励函数,结合ε-贪心策略进行动作选择,实现了无人机在复杂环境中的自主避障与目标导向飞行。仿真实验表明,该方法具有收敛速度快、实时性强和可操作性高等优点,能有效完成室内环境下的路径规划任务。文章还总结了算法优势,并对未来在连续动作、复杂环境适应及多无人机协同等方面的发展方向进行了展望。

web39explorer的博客 166

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

[转]基于Elasticsearch分布式搜索引擎的架构原理

[转]基于Elasticsearch分布式搜索引擎的架构原理 http://www.mobabel.net/%E8%BD%AC%E5%9F%BA%E4%BA%8Eelasticsearch%E5%88%86%E5%B8%83%E5%BC%8F%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E%E7%9A%84%E6%9E%B6%E6%9E%84%E5%8E%9F%E7%90...

yb223731的博客 1014

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Elasticsearch从入门到进阶——搜索引擎原理

正排索引采用ArrayList作为数据结构,下标作为索引键,元素就是文档类。

sniper_fandc的博客 1002

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

初识Elasticsearch——ES基础概念和原理

本文档介绍了Elasticsearch的基础概念和核心原理,包括: 1. 核心概念:索引、类型、文档、字段 2. 核心原理:倒排索引、分词、TF-IDF、分布式架构 3. 基础操作:索引操作、文档操作、查询操作 4. 面试重点:ES与数据库区别、分片副本、查询优化、索引设计

qq_45266928的博客 949

ELasticSearch-ES集群原理与搭建

ES集群原理   查看集群健康状况:URL+ /GET _cat/health   (1)、首先弄清ES基本概念名词     Cluster   代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。     Shards   代表索引分片,es可以把一个完...

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 1万+

Elasticsearch搜索引擎:ES的segment段合并原理

一、segment文件的合并流程: 当我们往 ElasticSearch 写入数据时,数据是先写入 memory buffer,然后定时(默认每隔1s)将 memory buffer 中的数据写入一个新的 segment 文件中,并进入 Filesystem cache(同时清空 memory buffer),这个过程就叫做 refresh;每个 Segment 事实上是一些倒排索引的集合, 只有经历了 refresh 操作之后,数据才能变成可检索的。 ElasticSearch 每次 refresh

张维鹏的博客 2万+

【elasticsearch】elasticsearch es读写原理

今天来学习下 es 的写入原理。

Mrerlou的博客 3999

ElasticSearch学习篇6_ES实践与Lucene对比及原理分析技术分享小记

QBM、MFS的试题检索、试题查重、公式转换映射等业务场景以及XOP题库广泛使用搜索中间件,业务场景有着数据量大、对内容搜索性能要求高等特点,其中XOP题库数据量更是接近1亿,对检索性能以及召回率要求高。目前QBM、MFS使用的搜索中间件是Solr,后续需要升级为ES。看的书是《ElasticSearch源码解读与优化实战》的前半部分(与这篇博客部分内容重合),主要是ES的一些工程模块,分布式集群的一些理论知识。

xiaosi的博客 1486

七、分布式搜索引擎ElasticSearch——原理

七、分布式搜索引擎ElasticSearch——原理

LQM1528490339的博客 489

Elasticsearch——深入原理

搜索引擎的基本原理和组成结构、 Elasticsearch集群的形成机制,如节点之间的发现等,以及集群的状态信息在节点之间的同步、索引的分片在集群中的分配(shard allocation)机制,如何人工干预分配的过程、索引分片的恢复(shard recovery)触发时间、恢复的过程,以及避免不必要的分片恢复的办法、 写入索引数据的过程、搜索索引数据的过程

码说芯语的博客 1626

apache的es的原理_Elasticsearch搜索引擎原理理解通俗易懂

记得小马最早期刚参加工作的时候全文索引用的是Sphinx。 当一个功能需要对表中的text varchar等文本进行like查询时,MySQL全表扫描很慢,需要Sphinx。Sphinx能解决性能和中文分词问题。Sphinx是一款基于SQL的高性能全文检索引擎,Sphinx的性能在众多全文检索引擎中也是数一数二的,利用Sphinx,我们可以完成比数据库本身更专业的搜索功能,而且可以有很多针对性的性...

weixin_39633102的博客 352
上一篇: Gradle构建项目
下一篇: lucene字典Finite State Transducers(FST)
AAA821
博客等级 码龄14年 19粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值