Elasticsearch基本概念和索引原理

news2024/12/26 15:42:13

一、Elasticsearch是什么?

Elasticsearch是一个基于文档的NoSQL数据库,是一个分布式RESTful风格的搜索和数据分析引擎,同时也是Elastic Stack的核心,集中存储数据。Elasticsearch、Logstash、Kibana经常被用作日志分析系统,俗称ELK。

说白了,就是一个数据库,搜索贼快(但是插入更新较慢,要不然其他数据库别玩了)。速度快,还可以进行分词,非常适合做搜索,例如商城的商品搜索。为什么快,后面讲原理的时候会说,不单单是缓存的问题,原理非常精彩。而且它是nosql的,数据格式可以随便造。Elasticsearch还为我们提供了丰富的RESTful风格的API,写代码的成本极低。最后它支持分布式,高性能(搜索快),高可用(某些节点宕机可以接着用),可伸缩(可以方便的增加节点,解决物理内存上线问题),适合分布式系统开发。

优势

  1. 分布式的实时文件存储,每个字段都被索引并可被搜索

  2. 实时分析的分布式搜索引擎

  3. 横向可扩展:支持上百台服务节点的扩展,集群增加机器简单,支持处理PB级数据

  4. 分片机制:

    允许水平分割扩展数据,允许分片和并行操作从而提高性能和吞吐量

    提供高性能:同一个索引可以分多个主分片(primary shard),每个主分片拥有自己的副本分片(replica shard),每个副本分片都可以提供服务,提升系统搜索请求的吞吐量和性能

    提供高可用性:同一个索引可以分多个主分片,每个主分片拥有零个或者多个副本,如果主分片挂了,可以从副本分片中选择一个作为主分片继续提供服务

  5. 隐藏复杂实现:Elasticsearch 内部隐藏了分布式系统的复杂性,我们不用去关心它是如何做到高可用,可扩展,高性能的

  6. 易用开源:不需要额外配置,就可以运行一个Elasticsearch服务,开源

二、基本概念 

为了快速了解Elasticsearch(后面可能会简称为ES),可以与mysql几个概念做个对比。

ElasticsearchMysql
字段(Filed)属性(列)
文档(Document)记录(行)
类型(Type)
索引(Index)数据库

1、Cluster:集群

一个集群包含多个节点,对外提供服务,每个节点属于哪个集群通过配置文件中的集群名称决定

2、Node:节点

集群中的一个节点,每个节点也有一个名称,默认是随机分配,也可以自己指定,在es集群中通过节点名称进行管理和通信。

由于生产环境下ES基本都是集群部署的,所以一定少不了节点的概念,一个节点就是一个ES实例,就是一个Java进程,这些Java进程部署在不同的服务器上,增加ES可用性。

ES节点根据功能可以分为三种:

  1. 主节点:职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点每个节点都可访问集群的状态,但是只有主节点可以修改集群的状态。
  2. 数据节点:数据节点主要是储存数据的节点,对文档进行增删改查,聚合操作等等,数据节点对cpu,内存,io要求较高,当资源不够的时候,可以增加新的节点,很方便的进行数据拓展。
  3. 客户端节点:本节点主要处理路由请求,分发索引的操作。实际上主节点和数据节点也有路由转发的功能,但是为了提高效率,还是建议生产环境单独创建客户端节点。

分片类似于mysql中的分表,在一个索引拆分成几个小索引,分布在不同的节点(不同服务器)上,每个小索引都具有完备的功能,当客户端发来请求的时候,客户端节点找到合适的分片上的小索引,进行数据查询,这一过程对于用户来说都是透明的,用户表面上看只是在操作一个索引。利用分片,可以避免单个节点的物理限制,还可以增加吞吐量。建议最开始一个索引要用多少分片设计好,因为修改分片数量是个相当麻烦的过程。

作为分布式的数据库,ES必须为咱们提供数据冗余功能,这就是分片副本,就是将某个分片copy一份放到其他节点上。注意,这里分片和分片副本 **必须在不同的节点上!** 分片副本也可以提高吞吐量。分片副本不同于分片,可以很方便的进行修改。

