Elasticsearch(ES)的基本概念、架构及基本使用介绍

Elasticsearch(简称 ES )是一个开源的、分布式的、基于 Lucene 构建的 搜索与分析引擎,广泛用于全文检索、日志分析、实时监控、安全分析、推荐系统等场景。它以高性能、高可用、近实时(Near Real-Time)和水平扩展能力著称。


一、核心基础概念

1. 倒排索引(Inverted Index)

  • ES 的核心数据结构,将"词项 → 文档"的映射关系存储;
  • 例如:
    • 文档1: "apple banana"
    • 文档2: "banana cherry"
      → 倒排索引:
      apple → [1]
      banana → [1, 2]
      cherry → [2]
  • 支持快速关键词匹配、相关性排序(TF-IDF / BM25)。

2. 文档(Document)

  • ES 中的最小数据单元,是 JSON 格式 的键值对;

  • 类似关系型数据库中的"一行";

  • 示例:

    json 复制代码
    {
      "id": 1001,
      "title": "Elasticsearch入门",
      "content": "ES is a distributed search engine...",
      "publish_date": "2024-12-29"
    }

3. 索引(Index)

  • 逻辑命名空间,存放具有相似结构的文档集合;
  • 类似关系型数据库中的"表";
  • 一个索引可包含多个 分片(Shard),实现分布式存储。

⚠️ 注意:ES 7.x 起,一个索引只能有一种 mapping type(默认 _doc,不再支持多类型。


4. 分片(Shard)与副本(Replica)

概念 说明
Primary Shard(主分片) 数据写入的基本单元,索引创建时指定数量(不可变); 决定索引的最大扩容能力(如 3 主分片 → 最多 3 节点并行写入)。
Replica Shard(副本分片) 主分片的拷贝,用于: - 高可用 (主分片宕机,副本接管) - 读负载均衡 (查询可路由到副本) 数量可动态调整。

✅ 默认配置:1 主分片 + 1 副本(共 2 分片/索引)。


5. Mapping(映射)

  • 定义索引中字段的 数据类型索引方式

  • 类似数据库的"表结构";

  • 示例:

    json 复制代码
    {
      "mappings": {
        "properties": {
          "title": { "type": "text", "analyzer": "ik_max_word" },
          "views": { "type": "integer" },
          "publish_date": { "type": "date", "format": "yyyy-MM-dd" }
        }
      }
    }
  • 常见类型:text(全文检索)、keyword(精确匹配)、dateintegergeo_point 等。


6. Analyzer(分析器)

  • 将文本拆分为词项(Token)的过程;
  • 包含三部分:
    • Character Filter(字符过滤,如 HTML 标签去除)
    • Tokenizer(分词器,如 whitespace、standard)
    • Token Filter(词项过滤,如转小写、同义词、停用词)
  • 中文推荐:IK Analyzerjiebasmartcn

二、系统架构(分布式设计)

ES 是 Peer-to-Peer(P2P) 架构,无单点故障,主要角色如下:

1. 节点类型(Node Roles)

角色 功能 是否必须
Master-eligible Node 参与集群管理(创建/删除索引、分配分片) 至少 3 个(防脑裂)
Data Node 存储数据、执行 CRUD、聚合查询 必须
Coordinating Node 接收客户端请求,转发到 Data Node,合并结果 所有节点默认具备
Ingest Node 预处理数据(如解析 JSON、转换字段) 可选
ML Node 运行机器学习任务(X-Pack 功能) 可选

💡 生产建议:角色分离(专用 Master + 专用 Data),避免资源竞争。


2. 集群(Cluster)与发现机制

  • 多个节点组成一个 Cluster ,通过 Zen Discovery (7.x 后改用 Coordinator + Cluster State)自动发现彼此;
  • 集群状态(Cluster State)包含:索引元数据、分片分配、节点信息等;
  • 通过 Gossip 协议 同步状态。

3. 数据写入流程(Indexing)

  1. 客户端向任意节点发送写请求;
  2. 该节点作为 Coordinating Node ,根据 _id 计算目标 Primary Shard
  3. 请求转发到 Primary Shard 所在 Data Node;
  4. Primary Shard 写入成功后,并行转发到所有 Replica Shards;
  5. 全部成功 → 返回客户端 OK。

⏱️ 近实时(NRT) :文档写入后 1 秒内 可被搜索(refresh 机制)。


4. 数据读取流程(Search)

  1. 客户端发送查询请求;
  2. Coordinating Node 广播请求到 所有相关分片(Primary 或 Replica)
  3. 各分片本地执行查询,返回局部结果(含排序得分);
  4. Coordinating Node 合并结果,全局排序后返回。

三、基本用法(RESTful API)

ES 提供 HTTP/JSON 接口,兼容任何语言调用。

1. 创建索引(带 Mapping)

bash 复制代码
PUT /blog
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "title": { "type": "text" },
      "author": { "type": "keyword" },
      "content": { "type": "text" },
      "publish_time": { "type": "date" }
    }
  }
}

