0%

elasticsearch简介

Elasticsearch 简介:分布式搜索引擎的核心架构与概念

Elasticsearch(简称 ES)是基于 Lucene 的分布式开源搜索引擎,它封装了 Lucene 的复杂性,通过简单的 RESTful API 提供高效的全文检索、分析和存储能力。广泛应用于日志分析、电商搜索、实时监控等场景。本文将详细解析其核心概念、架构设计及数据模型。

核心概念解析

文档(Document)

  • 定义:ES 中最小的数据单元,类似关系型数据库中的 “一行记录”,以 JSON 格式存储。
  • 特点:
    • 每个文档有唯一 ID(可自动生成或手动指定)。
    • 文档字段支持多种类型(文本、数字、日期、数组等),且会被索引以支持检索。
  • 示例:一篇博客文章的文档可能包含 title(标题)、content(内容)、publish_time(发布时间)等字段。

类型(Type)

  • 历史角色:早期设计中,类型用于对索引内的文档进行逻辑分类(类似关系型数据库的 “表”)。
  • 现状:
    • ES 6.x 中限制每个索引只能有 1 个类型。
    • ES 7.x 及以上彻底移除类型,仅保留默认类型 _doc
  • 移除原因:
    • 不同类型的文档在物理存储上并未分离(同属一个 Lucene 索引),可能导致字段冲突(如同一字段在不同类型中类型不同)。
    • 与 Lucene 模型冲突:Lucene 索引本质是 “文档集合”,类型的划分增加了复杂度,不符合分布式存储逻辑。

索引(Index)

  • 定义:具有相似特征的文档集合(类似关系型数据库的 “数据库”),如 “商品索引”“用户日志索引”。
  • 命名规则:小写字母,可包含数字和连字符(如 product_indexuser-logs-2024)。
  • 核心特性:
    • 索引是逻辑概念,物理上由多个分片(Shard)组成。
    • 支持动态映射(自动推断字段类型)和显式映射(手动定义字段类型)。

节点(Node)

  • 定义:运行 ES 实例的单台服务器,是集群的基本组成单元。
  • 节点类型(通过配置指定):
    • 主节点(Master Node):负责集群元数据管理(如索引创建、分片分配),默认每个节点都可竞选主节点。
    • 数据节点(Data Node):存储数据分片,处理索引和搜索请求。
    • 协调节点(Coordinating Node):接收客户端请求,分发任务并合并结果(默认所有节点都是协调节点)。
    • ingest 节点 :预处理数据(如过滤、转换)后再写入索引。

集群(Cluster)

  • 定义:由多个节点组成的集合,节点通过相同的 cluster.name 标识归属(默认 elasticsearch)。
  • 核心功能:
    • 分布式存储:数据分散在多个节点,支持水平扩展。
    • 高可用:通过副本分片实现故障转移。
    • 协同工作:节点间自动同步元数据,共同处理索引和搜索请求。
  • 集群健康状态:
    • 绿色:所有主分片和副本分片均正常可用。
    • 黄色:主分片正常,但至少一个副本分片不可用(集群可用,但高可用降级)。
    • 红色:至少一个主分片不可用(部分数据无法访问,集群功能受限)。

分片(Shards)

  • 定义:索引的物理拆分单元,每个分片是一个独立的 Lucene 索引,可分布在不同节点。
  • 类型:
    • 主分片(Primary Shard):索引创建时指定数量(默认 1 个),不可修改,负责数据写入。
    • 副本分片(Replica Shard):主分片的备份,可动态调整数量(默认 1 个),负责数据读取和故障转移。
  • 作用:
    • 水平扩展:通过增加主分片数量(需提前规划)提升存储和写入能力。
    • 并行处理:搜索请求可在多个分片上并行执行,提高吞吐量。

副本(Replicas)

  • 定义:主分片的拷贝,用于提供高可用和负载均衡。
  • 特性:
    • 副本分片不能与主分片在同一节点(避免单点故障)。
    • 支持动态调整数量(如通过 update-index-settings API 增加副本)。
  • 作用:
    • 故障恢复:主分片故障时,副本可晋升为新主分片。
    • 分担读压力:搜索请求可分发到副本,提高查询吞吐量。

数据模型:与关系型数据库的对比

ES 的数据模型与关系型数据库有显著差异,核心是 “面向文档” 而非 “面向表”:

关系型数据库 Elasticsearch 说明
数据库(DB) 索引(Index) 存储相似文档的集合
表(Table) (已移除)类型(Type) 原用于逻辑分类,现通过索引区分
行(Row) 文档(Document) 最小数据单元,JSON 格式
列(Column) 字段(Field) 文档的属性,支持多种数据类型
主键(PK) 文档 ID(_id 唯一标识文档,可自动生成或手动指定
索引(Index) 倒排索引(Inverted Index) ES 自动为字段构建,支持高效全文检索

倒排索引:ES 检索的核心

ES 基于 Lucene 的倒排索引实现高效检索,倒排索引存储以下关键信息:

  • 词项(Term):文档分词后得到的关键词(如 “elasticsearch”“分布式”)。
  • 文档 ID 列表:包含该词项的所有文档 ID。
  • 词频(TF):词项在文档中出现的次数(影响相关性评分)。
  • 位置(Position):词项在文档中的分词位置(支持短语查询,如 “分布式 搜索引擎” 需相邻出现)。
  • 偏移(Offset):词项在原始文本中的起止字符位置(支持搜索结果高亮显示)。

示例
文档 1 内容:“Elasticsearch 是分布式搜索引擎”
文档 2 内容:“Elasticsearch 基于 Lucene”
倒排索引中 “Elasticsearch” 对应的条目为:

1
Elasticsearch → [(文档1, 词频=1, 位置=0), (文档2, 词频=1, 位置=0)]

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10