说完了所有概念,再去看上面的图,有一个索引,分了3分片在三个节点上,并且每个分片在不同的节点上有分片副本。

3、Index:索引

索引是具有相同结构的文档集合,作用相当于mysql中的库。

ES中的索引类似于mysql中的数据库,我觉得未来索引有成为mysql中表概念的潜质。

我们把相同特征(Filed数量和类型基本相同)的文档放到同一个索引(index)里面。这样方便提前通过mapping来规定各个Filed的类型。另外,索引名称必须全部小写,所以不建议写成驼峰式。

4、Type:类型

一个索引可以对应一个或者多个类型,类型可以当做是索引的逻辑分区,作用相当于mysql中的表。

关于Type,类型概念,在6.x版本中,一个索引(Index)可以拥有多个Type。在7.x版本(目前最新版本),一个索引只能拥有一个Type,默认的type就是_doc,在7.x版本中,已经建议删除了。在未来的8.x版本会彻底删除。但是在7.x版本中,一个文档还必须归属于一个类型。

5、Document:文档

存储在es中的一个JSON格式的字符串,每一个文档有一个文档ID,如果没有自己指定ID,系统会自动生成一个ID,文档的index/type/id必须是唯一的,作用相当于mysql中的行。

ES中的一个对象将来会和Java代码中的一个对象对应。文档的每一个Filed可以是任意类型,但是一旦某索引(Index)(我们描述的时候,略过Type,但是Type依然存在中插入了一个文档,某Filed被第一次使用,ES就会设置好此Filed的类型。

例如:你插入user的name是字符串类型,以后再插入文档,name字段必须是字符串类型。所以,建议在插入文档之前,先设置好每个Filed的类型。

如果插入文档的时候,不指定id,ES会帮助我们自动生成一个id,建议id是数字类型,这样搜索会快速很多。商城系统中的商品id建议使用雪花算法生成,这样既避免了自增id的安全性问题,又解决了字符串id检索慢的问题。

6、field:字段

一个文档会包含多个字段,每个字段都对应一个字段类型,类似于mysql中的列。

7、shard:分片

es中分为primary shard主分片和replica shard副本分片。

主分片:当存一个文档的时候会先存储在主分片中,然后复制到不同的副本分片中,默认一个索引会有5个主分片,当然可以自己指定分片数量,当分片一旦建立,分片数量不能改变副本分片:每一个主分片会有零个或者多个副本,副本主要是主分片的复制,通过副本分片可以提供高可用性,当一个主分片挂了,可以从副本分片中选择一个作为主分片,还可以提高性能,所以主分片不能和副本分片部署在相同的节点上。

8、replica:复制

复制是为了防止单点问题,可以做到对故障进行转移,保证系统的高可用。

9、映射

描述数据在每个字段内如何存储,是定义存储和索引的文档类型及字段的过程,索引中的每一个文档都有一个类型,每种类型都有它自己的映射,一个映射定义了文档结构内每个字段的数据类型。

使用GET /index/_mapping/type获取对应的/index/type的映射信息

三、Elasticsearch索引原理

首先,我们知道mysql底层数据结构使用的是B+Tree,这种BTree,将搜索时间复杂度变成了logN,已经很快了,我们Elasticsearch要比它还快。Elasticsearch是怎么做的呢?首先储存结构要优化,然后再提高下和磁盘的交互效率。

先说Elasticsearch索引结构,叫做倒排索引,啥是倒排索引呢?它的大概逻辑如下:

 为了讲清楚这个概念,我们先看个例子,如下为我们user的数据:

IDNameAge
1Kate24
2John24
3Bill29
4Kate26
5Brand29

Elasticsearch会为以上数据建立两个索引树:

TermPosting List
Kate1,4
Brand5
John2
Bill3
TermPosting List
241,2
264
293,5

以上的索引树就叫做倒排索引,每个Filed字段对应着一组Term,每个Term后面跟着的id(这个主键用户不指定就会自动生成,所以一定存在)就是Posting List,它是一组id,有了id再去磁盘中对应的文档就so fast了。

你有没有发现,Term如果按序找会快点,将Term按序排,在进行二分查找,是不是速度就跟BTree一样了,时间复杂度为LogN。这个有序的Term组就是Term Dictionary

那么问题又来了,比如:数据库中有name前缀为A的同学1000万个,前缀为Z的同学有3个,我要查前缀为Z的同学,那二分查找不也很多次吗,所以,Elasticsearch把每个开头的地方标记一下,拿出来,再放到一颗树里,速度不是就快了嘛,这棵树就是Term IndexTerm Index前缀不一定是第一个字符,比如A、Ab、Abz,这种都可以在Term Index树里。并且Term Dictionary可能会太大,会被放到磁盘中,避免内存占用太多。

由于Term Index被放到内存中,所以最好压缩一下,减少内存使用,压缩使用的是FST,这个东西讲起来比较复杂,反正就是能压缩,内存变小就好了。

Term压缩完了,那么Posting List是不是也可以压缩一下,省省空间啊?既然都是id,使用过redis的同学瞬间会想到bitMap,就是有个巨大的数组,储存着0或1,有就是1,没有就是0。例如上面的3、5放在BitMap中就是 1,0,1,0,0,0。虽说空间已经明显小多了,但是如果一个Posting List只储存着1,10000001这两个id,最后产生的数字是不是过大呢。于是乎,Roaring bitmaps就出来了,进行了一次指数降级,简单点说就是取商和余数储存,被除数是65535。

例如:1000,62101,131385,196658, 这几个id,首先分组,分组规则就是商一样,例如上面id可分组为[(0,1000),(0,62101)],[],[(2,6915)],[(3,53)]。注意,没有商为1的值,我用空数组表示。此时,将某个组中的数字放到一个bitmap中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/337114.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[CCS 2022] 皇帝没有衣服:用于网络安全的AI/ML

AI/ML for Network Security: The Emperor has no ClothesCCS 22: Proceedings of the 2022 ACM SIGSAC Conference on Computer and Communications Securityhttps://dl.acm.org/doi/abs/10.1145/3548606.3560609摘要最近的一些研究工作提出了基于机器学习(ML&…

工业废水的种类及其处理工艺有哪些?特定目标污染物的深度去除

随着工业的迅速发展,工业废水的种类和数量随之增加,对水体的污染也日趋严重,威胁人类的健康和正常生活。所以工业废水的处理对于环保至关重要。 保护生态环境、更好地做好工业废水的处理,了解工业废水及其种类与处理非常必要。 工…

MySQL 删除数据库

使用普通用户登陆 MySQL 服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库,所以我们这边使用 root 用户登录,root 用户拥有最高权限。 当数据库不再使用时应该将其删除,以确保数据库存储空间中存放的是有效数据。删除数据…

【Hello Linux】 Linux基础命令

作者:小萌新 专栏:Linux 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:介绍Linux的基础命令 Linux基础命令ls指令lsls -als -dls -ils -sls -lls -nls -Fls -rls -tls -Rls -1总结思维导图pwd指令whoami指令…

Python 条件语句

Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。可以通过下图来简单了解条件语句的执行过程:Python程序语言指定任何非0和非空(null)值为true,0 或者 null为false。Python 编程中 i…

【正点原子FPGA连载】第八章UART串口中断实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第八章UART串口中…

【SSD 代码精读】之 数据增强(Data Augmentation)

SSD 数据增强前言1、Compose2、SSDCropping3、Resize4、ColorJitter5、ToTensor6、RandomHorizontalFlip7、Normalization8、AssignGTtoDefaultBox前言 原论文 根据原论文,我们需要处理的有以下: data_transform {"train": transforms.Com…

vue2.x中使用vuex

Vuex是什么? Vuex是一个专门为Vue.js应用程序开发的状态管理模式。它采用集中式存储来管理应用程序中所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex也被集成到了Vue的官方调试工具vue-devtools中,提供了诸如零配置…

Java:使用Java功能确保应用程序安全的方法

与添加新功能一样重要的是,应用程序开发人员需要开始更加重视他们设计的应用程序的安全性。毕竟,更多的应用程序功能意味着更多的数据驻留在应用程序中。如果没有适当的安全控制,这些数据很容易被入侵者窃取。Java是目前世界上最安全、最流行…

如何去阅读源码,我总结了18条心法

在聊如何去阅读源码之前,先来简单说一下为什么要去阅读源码,大致可分为以下几点原因:最直接的原因,就是面试需要,面试喜欢问源码,读完源码才可以跟面试官battle提升自己的编程水平,学习编程思想…

不要慌,我们谈一谈如何用好 ChatGPT

别人贪婪时我恐惧,别人恐惧时我贪婪。 ——巴菲特 ChatGPT 火了,技术领域的社交媒体、自媒体几乎被 ChatGPT 刷屏,这些内容当中最让人惶恐不安的是我们是否会被 AI 取代之类的文章。 比如以下几个文章标题: 《ChatGPT可能马上…

Transformer结构解读

咱们还是照图讨论,transformer结构图如下,本文主要讨论Encoder部分:图一一、首先说一下Encoder的输入部分:在NLP领域,个人理解,这个inputs就是我们的句子分词之后的词语,比如“我,喜…

符号让人疯狂

符号让人疯狂 判断背了个LV符号的包就想可能有钱 趣讲大白话:人是通过符号区分生活的 聪明人想想:能超越或摆脱符号依赖吗? *********** 信息社会加速符号的传递和创造 我们已经被各种信息传递的符号淹没 信息符号的筛选成了人的主要工作 再…

GRB非隔离系列宽电压输入负高电压输出 电压控制型

特点● 效率高达70%以上● 1*2英寸标准封装● 单电压负输出● 价格低● 电压控制,输出电压随控制电压变化线性变化● 工作温度: -40℃~85℃● 阻燃封装,满足UL94-V0 要求● 温度特性好● 可直接焊在PCB 上应用GRB 系列模块电源是一种DC-DC升压变换器。该模块电源的输…

十、Linux文件 - fread函数讲解

目录 1.fread函数讲解 2.fread函数实战 1.fread函数讲解 从文件中读入数据到指定的地址中 函数原型: size_t fread(void*buff , size_t size, size_t count , FILE* stream) /* * description :对已打开的流进行数据读取 * param ‐ ptr :指向 数据块的…

好用的电脑备份软件推荐

现在几乎每个人都有一台电脑,上面存储着大量的数据,比如宝贵的照片、视频、工作文档等等。但电脑也随时存在许多威胁,比如病毒、Windows 更新错误、死机黑屏、驱动程序问题、系统崩溃等。为防止任何数据丢失,你需要一个专业的电脑…

Oracle数据库故障处理-单块读hang存储异常导致hang死,数据库大量的db file seq read等待(p1 p2无反映)

1 故障描述 2023年1月27日下午接到业务反馈数据库存在大量的锁表阻塞信息,并且业务的页面以及数据库的一些查询均处于阻塞状态,简单的查询sql也需要查询很长时间且未返回结果,数据库hang状态。 问题现象2 1 数据库进程无法杀除。 2 操作系统进程使用…

也许你应该学学 postman了

使用 最简单的方法就是直接在浏览器中复制 Copy as cURL ,然后把数据导入 postman,然后 send ,收工。 我们这里拿 知乎首页 举例 在对应的请求下复制 cURL 打开 postman , 点击左上角的 Import , 选择Paste Raw Tex…

如何使用逻辑分析仪,解析通信数据

如何使用逻辑分析仪,解析通信数据使用工具:逻辑分析仪(几十块买的裸板),软件是:PulseView一、在开发或者移植某一个模块时,你可能遇到这样的问题:二、逻辑分析仪的使用使用工具&…

二级C语言操作例题(四十)

一、程序填空题 在此程序中,函数fun的功能是:在形参s所指字符串中寻找与参数c相同的字符,并在其后插入一个与之相同的字符,若找不到相同的字符则不做任何处理。 例如,若s所指字符串”baacda”,中c的字符为…