likes
comments
collection
share

ElasticSearch基础-入门篇

作者站长头像
站长
· 阅读数 18

一、背景

我们知道 Elasticsearch 是构建在 Lucene 之上的分布式大数据处理引擎。那么 Elasticsearch 是为什么而出现的呢?

关系型数据库是目前最典型的数据存储模式,其优势非常明显:

  • 以二维表为基本存储结构,二维表结构是非常贴近逻辑世界的一个概念,非常容易被人们所理解。
  • 保持数据一致性(支持事务)。
  • 数据更新的开销相对较小。
  • 支持 SQL,支持 Join 等多表查询等复杂查询,能满足多数需求。

二、ElasticSearch简介

Elasticsearch是一个分布式文档存储。而不是将信息存储为行列式数据,Elasticsearch 存储已序列化的复杂数据结构作为 JSON 文档。当集群中有多个 Elasticsearch 节点时,存储文档分布在集群中,可从任何节点立即访问。

存储文档时,会在 1秒内 近乎实时地 对其进行索引和完全搜索。Elasticsearch 使用一种称为支持非常快速的全文搜索的 倒排索引。倒排索引列出任何文档中出现的每个唯一单词,并标识所有记录每个单词出现的位置。

可以将索引视为文档的优化集合,每个文档是字段的集合,这些字段是包含了数据的键值对。默认情况下,Elasticsearch 索引每个字段和每个索引中的所有数据。 字段具有专用的、优化的数据结构。例如,文本字段是存储在倒排索引中,数值和地理字段存储在 BKD 树中。 能够使用每个字段的数据结构来组装和返回搜索结果是Elasticsearch如此快速的原因。

Elasticsearch还具有 无模式 的能力,这意味着文档可以在没有明确指定如何处理每个不同字段的情况下编制索引,这可能发生在文档中。启用动态映射后,Elasticsearch 自动检测新字段并将其添加到索引中。此默认行为使索引和浏览数据变得容易,只要文档开始建立索引, Elasticsearch 将检测和映射布尔值、浮点数和整数值、日期和字符串到相应的 Elasticsearch 数据类型。

这是当前最新版本 8.8 中对ES的简单介绍,ES是很复杂的,先做简单的了解。接下来将讲解ES中涉及的一些基本概念的内容。

三、ES 基础概念

2.1 集群

ES 集群 是多个 节点(node)的集合,这些节点将共同拥有完整的数据,并跨节点提供联合索引、搜索和分析功能。

ES 是天然支持集群的,他不需要依赖其他的服务发现和注册的组件,它内置了一个叫 Discovery 的模块,是 ES 自己实现的一套用于节点发现和选主等功能的组件。ES 是一个天然的分布式系统,你可以将服务器(节点)添加到集群以增加容量。

2.2 节点

节点 是一个 ES 的运行实例,也就是一个进程,多个节点共同组成集群,在单个集群中可以有任意多个节点。节点有多种类型,主要介绍下主节点和数据节点。

  • 主节点 负责轻量级集群范围的操作,例如创建或删除索引,跟踪哪些节点是集群的一部分,并决定将哪些分片分配给哪些节点。重要的是集群运行状况,以具有稳定的主节点。

  • 数据节点 保存包含已编制索引的文档的分片。数据节点处理与数据相关的操作,如 CRUD、搜索和聚合。 这些操作是 I/O、内存和 CPU 密集型操作。重要的是监视这些资源,并在它们过载时添加更多数据节点。

2.3 索引(index)

索引 是具有某种相似特性的文档集合,索引名称必须小写。在单个集群中可以创建任意多个索引。

2.3.1 分片和副本

ElasticSearch基础-入门篇 创建索引时,可以指定分片数和副本数,这个是什么意思呢?

分片 其实就是索引的水平拆分,可以实现更大数据的存储和分析,一个分片保存了完整索引数据的一部分。分片有两种类型:主分片副本分片

  • 索引内任意一个文档都归属于一个主分片,每个索引至少有 1 个主分片,每个主分片拥有 0 个或多个副本分片,主分片的数目决定着索引能够保存的最大数据量。
  • 副本分片是主分片的副本,副本分片可提供数据的冗余副本,以防止硬件故障并增加处理读取请求(如搜索或检索文档)的能力。

创建索引时,索引中主分片的数量是固定的,但副本分片数是随时可更改的,其更改操作不会中断索引或者查询。一个主分片的副本分片不会在这个主分片的节点上,如果单机 ES,创建了一个主分片一个副本的索引,这个索引健康状况会是 yellow。

2.3.2 别名(alias)

别名就是索引另外的名称,可以用来 实现跨索引查询、无缝切换等功能。每个索引可以有若干的别名,不同索引也可以使用相同的别名。

索引别名可以给任意一个需要索引名的 API 来使用,提供了极大的灵活性。通过索引别名写文档时,当这个别名只指定了一个索引,则可以直接通过该索引别名替换索引名做写的操作,如果索引别名指向了多个索引,则可以指定写某个索引。(ES 的操作 API 计划后续单独出一篇文章,这里不做详细讲解)

2.3.3 映射(mapping)

映射的功能是 完成字段(数据类型、存储属性、分析器、词向量等)的定义

2.4 类型(type)

在 Elasticsearch 7.0 版本之后,已经被彻底移除,这里不做过多介绍了。

2.5 文档(document)

文档 是可以被索引的基本信息单元,文档由多个字段的值组成,通过序列化 JSON 格式保存在 ES 中,每一个文档都有唯一的 ID。单个索引中理论上可以存储任意多个文档。

四、倒排索引

ES 倒排索引的创建过程就是建立 Term 到文档 ID 的映射关系。我们需要先了解几个概念。

  • 文档ID:ES 的文档都有文档ID的,我们可以通过创建文档时指定,如果未指定,ES 会自动生成一个。
  • Term:一段文本经过词法分析(分词等)得到的单词列表,这一个个的单词就是 Term。
  • Term Dictionary:单词词典。就是维护 Term 的集合。有些像 Mysql 的 B+树。
  • Term Index:单词索引。如果词典过大我们放在内存必然会消耗过大的内存,ES 为此做了优化,就是用 Term Index 来进行优化。Term Index 在数据结构上算是一个 Trie 树结构。
  • Posting List:倒排列表。在 ES 中,Posting List 就是包含特定 Term 的 文档ID 的集合。ES 为了减小 Posting List 的存储空间,也进行了一些优化。

我们整几条数据来理解一下。

ElasticSearch基础-入门篇

ES 会为每一个字段都建立倒排索引。

product_type字段: ElasticSearch基础-入门篇 product_price字段:

ElasticSearch基础-入门篇

4.1 ES搜索过程

ES 执行搜索的过程大致如下:

  1. 用户输入查询语句。
  2. 对查询语句进行词法分析和语言分析,得到一系列 Term。
  3. 通过语法分析得到一个查询树。
  4. 利用查询树搜索索引,从而得到每个词的文档链表,对文档链表进行交、差操作,并得到结果文档。
  5. 将得到的结果文档按查询的相关性进行排序。
  6. 返回查询结果给用户。