详细描述一下Elasticsearch索引文档的过程?

ops/2024/11/20 14:56:01/

大家好,我是锋哥。今天分享关于【详细描述一下Elasticsearch索引文档的过程?】面试题。希望对大家有帮助;

详细描述一下Elasticsearch索引文档的过程?

Elasticsearch的索引文档过程是其核心功能之一,涉及将数据存储到索引中,并使其可搜索。下面我将详细描述Elasticsearch中索引文档的流程:

1. 文档(Document)

  • 文档是Elasticsearch中存储数据的基本单位,类似于数据库中的一行记录。
  • 每个文档都是一个JSON对象,包含了数据的字段和值。

2. 索引(Index)

  • 索引是存储文档的地方,可以视为一个数据库,包含多个文档。每个文档在索引中有一个唯一的标识符(ID)。
  • Elasticsearch中的索引是分片的,可以包含多个分片,每个分片又是一个Lucene索引。

3. 索引文档的流程

索引文档的过程分为几个步骤:

3.1. 接收请求
  • 当你向Elasticsearch发送一个index请求时,Elasticsearch接收到请求后,会根据请求的目标索引(index)来决定该文档存储在哪个位置。
  • 这个请求通常是一个HTTP请求,通常如下所示:
    PUT /my_index/_doc/1
    {"title": "Elasticsearch Basics","content": "Elasticsearch is a distributed search engine."
    }
    
    上述请求向my_index索引中插入一条文档,文档的ID是1,内容是titlecontent字段。
3.2. 确定目标索引和文档ID
  • 目标索引:请求中指定了文档要存入的索引(如my_index)。
  • 文档ID:如果请求中指定了ID(如上例中的1),Elasticsearch会使用该ID;如果没有指定,Elasticsearch会自动生成一个唯一的ID。
3.3. 路由和分片
  • Elasticsearch使用路由来决定将文档存储到哪个分片(Shard)。路由通常是基于文档的ID来进行计算的,默认情况下,Elasticsearch会通过MD5哈希算法对文档ID进行处理,并将结果映射到分片。
  • 这个过程确保文档在集群中的分布是均衡的。
3.4. 文档分析(Analyzing)
  • 文档中的文本字段会经过分析过程。Elasticsearch使用**分析器(Analyzer)**来将文本字段分解成多个“词条”(terms)。这些词条会用于索引和查询。
    • 分析器由字符过滤器(Character Filter)、**分词器(Tokenizer)词项过滤器(Token Filter)**组成。
    • 例如,文本"Elasticsearch Basics"会被分解为两个词条:elasticsearchbasics
  • 分析器的选择通常是在创建索引时配置的,默认分析器通常是standard分析器。
3.5. 创建Lucene文档
  • 分析后的词条会被存储为Lucene文档的倒排索引(Inverted Index)的一部分。Lucene倒排索引将每个词条映射到包含该词条的文档ID列表中。
  • 这些词条在Elasticsearch中是可以搜索的关键元素。
3.6. 存储原始文档(_source字段)
  • 在索引文档时,Elasticsearch通常会将原始的JSON文档(即_source字段)存储起来。这样,当进行搜索时,用户可以检索到原始数据。
  • _source字段是文档的原始内容,不经过分析和转换,保留完整的原始结构。
3.7. 分配文档到分片
  • 文档经过路由后被分配到集群中的某个具体的分片(Shard)。分片的数量在创建索引时设置,并且每个分片可以被多个节点(Node)存储。
  • 每个文档的倒排索引会被存储在Lucene的分片索引中。
3.8. 更新和刷新
  • Elasticsearch的倒排索引是通过写入**事务日志(translog)**来进行更新的,事务日志确保了写操作的可靠性。在写入后,数据不会立即对外可见。
  • **刷新(refresh)**操作将事务日志的数据更新到倒排索引中,使得索引变得可搜索。
    • 刷新是定期进行的,但也可以通过_refreshAPI手动触发。
  • 每个分片会有一个独立的刷新周期,通常会在每个分片每隔一段时间进行一次刷新。
