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 = 分布式 + 全文检索 + 实时分析 + 可视化

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

相关推荐
阿标在干嘛2 小时前
【功能全景实测】科力辰科技查新网:它如何试图覆盖科研业务全链条?
大数据·人工智能·科技
Elastic 中国社区官方博客2 小时前
使用 Elasticsearch 中的结构化输出创建可靠的 agents
大数据·人工智能·elk·elasticsearch·搜索引擎·ai·全文检索
AC赳赳老秦2 小时前
跨境电商决胜之道:基于深度数据分析的选品策略与库存优化
大数据·开发语言·人工智能·python·php·跨境电商·deepseek
zhangkaixuan4562 小时前
Paimon Action Jar 实现机制分析
java·大数据·flink·paimon·datalake
Simon_lca3 小时前
迈向绿色未来:全球手机品牌ESG实践深度剖析——聚焦供应链减排与零碳转型
大数据·人工智能·经验分享·智能手机·分类·制造
Sui_Network3 小时前
Sui 2025 年终回顾:Sui 技术栈篇
大数据·人工智能·科技·去中心化·区块链
浔川python社3 小时前
国内两大短视频平台遭黑灰产攻击事件
大数据·人工智能
大任视点3 小时前
米悦MIY:以科技赋能健康生活,打造高端生活家电新标杆
大数据·人工智能
G皮T3 小时前
【Elasticsearch】查询性能调优(六):track_total_hits 影响返回结果的相关性排序吗
大数据·数据库·elasticsearch·搜索引擎·全文检索·性能·opensearch