【ES入门一:基础概念】

集群层面上的基础概念

集群

由多个es实例组成的叫做集群

节点

单个ES的服务实例叫做节点。每个实例都有自己的名字,就是在配置文件中配置的'node.name'中的内容。为了标识每个节点,每个节点启动后都会分配一个UID,存储在data目录。每个节点受到集群的管理,我们可以通过增加或减少节点来达到扩容和减容的目的

集群中的节点是有分类的:

  • 主节点:主节点在整个集群中是唯一的,主节点主要负责管理集群变更,元数据的更改
  • 数据节点:负责保存数据,要扩产存储时需要扩展这类节点。数据节点负责执行数据相关的操作,如:搜索、聚合、crud。其对节点机器的CPU、内存、I/O要求都比较高
  • 协调节点:负责接口客户端的请求,将请求路由到对应节点进行处理,把最终结果汇总到一起返回给客户端,因为需要处理结果集和对其进行排序,需要较高的CPU和内存资源
  • 预处理节点:预处理操作允许在写入文档前通过定义的一些processors处理器和管道对数据进行转换。默认情况下节点启动后就是预处理节点
  • 部落节点:未来会淘汰
  • Hot&Warm Node: 不同硬件配置的节点,用来实现Hot&Warm架构的节点,有利于降低集群部署成本。例如,在硬件资源好的机器中部署Hot类型的数据节点,而在硬件资源一般的机器上部署Warm节点

在新版的ES中,是这样配置的

如上示例,node.roles的值是一个数组,说明一个节点可以有多个角色。node.roles的可选项如下:

机智的你会发现,上述类型中并没有协调节点的类型选项,那怎么设置一个节点为协调节点那? 其实每个节点本身就是一个协调节点,如果你一定要指定一个节点为协调节点的话,可以这样设置:

分片

分片的概念其实很好理解,试想一下如果家里的书多到一个箱子放不下,是不是要找另外一个箱子来装,这些书好比就是海量的数据,一个机器放不下,就放到多个机器上来存储

一般来说,面对海量数据的时候,分布式系统可以通过增加机器数量来进行水平拓展。所以,系统需要将数据分成几个小块数据,并且尽量均匀的分配到各个机器上,然后通过某种策略找到对应数据所在的位置。分片是ES底层最基本的读写单元,分片是为了分割巨大的索引数据,让读写可以有多台机器来完成,从而提高系统的吞吐量

副本

为了保证数据可靠性,一般分布式系统都会对数据进行冗余备份,这个备份就是副本。**ES将数据副本分为主从2个类型:主分片+副分片。**在写入的过程中,先写入主分片,成功后再并发写副分片,在数据恢复时以主分片为主。多个副本除了可以保证数据可靠性,还有一个好处就是可以承担系统的读负载

可以在创建索引的时候,指定分片数量和副本数量:

数据层面上的基础概念

索引(相当于数据库表)

索引是一类相似文档的集合。ES将数据存储在一个或多个Index中,例如将用户数据存储到User Index中,而将订单数据存储到Order Index中。一个索引有一个或者多个分片,索引的数据会以某种方式分散到各个分片上去存储

如上图,索引有3个分片,主分片分别是P1、P2、P3,队友的副本分别是R1、R2、R3,仔细看主分片和其他副本分片不会同时分配在同一个节点上。这样是保证当一个节点的主分配下线时,其他节点上的从副本可以升级为主分配,保证数据的可靠性

Mapping (相当于建表语句)

Mapping定义了索引里面的文档到底有哪些字段 以及字段的类型,类似于数据库中表结构的定义。Mapping有2种作用:

  • 定义索引中各个字段的名称和对应的类型
  • 定义各个字段、倒排索引的相关设置,如使用什么分词器

需要注意的是,Mapping一旦定义完成后,已经定义的字段的类型是不能更改的

文档(相当于表记录)

我们往Es中写入的每一条数据都是一个文档,并且我们搜索也是以文档为单位的,所以文档是ES中的主要实体

我们在kibana或者postman中测试插入一条书本记录:

然后在查一下这条记录:

顺便解释一下返回的字段含义:

  • _index:文档所属的索引名字,也就是books
  • _type:文档所属的类型名称,现在ES7.x统一为_doc
  • _id: 文档的唯一id。如果我们插入时不指定文档id,es会随机分配,这里有利于数据均匀分散到各个分片
  • _version:文档的版本信息,并发读写时可以解决文档冲突
  • _score:相关性算法,代表查询的匹配性
  • _seq_no和_primary_term:es内部用来保证主分片和副本数据一致性的,后面的章节中我们会进行介绍**。当一个index每次选择主分配后都会有一个序号,记为_primary_term,它是递增的。在同一个index下,每次写入数据后都会有一个写入顺序号,记为_seq_no, 它也是递增的。_primary_term 和 _seq_no 在逻辑上构成了一个文档写入的唯一位置。**

字段(相当于表字段)

每个文档都有一个或者多个字段,例如books索引指定了书本有2个字段book_id和name两个字段,其实就是Json中的key,常见的类型有keyword、text、数字类型(integer、long、float、double等)、对象存储

  • keyword:适合存储简短、结构化的字符串,比如产品名称、产品id
  • text适合存储全文本数据,比如:文件内容、短信内容

下面是一个简单的示例:

词项

将全文本的内容进行分词后得到的词语就是词项了。例如"programmmers love cat"使用标准分词器后得到【programmmer、love、cat】这3个词项。需要注意的是:分词器除了进行分词外还会进行大小写转换、去复数等操作

倒排索引和正排索引

相关推荐
azhou的代码园2 分钟前
基于JAVA+SpringBoot+Vue的制造装备物联及生产管理ERP系统
java·spring boot·制造
hanbarger2 分钟前
nosql,Redis,minio,elasticsearch
数据库·redis·nosql
微服务 spring cloud24 分钟前
配置PostgreSQL用于集成测试的步骤
数据库·postgresql·集成测试
先睡26 分钟前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
弗罗里达老大爷28 分钟前
Redis
数据库·redis·缓存
孤水寒月38 分钟前
Git忽略文件.gitignore
git·elasticsearch
wm104342 分钟前
java web springboot
java·spring boot·后端
smile-yan44 分钟前
Provides transitive vulnerable dependency maven 提示依赖存在漏洞问题的解决方法
java·maven
老马啸西风1 小时前
NLP 中文拼写检测纠正论文-01-介绍了SIGHAN 2015 包括任务描述,数据准备, 绩效指标和评估结果
java