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

大家好,我是锋哥。今天分享关于【详细描述一下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.mzph.cn/web/60463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot学习记录(六)配置文件参数化

SpringBoot学习记录(六)配置文件参数化 一、参数提取到配置文件中二、yml配置文件三、ConfigurationProperties注解实现批量属性注入 一、参数提取到配置文件中 定义在代码中的参数的值分散在各个不同的文件中,不便于后期维护管理&#xff0…

# ubuntu 安装的pycharm不能输入中文的解决方法

ubuntu 安装的pycharm不能输入中文的解决方法 一、问题描述: 当在 ubuntu 系统中,安装了 pycharm(如:pycharm2016, 或 pycharm2018),打开 pycharm 输入代码时,发现不能正常输入中文,安装的搜狗…

NLP论文速读(CVPR 2024)|使用DPO进行diffusion模型对齐

论文速读|Diffusion Model Alignment Using Direct Preference Optimization 论文信息: 简介: 本文探讨的背景是大型语言模型(LLMs)通过人类比较数据和从人类反馈中学习(RLHF)的方法进行微调,以…

Git 提交的相对引用

Git 提交的相对引用 在 Git 中,使用 ~ 和 ^ 符号可以帮助你更灵活地引用提交历史中的特定提交。以下是这些符号的具体用法和示例: 1. ~(波浪号) ~ 符号用于指向上一个或多个父提交。它总是沿着第一个父提交的链向上追溯。 HEA…

<OS 有关> ubuntu 24 不同版本介绍 安装 Vmware tools

原因 想用 apt-get download 存到本地 / NAS上,减少网络流浪。 看到 VMware 上的确实有 ubuntu,只是版本是16。 ubuntu 版本比较:LTS vs RR LTS: Long-Term Support 长周期支持, 一般每 2 年更新,会更可靠与更稳定…

泛微E9与金蝶云星空的集成方案:实现审批流程与财务管理的无缝对接

泛微E9与金蝶云星空的集成方案:实现审批流程与财务管理的无缝对接 背景介绍: 在企业日常运营中,泛微OA-E9和金蝶云星空是两个关键的系统。泛微OA-E9是一款广受企业青睐的办公自动化软件,它通过流程管理、文档管理、协同办公等模…

一、Docker 安装集

一、Docker CentOS https://docs.docker.com/engine/install/centos/ 在 CentOS 上安装 Docker Engine # Docker要求CentOS系统的内核版本高于3.10:# Docker从1.13版本之后,采用时间线的方式作为版本号: 1. 分为社区版CE和企业版EE。 2. 社…

Python Selenium:Web自动化测试与爬虫开发

Python Selenium:Web自动化测试与爬虫开发 Python Selenium:Web自动化测试与爬虫开发安装Selenium设置WebDriver基础示例页面元素交互处理JavaScript和Cookies浏览器控制屏幕截图Headless Mode结束会话错误处理与调试 ***本文由AI辅助生成*** Python Se…

Redis最终篇分布式锁以及数据一致性

在前三篇我们几乎说完了Redis的所有的基础知识以及Redis怎么实现高可用性,那么在这一篇文章中的话我们主要就是说明如果我们使用Redis出现什么问题以及解决方案是什么,这个如果在未来的工作中也有可能会遇到,希望对看这篇博客的人有帮助,话不多说直接开干 一.Hotkey以及BigKey…

「Mac玩转仓颉内测版28」基础篇8 - 元组类型详解

本篇将介绍 Cangjie 中的元组类型,包括元组的定义、创建、访问、数据解构以及应用场景,帮助开发者掌握元组类型的使用。 关键词 元组类型定义元组创建元组访问数据解构应用场景 一、元组类型概述 在 Cangjie 中,元组是一种用于存储多种数据…

Golang语言系列-Channel

Golang语言系列-Channel 源码分析结构体定义和构造函数发送操作接受操作关闭操作select 操作 实验参考 golang里的channel信道是golang里一个独特的概念,基于消息通信的方式来实现并发控制。信道有两种类型,缓存型和非缓存型,其中缓冲型底层基…

面试题---深入源码理解MQ长轮询优化机制

引言 在分布式系统中,消息队列(MQ)作为一种重要的中间件,广泛应用于解耦、异步处理、流量削峰等场景。其中,延时消息和定时消息作为MQ的高级功能,能够进一步满足复杂的业务需求。为了实现这些功能&#xf…

GPT中转站技术架构

本文介绍阿波罗AI中转站(https://api.ablai.top/)的技术架构,该中转API的技术架构采用了分布式架构、智能调度和API中转等技术,确保了全球范围内的高效访问和稳定运行。以下是对该技术架构的详细分析: 分布式架构 分…

【强化学习的数学原理】第02课-贝尔曼公式-笔记

学习资料:bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接:强化学习的数学原理 西湖大学 赵世钰 文章目录 一、为什么return重要?如何计算return?二、state value的定义三、Bellman公式的详细推导四、公式向量形式…

[less] Operation on an invalid type

我这个是升级项目的时候遇到的,要从 scss 升级到 less,然后代码中就报了这个错误 我说一下代码的错误过程,但是这里没有复现,因为我原本报错的代码要复杂很多,而且是公司代码,不方便透露,这是我…

ssm面向品牌会员的在线商城小程序

摘要 随着Internet的发展,人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化,网络化和电子化。它将是直接管理面向品牌会员的在线商城小程序的最新形式。本小程序是以面向品牌会员的在线商城管理为目标,使用 java技术制…

spring-logback引用外部文件

背景 在spring微服务开发和云部署中,都涉及到日志的收集,很多时候为例方便管理和开发,很多公司都会开发一些基础配置代码。其中日志就是很重要的部分, 为了方便部署、收集、查看,所以日志文件需要存储在同一个…

.NET周刊【11月第3期 2024-11-17】

国内文章 .NET 9使用Scalar替代Swagger https://www.cnblogs.com/netry/p/18543378/scalar-an-alternative-to-swagger-in-dotnet-9 .NET 9 移除了 Swashbuckle.AspNetCore,因为其维护不力,并转向 Microsoft.AspNetCore.OpenApi。除了 Swashbuckle&am…

国土变更调查拓扑错误自动化修复工具的研究

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 一、拓扑错误的形成原因 1.边界不一致 2.不规则图形 3.尖锐角 4.局部狭长 5.细小碎面 6.更新层相互重叠 二、修复成果展示 1.边界不一致 2.不规则图形 3.尖锐角 4.局部狭…

react 使用中注意事项提要

1、尽可能的减少数组index作为key,数组中插入元素的等操作时,会使得效率底下; 2、如果在 JSX 中给元素添加类, 需要使用 className 代替 class;类似:label 的 for属性,使用htmlFor代替; 3、在…