专业的编程技术博客社区

网站首页 > 博客文章 正文

快速入门elasticsearch基础篇(elasticsearch7教程)

baijin 2024-10-13 01:14:57 博客文章 12 ℃ 0 评论

什么是Elasticsearch

中文:https://www.elastic.co/guide/cn/elasticsearch/guide/current/_queries_and_filters.html

英/??l?st?k/

一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、数据分析、系统监控等功能。

它具有以下主要特点:

  • 具备实时搜索能力:提供近实时的搜索和分析能力。
  • 多样化的查询方式:支持全文搜索、过滤、聚合等多种查询操作。
  • 具备强大的分析功能:支持复杂的数据分析和聚合操作。
  • 可扩展性强:通过添加插件和使用API,可以扩展和定制Elasticsearch的功能。


为什么要使用ElasticSearch

为了解决传统数据库中查询性能问题:

系统中的数据, 随着业务的发展,将会非常多, 而业务中往往采用模糊查询进行数据的搜索, 而模糊查询会导致查询引擎放弃索引,导致系统查询数据时都是全表扫描,在百万级别的数据库中,查询效率是非常低下的,而使用 ES 做一个全文索引,将经常查询的系统功能的某些字段,比如说电商系统的商品表中商品名,描述、价格还有 id 这些字段我们放入 ES 索引库里,可以提高查询速度。


除此之外,比如其他业务的需求:海量日志的存储、可用数据的分析,等等


ElasticSearch与MySQL的比较

  • MySQL有事务性,而ElasticSearch没有事务性,所以你删了的数据是无法恢复的。
  • ElasticSearch没有物理外键这个特性,如果你的数据强一致性要求比较高,还是建议慎用
  • ElasticSearch和MySql分工不同, MySQL负责存储数据, ElasticSearch负责搜索数据

ES核心概念

了解完这些相关概念,是否能掌握:

1 请解释Elasticsearch中的索引、文档和分片的概念

2 什么是倒排索引


比如存储员工数据,每个文档代表一个员工。在Elasticsearch中存储数据的行为就叫做索引(indexing),

Elasticsearch对比图来类比传统 关系型数据库

elational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields

Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多 个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。

索引

索引(index)这个词在Elasticsearch中有着不同的含义,一个索引(index)就像是传统关系数据库中的数据库,它是相关文档存储的地方, index的复数是indices 或indexes。

索引(名词) :一个索引(index)就像是传统关系数据库中的数据库,它是相关文档存储的地方, index的复数是indices 或indexes。

索引(动词) :「索引一个文档」表示把一个文档存储到索引(名词)里,以便它可以被检索或者查询。这很像 SQL中的 INSERT 关键字,差别是,如果文档已经存在,新的文档将覆盖旧的文档。

文档(Document)

一个文档是一个可被索引的基础信息单元,也就是一条数据。类似于关系型数据中的一条数据,通过_id在Type内进行唯一标识。


字段(Field)

相当于是数据表的字段


节点(Node)

是组成 Elasticsearch 集群的基本服务单元,集群中的每个运行中的Elasticsearch 服务器都可称之为节点。

Elasticsearch 集群中,节点的状态有 Green、Yellow 和 Red 三种:

Green(绿色):表示节点运行状态为健康状态。所有的主分片和副本分片都可以正常工作,集群 100%健康。

Yellow(黄色):表示节点的运行状态为预警状态。所有的主分片都可以正常工作,但至少有一个副本分片是不能正常工作。此时集群依然可以正常工作,但集群的高可用性在某种程度上被弱化。

Red(红色):表示集群无法正常使用。此时,集群中至少有一个分片的主分片及它的全部副本分片都不可正常工作。虽然集群的查询操作还可以进行,但是也只能返回部分数据(其他正常分片的数据可以返回),而分配到这个有问题分片上的写入请求将会报错,最终导致数据丢失。

节点分成主节点、数据节点、协调节点。

  • 主节点

主节点主要负责集群中的轻量级操作,负责创建索引、删除索引、分配分片、追踪集群中的节点状态等工作,相当于扮演团队大脑的角色,所以它对集群的来说稳定性非常重要。

  • 数据节点:

数据节点是除了主节点外,最重要的节点,数据节点存储了所有的分片文档索引数据,同时主要用来处理数据相关的操作,CRUD搜索和聚合

  • 协调节点

协调节点的作用就把客户端的请求转分配给最合适的节点来处理,简单来讲就是负载均衡的作用。

大多数情况下不需要专用的协调节点,协调节点的功能可以由主节点或数据节点来完成,中小型集群中,专门的协调节点的并没有专用的数据节点必要。


集群(Cluster)

一个运行中的Elasticsearch 实例称为一个节点,而集群是由一个或者多个拥有相同cluster.name 配置的节点组成,它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据

本地开发时,我们使用了单个ElasticSearch节点,这个节点也可以看作是一个集群,只不过这个集群中只有一个节点,集群中所有的功能都需要这个节点完成,包括搜索、建索引、聚合、分配分片等.

分片(Shards)

将索引数据划分成多份,每一份就称之为分片。说白了,一个分片就是一个运行的Lucene实例,每个分片只是保存了索引中所有数据的一部分(理解redis的分片集群,应该也明白这个分片的道理)

分片分为主分片和副分片:

主分片(Primary Shard)

用以解决数据水平扩展问题:通过主分片,可以将数据分布到多个节点上。

主分片数在索引创建时指定,后续不允许修改,除非Reindex。


副本分片(Replica Shard)只是主分片的一个副本,它可以防止硬件故障导致的数据丢失,以实现高可用,同时可以提供读请求。副本分片是可以动态调整的,增加副本数,可以提高服务的读取吞吐量。但副本分片设置过多,会降低集群的写入性能。

分片很重要,主要有两方面的原因:

  • 允许你水平分割 / 扩展你的内容容量。
  • 允许你在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量。
    至于一个分片怎样分布,它的文档怎样聚合和搜索请求,是完全由 Elasticsearch 管理的,对于作为用户的你来说,这些都是透明的,无需过分关心。

副本(Replicas)

创建分片的一份或多份拷贝,这些拷贝叫做复制分片(副本)。


倒排索引

B:传统的检索方式是通过文章,逐个遍历找到对应关键词的位置,这种效率在海量数据前面比较低效。

A:倒排索引(反向索引),是通过分词策略,分成两大部分:词典、倒排表(文章的映射关系表),这种词典 + 倒排表的结构即为倒排索引。其中词典中存储关键词,倒排表中存储该关键词在哪些文中出现的位置。有了倒排索引,就能实现 O(1) 时间复杂度的效率检索文章了,极大的提高了检索效率。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表