Elasticsearch:彻底理解 Elasticsearch 数据操作

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

Elasticsearch 中有四种基本的数据操作。 每个操作都有自己的资源需求。每个用例都使用这些操作但它们会优先于某些操作。

  • Index在这里被用做动词而不是其名词索引。处理文档并将其存储在索引中以供将来检索。
  • Delete从索引中删除文档。
  • Update删除文档并索引替换文档。
  • Search从一个或多个索引中检索一个或多个文档或聚合。

在今天的文章中我将详述上面的几个基本操作。

Elasticsearch 架构

如果你对 Elasticsearch 还不是很熟悉的话我建议你可以先去读一下我之前的文章

简单地说一个 Elasticsearch 的集群由如下的部分组成

如上所示Elastic Stack 由 ElasticsearchKibanaBeats 及 Logstash 来组成。用一句话来描述Kibana 是用来可视化及搜索 Elasticsearch 的数据管理及监控 Elasticsearch 集群发送通知等。它是 Elastic Stack 的窗口。你可以进一步阅读文章 “Kibana如何开始使用 Kibana” 以了解更多。 Elasticsearch 是一个大数据的搜索及分析引擎。Beats 及 Logstash 是被用来把数据写入到 Elasticsearch 中的工具。最新的 Elastic Stack 建议使用 Elastic Agent 来作为数据摄入的方式

 有关上面的节点的描述

  • Data索引、存储和搜索数据
  • Master管理集群状态
  • Ingest转换摄入数据
  • Machine learning处理机器学习模型
  • Coordinator委托请求并合并搜索结果。通常由不担任任何角色的节点来担当尽管也可以由 data, masteringest 及 machine learning 节点来担当。

 有关这些节点的具体描述请参阅我之前的文章 “ Elasticsearch 中的一些重要概念: cluster, node, index, document, shards 及 replica

了解 Elasticsearch index 数据流

上图显示了文档被索引到 Elasticsearch 集群时的数据流。 它包括以下基本步骤

1步骤1客户端发出将文档放入集群的请求集群中的协调器节点接受请求进行处理。

2第 2 步协调器节点使用索引请求中的管道pipeline参数来检查文档是否需要在路由到数据节点进行进一步处理之前进行丰富或转换。

如果答案为否文档将被路由到集群中的数据节点。 如果答案为是文档将被路由到集群中的摄取节点ingest node以丰富文档。 丰富过程完成后摄取节点继续将丰富的文档路由到数据节点。

集群中哪个数据节点将进一步处理文档的决定是基于索引的分片信息和哈希模公式

shard = hash(routing) % number_of_shards

从上面的公式中可以看出来如果 number_of_shards 改变了那么得出来的 shard 值也会改变。这也是为啥我们在创建一个索引之后不能修改 number_of_shards 这个参数。一旦 number_of_shards 被修改了之后我们必须通过 reindex 的方式写入另外一个索引来进行搜索和查询。

3第三步数据节点将文档解析为 JSON 对象然后检查对象中是否有任何文本值。 如果找到文本值就会涉及文本分析过程。 它分析文本并将其分解为更有用的结构组件。 它还应用一些处理来使文档与全文搜索更相关。 最后文档被添加到内存缓冲区并附加到事务日志translog。

当缓冲区填满时文档被写入一个段然后缓冲区被清除。 同时事务日志仍然保留文档直到它变得足够大执行完整提交。 文档永久刷新到磁盘旧的事务日志被删除并创建新的。关于这个部分的描述你可以阅读我之前的文章 “ElasticsearchElasticsearch 中的 refresh 和 flush 操作指南”。

如果启用复制则触发复制数据过程。 该数据节点向包含索引副本分片的数据节点发送复制请求。 此处的整个索引过程将在该节点上完成以创建这些文档的副本。

了解 Elasticsearch 搜索数据流

搜索是信息检索的通用术语。 Elasticsearch 提供各种检索功能包括全文搜索、地理搜索、范围搜索、脚本搜索和聚合。你可以阅读文章 “开始使用 Elasticsearch 2”。

Elasticsearch 如何在幕后执行搜索查询 下图显示了搜索操作的数据流。

Elasticsearch 在非正式称为 scatter、search、gather 和 merge 的阶段执行搜索。

1第一阶段scatter
客户端向集群发出搜索请求集群中的协调器节点接受请求进行处理。 基于索引的信息协调器节点将搜索请求路由到包含索引数据的所有数据节点。

2第 2 阶段search
在第一阶段接收到搜索请求的每个数据节点解析请求以检查搜索查询中的任何查询子句是否需要应用文本分析过程。 如果是文本分析处理开始。 最后数据节点在索引分片的每个段上执行搜索请求。有关文本分析请详细阅读我的另外一篇文章 “Elasticsearch: analyzer”。

3第 3 阶段gather 和 merge
第一阶段 中的协调器节点从将搜索请求路由到的所有数据节点收集搜索结果。 收集处理完成后合并处理开始。 它对搜索结果进行合并、排名和排序然后将它们返回给客户端。

了解 Elasticsearch 删除数据流

如何从 Elasticsearch 中删除文档 下图显示了删除单个文档的幕后数据流。

1步骤1客户端发出从集群中删除文档的请求集群中的协调节点接受请求进行处理。

2第 2 步基于分片信息和文档 ID协调节点将删除请求路由到包含存储文档的主分片的数据节点。

3第 3 步数据节点不会立即删除文档它会将文档标记为已删除然后将其添加到内存缓冲区并将其追加到事务日志translog中。 此时文档是不可搜索的。

当缓冲区填满时changes 将写入段并且缓冲区被清除。 同时事务日志仍然保留已删除的文档直到它变得太大执行完整提交。 更改被刷新到磁盘文档被永久删除。

如果为索引启用了复制则复制数据进程开始。 该数据节点将删除请求发送到包含索引副本分片的数据节点。 此处的整个删除过程将在该节点上完成以将文档从副本分片中完全删除。

了解 Elasticsearch 更新数据流

Elasticsearch 中的文档是不可变的。 当 Elasticsearch 更新文档时它会删除原始文档并为新的、更新的文档编制索引。 这两个操作在每个 Lucene 分片中以原子方式执行。这会产生 delete 和 index 操作的成本但它不会调用任何摄取管道。

我们可以描述 update 数据流为如下的操作

Update = Delete + (Index - Ingest Pipeline)

好了今天的文章就写到这里。希望你对 Elasticsearch 的数据操作有一个基本的了解。 这对以后如何提高索引速度提高搜索速度提供一个良好的理解基础。更多关于如何优化这方面的文章请详细阅读文章

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6