ITPub博客

首页 > 数据库 > 数据库开发技术 > Elasticsearch 的索引结构

Elasticsearch 的索引结构

原创 数据库开发技术 作者:IT枫斗者 时间:2024-11-21 18:08:59 0 删除 编辑


Elasticsearch 是基于 倒排索引(Inverted Index)原理构建的全文搜索引擎,采用分布式架构来存储和检索大规模的数据。它的索引结构由多个重要的组成部分构成,每个部分都有其特定的角色和功能。

以下是 Elasticsearch 索引结构的主要组成部分及其功能:


1. 索引(Index)

索引是 Elasticsearch 中数据的逻辑组织单位,类似于关系数据库中的数据库(Database)。每个索引都可以包含多个文档,并且由多个分片组成。一个索引包含了所有类型的数据,并且可以定义映射(mapping)来确定文档字段的数据类型和索引方式。



索引名称:

在 Elasticsearch 中,索引是按名称来标识的,例如 log-2024-11-01。


索引设置(Settings):

用于定义索引的配置参数,如分片数(shards)、副本数(replicas)、分析器(analyzers)等。



2. 文档

(Document)

文档是 Elasticsearch 中存储的最基本单位,类似于关系数据库中的一行记录。每个文档都是一个 JSON 格式的数据结构,可以包含多个字段(fields)。文档是由多个字段(例如 title, content, date)组成的,字段是文档的具体数据。



文档 ID:

每个文档都有一个唯一的标识符,Elasticsearch 会自动生成一个 ID,或者用户可以手动指定。

字段(Field):

每个字段都有一个名称和值。字段的值可以是多种数据类型,如字符串、数字、日期等。



3. 分片

(Shard)

每个索引都会被分割成多个分片(Shard)。分片是 Elasticsearch 在物理存储层面上分散数据的基本单元。每个分片本质上是一个独立的 Lucene 索引,并且可以存储数据和进行搜索操作。



主分片(Primary Shard):

每个索引会有主分片,分片的数量在创建索引时就确定。主分片负责存储数据,并提供查询服务。

副本分片(Replica Shard):

为了提高高可用性和查询性能,每个主分片可以有多个副本分片。副本分片是主分片的备份,可以用于分担查询负载。



4. 倒排索引

(Inverted Index)

倒排索引是 Elasticsearch 用来快速查找文本数据的核心数据结构。与传统的顺序索引不同,倒排索引首先将文档中的每个词汇(或字段)映射到包含该词汇的文档 ID,从而支持快速全文检索。



词项(Term):

倒排索引的最基本元素是词项(term),即从文档中提取出来的唯一词汇(例如,单词、数字、日期等)。

倒排列表(Posting List):

每个词项会对应一个倒排列表,列表中包含了所有包含该词项的文档 ID。倒排列表的长度等于该词项出现的文档数。

倒排索引过程:

  • 分词:

文档的内容(例如文本字段)会被分词器(Analyzer)处理,将其拆分成多个词项。
  • 构建倒排索引:

将这些词项映射到包含这些词项的文档 ID。
  • 存储倒排索引:

倒排索引将词项和文档 ID 映射关系存储在内存中,并按需将其写入磁盘。


倒排索引的优势在于,它允许 Elasticsearch 在查找某个词时快速定位到包含该词的文档,从而大大提高查询速度。



5. 分片副本

(Shard Replication)

为了保证高可用性,Elasticsearch 会将每个主分片复制到多个副本分片。副本分片是主分片的备份,它们与主分片的数据相同,确保在主分片宕机时系统仍然能够提供服务。



副本分片的作用:

副本分片除了提供冗余备份外,还可以提高查询性能,因为查询可以同时在多个副本分片上并行执行。



6. 映射

(Mapping)

映射是 Elasticsearch 中的一个概念,定义了文档字段的名称和类型,并且规定了如何将字段的值转化成适合索引的格式。映射类似于关系数据库中的表结构定义。通过映射,可以控制字段的分析方式、是否存储、是否索引等属性。



字段类型(Field Type):

如 text, keyword, integer, date 等。

分析器(Analyzer):

用于处理字符串类型的字段数据,分析器会将文本数据分解成词项。

动态映射:

Elasticsearch 支持自动为文档字段创建映射,也可以通过手动定义来指定字段的映射。



7. 文档分配

(Document Routing)

文档会根据一定的规则被分配到某个分片上。默认情况下,Elasticsearch 使用文档的 _id 来计算哈希值并确定分片位置。这种方法保证了相同的文档总是存储在相同的分片上。



自定义路由(Custom Routing):

可以通过 routing 参数自定义文档路由策略,将文档按照业务规则分配到特定的分片。



8. 字段数据

(Field Data)

字段数据是 Elasticsearch 用来支持排序、聚合和脚本功能的内存结构。当需要对某个字段进行排序或者聚合时,Elasticsearch 会加载该字段的数据到内存中,这种结构通常称为字段数据(Field Data)。对于大量数据,字段数据的存储和加载是性能优化的关键。


9. 查询处理流程



当进行查询时,Elasticsearch 会执行以下步骤:


路由(Routing):

首先根据文档的 _id 或自定义的路由策略确定查询的分片。

倒排索引查找:

在选定的分片中,通过倒排索引快速查找匹配的文档 ID。

合并结果:

从多个分片中合并查询结果,返回最终的匹配文档。


10. 聚合

(Aggregation)

Elasticsearch 支持强大的聚合功能,可以在查询时对结果进行分组、统计、排序等操作。聚合的实现通常依赖于倒排索引和字段数据。聚合的类型包括:桶聚合(Bucket Aggregation)、指标聚合(Metric Aggregation)等。


总结

Elasticsearch 的索引结构基于倒排索引,并通过分片和副本来确保分布式存储和高可用性。索引包含多个文档,每个文档由多个字段组成。字段的内容经过分析器(Analyzer)处理,最终构成倒排索引的核心部分。通过分片、副本和映射等机制,Elasticsearch 提供了高效的查询、可靠的数据存储和高可用性。



关键组件:

索引:数据的逻辑容器。

文档:数据的基本存储单元。

倒排索引:支持高效查询的核心数据结构。

分片和副本:确保数据分布和冗余备份。





👋 大家好,我是枫哥,一名Java后端开发者!我热衷于探索新技术,并在我的微信公众号上分享关于Java 生态和后端开发的知识。欢迎关注我的公众号,期待与你一起探讨技术的无穷可能!” 目前专注于Java技术分享,覆盖春招、秋招、社招和跳槽相关内容,并提供一对一带徒学习服务。加入 学徒计划,即可享受内推机会和优质资源,签订协议确保就业无忧。此外,我们还推出了‘Java跳槽网’, 为你的求职之路提供全方位支持,助你快速找到理想工作


END


原文作者:IT枫斗者;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
大家好,我是枫哥,🌟阿里云技术专家、📝资深面试官、🌹Java跳蚤网课堂创始人。技术交流vx:itfdz666,拥有多年一线研发经验,曾就职过科大讯飞、美团网、平安等公司。看面试实战视频可以关注b站号:IT枫斗者–Java面试。需要看技术文章,可以关注CSDN:IT枫斗者。

注册时间:2020-05-13

  • 博文量
    183
  • 访问量
    81363