Elasticsearch 服务器一共包含哪些部分?一共包含哪些部分?使用场景是什么?底层原理是什么?
1. Elasticsearch 服务器包含哪些部分?
(1) 核心组成部分
-
节点(Node)
像城堡里的“管理员”,负责存储数据和处理请求。- 主节点(Master Node):像“城堡国王”,负责管理所有节点和集群状态。
- 数据节点(Data Node):像“图书管理员”,负责存储数据和处理查询。
- 协调节点(Coordinating Node):像“接待员”,接收用户的请求并分发给其他节点。
-
集群(Cluster)
一群节点组成的“团队”,共同管理数据。就像一群管理员一起管理整个图书馆。 -
索引(Index)
像图书馆里的“书架”,存储同类型的文档(比如“童话书”或“科技书”)。 -
分片(Shard)
像书架分成多个“小抽屉”,把大数据分成小块,方便分布式存储和查询。 -
倒排索引(Inverted Index)
像一本“快速找书的目录”,记录每个单词出现在哪些文档里。
(2) 使用场景
- 电商搜索:在海量商品中快速找到用户想要的商品。
- 日志分析:分析服务器日志,快速定位错误。
- 实时推荐:根据用户行为推荐内容(比如短视频平台)。
- 地理位置查询:查找附近的餐厅或商店。
(3) 底层原理
Elasticsearch 的核心是 分布式系统,像一群小伙伴一起合作管理一个超级大的图书馆:
- 分片:把数据分成小块,存储在不同节点上,提高查询速度。
- 复制:每个分片都有备份(副本),防止数据丢失。
- 倒排索引:快速找到关键词对应的文档,就像用目录找书一样。
2. 流程图
以下是 Elasticsearch 服务器的工作流程:
+-------------------+
| 用户发送请求 |
+-------------------+
|
v
+-------------------+
| 协调节点 | (接待员)
| 接收请求并分发 |
+-------------------+
|
v
+-------------------+
| 数据节点 | (图书管理员)
| 处理查询或存储数据|
+-------------------+
|
v
+-------------------+
| 主节点 | (国王)
| 管理集群状态 |
+-------------------+
|
v
+-------------------+
| 返回结果给用户 |
+-------------------+
3. 概念图
以下是 Elasticsearch 服务器的核心概念:
+-------------------+
| Elasticsearch |
| 服务器 |
+-------------------+
|
v
+-------------------+
| 集群(Cluster) | (一群管理员)
+-------------------+
|
v
+-------------------+
| 节点(Node) | (管理员角色)
| - 主节点 |
| - 数据节点 |
| - 协调节点 |
+-------------------+
|
v
+-------------------+
| 索引(Index) | (书架)
+-------------------+
|
v
+-------------------+
| 分片(Shard) | (小抽屉)
+-------------------+
|
v
+-------------------+
| 倒排索引 | (快速找书目录)
+-------------------+
4. UML 类图
以下是简化后的 UML 类图:
+-------------------+
| Cluster |
+-------------------+
| - nodes: List | (所有节点)
| - name: string | (集群名称)
+-------------------+
| + manageNodes(): void |
+-------------------+
+-------------------+
| Node |
+-------------------+
| - role: string | (主节点、数据节点等)
| - data: Map | (存储的文档)
+-------------------+
| + processRequest(): void |
+-------------------+
+-------------------+
| Index |
+-------------------+
| - shards: List | (分片列表)
| - mappings: Map | (字段类型定义)
+-------------------+
| + addDocument(): void |
+-------------------+
+-------------------+
| Shard |
+-------------------+
| - documents: List | (存储的文档)
| - invertedIndex: Map |
+-------------------+
| + search(): List |
+-------------------+
5. 思维导图
以下是 Elasticsearch 服务器的思维导图:
+-------------------+
| Elasticsearch |
| 服务器 |
+-------------------+
| + 核心概念 |
| + 集群 |
| + 节点 |
| + 索引 |
| + 分片 |
| + 数据存储 |
| + 倒排索引 |
| + 分布式存储 |
| + 查询流程 |
| + 分发请求 |
| + 并行处理 |
+-------------------+
6. 实例代码(PHP 连接并操作 Elasticsearch 服务器)
以下是 PHP 代码示例,连接到 Elasticsearch 服务器并执行基本操作:
// 1. 安装 Elasticsearch 客户端库(需要先执行:composer require elasticsearch)
require 'vendor/autoload.php';
// 2. 创建客户端连接到服务器
use ElasticsearchClientBuilder;
// 创建客户端,连接到本地服务器
$client = ClientBuilder::create()
->setHosts(['http://localhost:9200']) // 连接地址
->build();
// 3. 创建索引(书架)
$params = [
'index' => 'book_index', // 索引名称
'body' => [
'settings' => [
'number_of_shards' => 2, // 分片数量
'number_of_replicas' => 1 // 副本数量
],
'mappings' => [ // 字段定义
'properties' => [
'title' => ['type' => 'text'], // 文本类型
'author' => ['type' => 'keyword'], // 关键字类型
'year' => ['type' => 'integer'] // 整数类型
]
]
]
];
$client->indices()->create($params); // 创建索引
// 4. 插入文档(放一本书到书架)
$params = [
'index' => 'book_index',
'id' => '1',
'body' => [
'title' => '小王子',
'author' => '圣埃克苏佩里',
'year' => 1943
]
];
$client->index($params); // 插入文档
// 5. 查询文档(找书)
$params = [
'index' => 'book_index',
'body' => [
'query' => [
'match' => [ // 匹配查询
'author' => '圣埃克苏佩里'
]
]
]
];
$searchResponse = $client->search($params); // 执行查询
print_r($searchResponse); // 输出结果
// 6. 删除索引(拆除书架)
$client->indices()->delete(['index' => 'book_index']);
代码注释详细解释
第 3 步:创建索引
$client->indices()->create($params);
- 作用:创建一个名为
book_index
的索引,并设置分片和副本数量。 - 为什么这么写:Elasticsearch 需要预先定义索引的结构(分片、副本、字段类型)。
- 知识点:Elasticsearch 的 索引创建 API 和分片配置。
第 4 步:插入文档
$client->index($params);
- 作用:将文档插入到
book_index
索引中。 - 为什么这么写:
index()
方法对应 Elasticsearch 的 索引 API,用于存储数据。 - 知识点:Elasticsearch 的 文档存储 和 HTTP 请求方法(
PUT
)。
第 5 步:查询文档
$client->search($params);
- 作用:根据作者名称查询文档。
- 为什么这么写:
search()
方法是 Elasticsearch 的核心查询接口。 - 知识点:Elasticsearch 的 查询 DSL(领域特定语言)。
第 6 步:删除索引
$client->indices()->delete(['index' => 'book_index']);
- 作用:删除整个索引及其数据。
- 为什么这么写:通过
indices()
进入索引管理模块,调用delete()
方法。 - 知识点:Elasticsearch 的 索引管理 API。
7. 总结
- Elasticsearch 服务器 就像一个超级大的“数据城堡”,由节点、索引、分片组成。
- 核心功能:分布式存储、快速查询、高可用性(通过副本)。
- 底层原理:通过分片和倒排索引实现高效查询,通过集群实现扩展和容错。