2. 写入文档

bash 复制代码
# 自动生成 ID
POST /blog/_doc
{
  "title": "ES 入门指南",
  "author": "张三",
  "content": "Elasticsearch 是一个分布式搜索引擎...",
  "publish_time": "2024-12-29"
}

# 指定 ID(支持 Upsert)
PUT /blog/_doc/1001
{
  "title": "ES 高级用法",
  "author": "李四",
  "content": "...",
  "publish_time": "2024-12-30"
}

3. 查询文档

全文检索(Match Query)
bash 复制代码
GET /blog/_search
{
  "query": {
    "match": {
      "content": "搜索引擎"
    }
  }
}
精确匹配(Term Query)
bash 复制代码
GET /blog/_search
{
  "query": {
    "term": {
      "author": "张三"
    }
  }
}
范围查询 + 排序
bash 复制代码
GET /blog/_search
{
  "query": {
    "range": {
      "publish_time": {
        "gte": "2024-12-01",
        "lte": "2024-12-31"
      }
    }
  },
  "sort": [
    { "publish_time": { "order": "desc" } }
  ]
}
聚合分析(Aggregation)
bash 复制代码
GET /blog/_search
{
  "size": 0,
  "aggs": {
    "authors": {
      "terms": { "field": "author", "size": 10 }
    },
    "daily_views": {
      "date_histogram": {
        "field": "publish_time",
        "calendar_interval": "day"
      }
    }
  }
}

4. 更新文档

bash 复制代码
POST /blog/_update/1001
{
  "doc": {
    "views": 100
  }
}

5. 删除文档或索引

bash 复制代码
# 删除文档
DELETE /blog/_doc/1001

# 删除整个索引
DELETE /blog

四、典型应用场景

场景 说明
站内搜索 电商商品搜索、内容平台文章检索
日志分析 ELK Stack(Elasticsearch + Logstash + Kibana)
APM 监控 应用性能指标(吞吐量、错误率)可视化
安全分析(SIEM) 异常登录、网络攻击检测
地理围栏 geo_distance 查询附近 POI

五、优势与局限

✅ 优势

  • 分布式天然支持:开箱即用的集群能力;
  • 近实时搜索:1 秒内可见新数据;
  • 丰富的查询 DSL:支持布尔、模糊、范围、聚合等;
  • 生态完善:Kibana(可视化)、Logstash/Beats(数据采集)、Machine Learning(异常检测)。

❌ 局限

  • 不支持事务:非 ACID,不适合强一致性场景;
  • 写入吞吐 vs 查询延迟权衡:高写入需调大 refresh_interval;
  • 内存敏感:JVM Heap 建议 ≤ 32GB(避免 GC 停顿);
  • 复杂 Join 性能差:推荐宽表或应用层关联。

六、生产部署建议

  • 硬件:SSD 存储、64GB+ 内存、万兆网络;
  • JVM:Heap ≤ 32GB,禁用 Swap;
  • 分片策略:单分片 ≤ 50GB,避免过多小分片;
  • 监控:集成 Prometheus + Elasticsearch Exporter;
  • 备份:使用 Snapshot API 定期备份到 S3/HDFS。

总结

Elasticsearch = 分布式 + 全文检索 + 实时分析 + 可视化

它是现代数据栈中不可或缺的组件,尤其适合 "写多查快" 的场景。虽然不能替代关系型数据库,但在搜索、日志、监控等领域几乎成为事实标准。

相关推荐
pingao14137817 小时前
太阳总辐射传感器:能源、气象领域的关键测量工具
大数据·能源
百***787518 小时前
Grok-4.1技术深度解析:双版本架构突破与Python API快速集成指南
大数据·python·架构
Francek Chen19 小时前
【大数据基础】大数据处理架构Hadoop:01 Hadoop概述
大数据·hadoop·分布式·架构
互联网科技看点20 小时前
诸葛io获认可:金融分析智能体赛道领航者
大数据·人工智能·金融
2301_8002561121 小时前
全球气候与环境变化考试知识点梳理(1)
大数据·人工智能
edisao21 小时前
六、 读者高频疑问解答 & 架构价值延伸
大数据·开发语言·人工智能·科技·架构·php
-大头.21 小时前
GIT教程系列(共3篇)---------第二篇:Git高级协作与团队实战完全指南
大数据·git·elasticsearch
北京地铁1号线1 天前
2.2 向量数据库
数据库·elasticsearch·milvus·faiss·向量数据库·hnsw
HXDGCL1 天前
大会观察 | 破除创新链堵点:论“工厂直供”模式如何加速自动化核心部件迭代
大数据·人工智能·自动化·自动化生产线·环形导轨
五度易链-区域产业数字化管理平台1 天前
五度易链企业数据服务架构思考:从“存数据”到“用数据”的全周期解决方案
大数据·人工智能·架构