3.9. 成功索引
  • 当文档成功被索引后,Elasticsearch返回一个响应,告知用户索引成功。
  • 响应通常包含文档ID、索引名称、分片位置和版本号等信息。

      

{"_index": "my_index","_id": "1","_version": 1,"_shards": {"total": 1,"successful": 1,"failed": 0},"result": "created","_seq_no": 0,"_primary_term": 1
}
3.10. 数据的最终存储
  • 文档经过索引和刷新后,它的倒排索引和原始文档(_source)数据被持久化存储。
  • Elasticsearch会定期清理无用的文档和版本,通过合并(merge)过程来减少索引的碎片。

4. 索引的状态

  • 索引文档后的数据会进入搜索引擎的活跃状态。用户可以通过查询(search)请求来检索这些文档。
  • 如果在文档索引后有更新操作(如updatedelete),Elasticsearch会根据文档ID来执行这些操作,而这些操作最终会更新倒排索引。

总结

Elasticsearch索引文档的过程包括以下主要步骤:

  1. 接收索引请求。
  2. 确定目标索引和文档ID。
  3. 计算路由,将文档分配到对应的分片。
  4. 对文档中的文本字段进行分析,生成倒排索引。
  5. 存储原始文档(_source字段)。
  6. 执行更新和刷新操作,使文档可以被搜索。
  7. 最终,文档存储在索引的分片中,等待查询。

这些步骤结合了数据分片、路由、分析、索引和存储,确保Elasticsearch能够高效地存储和查询海量数据。


http://www.ppmy.cn/ops/135257.html

相关文章

探索 HTML 和 CSS 实现的 3D旋转相册

效果演示 这段HTML与CSS代码创建了一个包含10张卡片的3D旋转效果&#xff0c;每张卡片都有自己的边框颜色和图片。通过CSS的3D变换和动画&#xff0c;实现了一个动态的旋转展示效果 HTML <div class"wrapper"><div class"inner" style"-…

k8s默认使用的后端网络模式

1. CNI简介 在 Kubernetes (K8s) 中,网络后端(CNI 插件)负责为集群中的容器提供网络连接。Kubernetes 默认并没有选择特定的 CNI 插件,而是允许用户根据需求选择使用不同的网络插件。 不过,Kubernetes 通过 kubeadm 或其他工具来初始化集群时,会使用某个默认的网络后端,…

Qt5-雷达项目

界面: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QTimer> #include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget(); pr…

【数据结构】【线性表】静态链表(附C语言源码)

静态链表 链表是物理结构为链式的线性表&#xff0c;其每个结点的存储位置不一定是连续的&#xff0c;每个结点依靠结点元素的中的指针线性相连。但有时候为了方便管理内存空间&#xff0c;会将链表的各个结点存储空间放在一块&#xff0c;其实现方式类似于数组&#xff0c;只…

【Java Web】Ajax 介绍及 jQuery 实现

文章目录 AJAX介绍XMLHttpRequestjQuery实现Ajax$.ajax()$().load()$.get()$.post() AJAX介绍 AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种创建高效、动态网页应用的网页开发技术。它允许在不重新加载整个页面的情况下进行异步数据更新和交互&#xf…

Linux debian系统安装ClamTk开源图形用户界面(GUI)杀毒软件

一、ClamTk简介 ClamTk 是一个基于 ClamAV 的开源图形用户界面&#xff08;GUI&#xff09;杀毒软件。它使用 GTK2-Perl 脚本构建而成&#xff0c;支持32位与64位操作系统。ClamTk 提供了一个直观的用户界面&#xff0c;使得用户无需深入了解命令行即可完成大部分操作。它具备…

如何将电位器的三个引脚接起来

电位器&#xff08;Potentiometer&#xff09;是一种常见的可调电阻元件&#xff0c;通常用于调节电流或电压&#xff0c;它有三个引脚&#xff0c;其中两个外引脚是连接电源的&#xff0c;而中间引脚通常用于输出可调的电压。下面是电位器三个引脚的连接方式&#xff1a; 电位…

Django的RBAC认证和权限

1.认证 import jwt from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions import AuthenticationFailed from rbac import settingsclass User(object):def __init__(self, id, username, role, exp):self.id idself.username use…