忘机山人
> 本章导读:本章将介绍 Elasticsearch 的发展历史、核心特性、与其他搜索引擎的对比,以及典型的应用场景,帮助读者建立对 Elasticsearch 的整体认识。
https://appstore.lazycat.cloud/#/shop/detail/xu.deploy.elasticsearch

## 目录
- [什么是 Elasticsearch](#什么是-elasticsearch)
- [发展历史与版本演进](#发展历史与版本演进)
- [核心特性](#核心特性)
- [与其他搜索引擎对比](#与其他搜索引擎对比)
- [典型应用场景](#典型应用场景)
- [本章小结](#本章小结)
- [练习题](#练习题)
- [参考资料](#参考资料)
## 什么是 Elasticsearch
Elasticsearch 是一个基于 Apache Lucene 构建的开源、分布式、RESTful 风格的搜索和数据分析引擎。它能够快速地存储、搜索和分析海量数据,通常在毫秒级别内返回搜索结果。
### 核心定位
- **搜索引擎**:提供全文搜索、结构化搜索、地理位置搜索等多种搜索能力
- **分析引擎**:支持复杂的聚合分析,可用于日志分析、业务指标分析等场景
- **数据存储**:作为 NoSQL 数据库使用,支持 JSON 文档的存储和检索
### 为什么选择 Elasticsearch
1. **近实时搜索**:文档索引后约 1 秒即可被搜索到
2. **分布式架构**:天然支持水平扩展,可处理 PB 级数据
3. **高可用性**:通过副本机制保证数据安全和服务可用
4. **RESTful API**:简单易用的 HTTP 接口,支持多种编程语言
5. **丰富的生态**:与 Kibana、Logstash、Beats 等组成完整的 Elastic Stack
## 发展历史与版本演进
### 起源与发展
| 时间 | 里程碑 |
|------|--------|
| 2010年2月 | Shay Banon 发布 Elasticsearch 0.4 版本 |
| 2012年 | Elastic 公司成立 |
| 2014年 | 发布 1.0 版本,标志着产品成熟 |
| 2015年 | 发布 2.0 版本,引入 Pipeline Aggregations |
| 2016年 | 发布 5.0 版本(跳过 3.x/4.x 与 ELK 版本统一) |
| 2017年 | 发布 6.0 版本,移除 mapping types |
| 2019年 | 发布 7.0 版本,默认单 type,引入新集群协调层 |
| 2021年 | 发布 8.0 版本,默认启用安全特性 |
| 2023年 | 8.x 持续迭代,增强向量搜索和 AI 能力 |
### 主要版本特性
#### Elasticsearch 7.x 主要特性
- 移除 mapping types,每个索引只有一个 type(`_doc`)
- 新的集群协调层,提升大规模集群稳定性
- 引入 High Level REST Client 作为推荐客户端
- 默认分片数从 5 改为 1
- 引入 ILM(索引生命周期管理)
#### Elasticsearch 8.x 主要特性
- 默认启用安全特性(TLS、认证)
- 原生向量搜索(kNN)支持
- 新的 Java API Client 替代 High Level REST Client
- 改进的 Lucene 9 支持
- 增强的机器学习和 NLP 能力
### 版本选择建议
| 场景 | 推荐版本 |
|------|----------|
| 新项目 | 8.x 最新稳定版 |
| 已有 7.x 项目 | 评估升级到 8.x |
| 对安全要求高 | 8.x(默认安全) |
| 需要向量搜索 | 8.x |
## 核心特性
### 1. 分布式架构
```
┌─────────────────────────────────────────────────────────┐
│ Elasticsearch 集群 │
├─────────────────┬─────────────────┬─────────────────────┤
│ Node 1 │ Node 2 │ Node 3 │
│ ┌───────────┐ │ ┌───────────┐ │ ┌───────────┐ │
│ │ Shard P0 │ │ │ Shard P1 │ │ │ Shard P2 │ │
│ │ Shard R1 │ │ │ Shard R2 │ │ │ Shard R0 │ │
│ └───────────┘ │ └───────────┘ │ └───────────┘ │
└─────────────────┴─────────────────┴─────────────────────┘
P = Primary Shard(主分片) R = Replica Shard(副本分片)
```
- **自动分片**:数据自动分布到多个节点
- **自动路由**:请求自动路由到正确的分片
- **自动恢复**:节点故障时自动重新分配分片
### 2. 全文搜索
基于 Lucene 的强大全文搜索能力:
```json
// 示例:全文搜索
GET /products/_search
{
"query": {
"match": {
"description": "高性能 搜索引擎"
}
}
}
```
### 3. 实时分析
强大的聚合分析能力:
```json
// 示例:按类别统计商品数量
GET /products/_search
{
"size": 0,
"aggs": {
"category_count": {
"terms": {
"field": "category.keyword"
}
}
}
}
```
### 4. 高可用与容错
- **副本机制**:每个主分片可配置多个副本
- **自动故障转移**:主分片不可用时,副本自动提升
- **跨集群复制**:支持多数据中心部署
### 5. Schema Free
- 支持动态映射,无需预定义 schema
- 也支持显式映射,精确控制字段类型
## 与其他搜索引擎对比
### Elasticsearch vs Solr
| 特性 | Elasticsearch | Solr |
|------|---------------|------|
| 基础 | Lucene | Lucene |
| 分布式 | 原生支持 | 需要 SolrCloud |
| 配置 | JSON/YAML | XML |
| API | RESTful | RESTful + SolrJ |
| 实时搜索 | 近实时(~1秒) | 近实时 |
| 学习曲线 | 较平缓 | 较陡峭 |
| 社区活跃度 | 非常活跃 | 活跃 |
| 适用场景 | 日志分析、全文搜索 | 传统企业搜索 |
### Elasticsearch vs 关系型数据库
| 特性 | Elasticsearch | MySQL/PostgreSQL |
|------|---------------|------------------|
| 数据模型 | 文档(JSON) | 表(行列) |
| 查询语言 | Query DSL | SQL |
| 全文搜索 | 原生支持,功能强大 | 有限支持 |
| 聚合分析 | 非常强大 | 支持,但复杂查询较慢 |
| 事务支持 | 不支持 ACID | 完整支持 |
| 关联查询 | 有限支持 | 强大的 JOIN |
| 扩展性 | 水平扩展容易 | 垂直扩展为主 |
### Elasticsearch vs MongoDB
| 特性 | Elasticsearch | MongoDB |
|------|---------------|---------|
| 定位 | 搜索和分析引擎 | 通用文档数据库 |
| 全文搜索 | 核心功能,非常强大 | 支持,但功能有限 |
| 聚合 | 非常强大 | 强大 |
| 事务 | 不支持 | 支持(4.0+) |
| 实时性 | 近实时(~1秒) | 实时 |
| 适用场景 | 搜索、日志、分析 | 通用数据存储 |
### 选型建议
```
┌─────────────────────────────────────────────────────────┐
│ 选型决策树 │
├─────────────────────────────────────────────────────────┤
│ │
│ 需要全文搜索? ──Yes──> Elasticsearch │
│ │ │
│ No │
│ │ │
│ 需要复杂聚合分析? ──Yes──> Elasticsearch │
│ │ │
│ No │
│ │ │
│ 需要 ACID 事务? ──Yes──> 关系型数据库 │
│ │ │
│ No │
│ │ │
│ 需要灵活 Schema? ──Yes──> MongoDB │
│ │
└─────────────────────────────────────────────────────────┘
```
## 典型应用场景
### 1. 日志分析(ELK Stack)
最经典的应用场景,使用 Elasticsearch + Logstash + Kibana 构建日志分析平台:
```
┌─────────┐ ┌──────────┐ ┌───────────────┐ ┌────────┐
│ 应用 │───>│ Filebeat │───>│ Logstash │───>│ ES │
│ 日志 │ │ │ │ (解析/转换) │ │ │
└─────────┘ └──────────┘ └───────────────┘ └────┬───┘
│
┌────▼───┐
│ Kibana │
│ (可视化)│
└────────┘
```
**应用价值**:
- 集中管理分布式系统日志
- 快速定位问题和异常
- 实时监控系统状态
- 支持复杂的日志查询和分析
### 2. 全文搜索
为网站或应用提供搜索功能:
```json
// 电商商品搜索示例
GET /products/_search
{
"query": {
"bool": {
"must": [
{ "match": { "name": "iPhone" } }
],
"filter": [
{ "term": { "category": "手机" } },
{ "range": { "price": { "gte": 5000, "lte": 10000 } } }
]
}
},
"highlight": {
"fields": { "name": {} }
}
}
```
**应用场景**:
- 电商商品搜索
- 内容管理系统
- 知识库搜索
- 站内搜索
### 3. 业务数据分析
利用聚合功能进行业务指标分析:
```json
// 按天统计销售额
GET /orders/_search
{
"size": 0,
"aggs": {
"daily_sales": {
"date_histogram": {
"field": "order_date",
"calendar_interval": "day"
},
"aggs": {
"total_amount": {
"sum": { "field": "amount" }
}
}
}
}
}
```
**应用场景**:
- 销售数据分析
- 用户行为分析
- 实时大屏展示
- BI 报表
### 4. 安全分析(SIEM)
使用 Elastic Security 进行安全事件分析:
**应用场景**:
- 安全日志分析
- 威胁检测
- 合规审计
- 入侵检测
### 5. APM(应用性能监控)
使用 Elastic APM 监控应用性能:
**应用场景**:
- 分布式链路追踪
- 性能瓶颈分析
- 错误监控
- 服务依赖分析
### 6. 地理位置服务
利用地理位置查询能力:
```json
// 查找附近 5km 内的门店
GET /stores/_search
{
"query": {
"geo_distance": {
"distance": "5km",
"location": {
"lat": 39.9042,
"lon": 116.4074
}
}
}
}
```
**应用场景**:
- 附近门店搜索
- 外卖配送范围
- 打车服务
- 地理围栏
## 本章小结
本章介绍了 Elasticsearch 的基础知识:
1. **定位**:Elasticsearch 是一个分布式搜索和分析引擎,基于 Lucene 构建
2. **历史**:从 2010 年发布至今,已发展到 8.x 版本,功能不断完善
3. **特性**:分布式架构、全文搜索、实时分析、高可用是其核心特性
4. **对比**:相比 Solr 更易用,相比数据库搜索能力更强,与 MongoDB 定位不同
5. **场景**:日志分析、全文搜索、数据分析、安全分析、APM、地理位置服务
## 参考资料
- [Elasticsearch 官方文档](https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html)
- [Elasticsearch: The Definitive Guide](https://www.elastic.co/guide/en/elasticsearch/guide/current/index.html)
- [Elastic 官方博客](https://www.elastic.co/blog/)
- [Elasticsearch GitHub 仓库](https://github.com/elastic/elasticsearch)
评论
0暂无评论