Elasticsearch 教程:零基础入门指南
引言
在当今这个数据爆炸的时代,高效地存储、搜索和分析海量数据变得至关重要。Elasticsearch 作为一个强大、开源的分布式搜索和分析引擎,正日益受到各行各业的青睐。无论是电商网站的商品搜索、新闻网站的内容检索,还是日志数据的分析监控,Elasticsearch 都能大显身手。
本教程将从零开始,带您一步步走进 Elasticsearch 的世界。您无需任何 Elasticsearch 或相关技术的背景知识,只需跟随教程的指引,即可轻松掌握 Elasticsearch 的核心概念和基本操作。
第一部分:Elasticsearch 核心概念
在开始动手实践之前,我们需要先了解 Elasticsearch 的一些核心概念,这将有助于您更好地理解其工作原理和应用场景。
- 近实时 (Near Real-Time, NRT)
Elasticsearch 是一个近实时的搜索平台。这意味着从您索引一个文档(将其添加到 Elasticsearch 中)到它可以被搜索到之间存在一个轻微的延迟(通常是一秒)。这与传统的数据库系统不同,传统数据库在写入数据后可以立即被读取。
- 集群 (Cluster)
一个 Elasticsearch 集群由一个或多个节点(服务器)组成,它们共同存储您的所有数据,并提供跨所有节点的联合索引和搜索功能。集群有一个唯一的名称进行标识,默认名称为 “elasticsearch”。
- 节点 (Node)
节点是集群中的单个服务器,它存储数据并参与集群的索引和搜索功能。与集群一样,节点也通过名称进行标识,默认情况下,该名称是在启动时分配给节点的随机通用唯一标识符 (UUID)。
- 索引 (Index)
索引是具有相似特征的文档的集合。例如,您可以拥有一个客户数据的索引、一个产品目录的索引,以及一个订单数据的索引。索引由一个名称标识(必须全部小写),并且在对该索引中的文档执行索引、搜索、更新和删除操作时,您将使用此名称来引用该索引。
从关系型数据库的角度来看,索引类似于数据库中的一个“数据库”。
- 类型 (Type) (已弃用)
在 Elasticsearch 7.x 版本之前,类型被用来表示索引中不同类型的文档。例如,您可能在客户索引中有一个 “customer” 类型和一个 “vip_customer” 类型。
重要提示: 类型概念已在 Elasticsearch 7.x 中被弃用,并在 8.x 中完全移除。在 7.x 及更高版本中,每个索引只包含一个类型,通常使用 _doc
作为类型名。本文档中,我们将遵循这一规范。
- 文档 (Document)
文档是可以被索引的基本信息单元。例如,您可以有一个特定客户的文档、一个特定产品的文档,或者一个特定订单的文档。文档以 JSON(JavaScript 对象表示法)格式表示,这是一种无处不在的互联网数据交换格式。
从关系型数据库的角度来看,文档类似于数据库表中的一行记录。
- 字段 (Field)
文档由字段组成,每个字段包含一个或多个值。字段类似于关系型数据库表中列的概念。每个字段都有一个数据类型,例如文本、数字、日期、布尔值等。
- 映射 (Mapping)
映射是定义文档及其包含的字段如何存储和索引的过程。例如,您可以使用映射来定义:
- 哪些字符串字段应被视为全文检索字段。
- 哪些字段包含数字、日期或地理位置。
- 日期值的格式。
-
自定义规则来控制动态添加字段的映射。
-
分片 (Shard)
Elasticsearch 提供了将索引细分为多个部分的功能,这些部分称为分片。每个分片本身就是一个完全功能且独立的“索引”,可以托管在集群中的任何节点上。
分片很重要,主要有两个原因:
- 水平扩展/扩展: 它允许您水平分割/扩展您的内容量。
-
分布式/并行操作: 它允许您跨分片(可能在多个节点上)分布和并行操作,从而提高性能/吞吐量。
-
副本 (Replica)
Elasticsearch 允许您将索引分片的一个或多个副本制作为所谓的副本分片或简称副本。
副本很重要,主要有两个原因:
- 高可用性: 它在分片/节点发生故障时提供高可用性。因此,需要注意的是,副本分片永远不会与从中复制的原始/主分片分配在同一节点上。
- 扩展搜索容量/吞吐量: 它可以扩展您的搜索量/吞吐量,因为搜索可以在所有副本上并行执行。
第二部分:安装和配置 Elasticsearch
在了解了 Elasticsearch 的核心概念之后,我们就可以开始动手安装和配置 Elasticsearch 了。
- 下载 Elasticsearch
您可以从 Elasticsearch 官方网站下载最新版本的 Elasticsearch:https://www.elastic.co/downloads/elasticsearch
根据您的操作系统选择相应的安装包。
-
安装 Elasticsearch
-
Windows:
解压下载的 .zip 文件。进入解压后的目录,运行bin\elasticsearch.bat
。 -
macOS (使用 Homebrew):
bash
brew install elasticsearch
brew services start elasticsearch
* Linux (使用 .tar.gz):
解压下载的 .tar.gz 文件。进入解压后的目录,运行./bin/elasticsearch
。
* Linux (使用 APT, 基于Debian的系统如Ubuntu):
bash
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
sudo apt-get update && sudo apt-get install elasticsearch
sudo systemctl start elasticsearch
* Linux (使用YUM, 基于Red Hat的系统如CentOS):
bash
sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
sudo tee /etc/yum.repos.d/elasticsearch.repo<<EOF
[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF
sudo yum install elasticsearch
sudo systemctl start elasticsearch -
验证安装
在浏览器中访问 http://localhost:9200
。如果看到类似以下的 JSON 输出,则表示 Elasticsearch 安装成功:
json
{
"name" : "your-node-name",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "...",
"version" : {
"number" : "7.x.x", // 你的Elasticsearch版本号
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "...",
"build_date" : "...",
"build_snapshot" : false,
"lucene_version" : "8.x.x",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
- 配置 Elasticsearch (可选)
Elasticsearch 的配置文件位于 config
目录下。主要的配置文件是 elasticsearch.yml
。您可以在其中修改集群名称、节点名称、网络设置等。
例如,要修改集群名称,可以编辑 elasticsearch.yml
文件,找到 cluster.name
选项并将其修改为您的集群名称:
yaml
cluster.name: my-es-cluster
修改后需要重启 Elasticsearch 才能生效。
第三部分:与 Elasticsearch 交互
Elasticsearch 提供了 RESTful API,您可以使用 HTTP 请求与其进行交互。您可以使用任何 HTTP 客户端工具(例如 curl、Postman 或 Kibana 的 Dev Tools)来发送请求。
- 创建索引
使用 PUT
请求创建一个名为 my_index
的索引:
bash
curl -X PUT "localhost:9200/my_index"
如果创建成功,您将收到类似以下的响应:
json
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "my_index"
}
-
查看索引信息
使用GET
请求获取索引my_index
的设置:bash
curl -X GET "localhost:9200/my_index?pretty" -
添加文档
使用 POST
请求向 my_index
索引添加一个文档。注意,在 7.x 及更高版本中,我们使用 _doc
作为类型:
bash
curl -X POST "localhost:9200/my_index/_doc/1" -H 'Content-Type: application/json' -d'
{
"name" : "John Doe",
"age" : 30,
"city" : "New York"
}
'
在上面的请求中:
* my_index
: 索引名称。
* _doc
: 文档类型(在7.x及以后的版本为固定值)。
* 1
: 文档ID,如果省略这个ID,Elasticsearch 会自动生成一个唯一的ID。
* -H 'Content-Type: application/json'
: 指定请求体的内容类型为 JSON。
* -d
: 指定请求体数据。
如果添加成功,您将收到类似以下的响应:
json
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
- 获取文档
使用 GET
请求获取 ID 为 1 的文档:
bash
curl -X GET "localhost:9200/my_index/_doc/1?pretty"
如果文档存在,您将收到类似以下的响应:
“`json
{
“_index” : “my_index”,
“_type” : “_doc”,
“_id” : “1”,
“_version” : 1,
“_seq_no” : 0,
“_primary_term” : 1,
“found” : true,
“_source” : {
“name” : “John Doe”,
“age” : 30,
“city” : “New York”
}
}
```
found: true
:表示找到了文档。-
_source
: 包含了文档的原始数据。 -
更新文档
使用 POST
请求更新 ID 为 1 的文档。注意,在 7.x 及更高版本中,我们使用 _doc
作为类型,并使用 _update
API:
bash
curl -X POST "localhost:9200/my_index/_update/1" -H 'Content-Type: application/json' -d'
{
"doc" : {
"age" : 31
}
}
'
使用 doc
关键字指定要更新的字段和值。
如果更新成功,您会得到类似如下的响应:
“`json
{
“_index” : “my_index”,
“_type” : “_doc”,
“_id” : “1”,
“_version” : 2, //版本号增加了
“result” : “updated”,
“_shards” : {
“total” : 2,
“successful” : 1,
“failed” : 0
},
“_seq_no” : 1,
“_primary_term” : 1
}
```
- 删除文档
使用 DELETE
请求删除 ID 为 1 的文档:
bash
curl -X DELETE "localhost:9200/my_index/_doc/1"
如果删除成功,您将收到类似以下的响应:
“`json
{
“_index” : “my_index”,
“_type” : “_doc”,
“_id” : “1”,
“_version” : 3, //版本号进一步增加
“result” : “deleted”,
“_shards” : {
“total” : 2,
“successful” : 1,
“failed” : 0
},
“_seq_no” : 2,
“_primary_term” : 1
}
“`
- 搜索文档
Elasticsearch 提供了强大的搜索功能。您可以使用 _search
API 来执行各种搜索查询。
-
简单搜索:
搜索
my_index
索引中的所有文档:bash
curl -X GET "localhost:9200/my_index/_search?pretty"
* 查询字符串搜索:
搜索name
字段包含 “John” 的文档:```bash curl -X GET "localhost:9200/my_index/_search?q=name:John&pretty" ```
- DSL 查询:
使用查询 DSL(Domain Specific Language)构建更复杂的查询。例如,搜索
age
字段大于等于 30 的文档:bash
curl -X GET "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"range": {
"age": {
"gte": 30
}
}
}
}
' -
删除索引
使用
DELETE
请求删除名为my_index
的索引:bash
curl -X DELETE "localhost:9200/my_index"
如果删除成功,您将收到类似如下的响应:json
{
"acknowledged" : true
}
第四部分:Kibana 入门
Kibana 是一个开源的数据可视化和探索工具,与 Elasticsearch 紧密集成。它可以帮助您以图形化的方式查看和分析 Elasticsearch 中的数据。
-
下载 Kibana
您可以从 Elasticsearch 官方网站下载最新版本的 Kibana:https://www.elastic.co/downloads/kibana
根据您的操作系统选择相应的安装包。
-
安装 Kibana
安装过程与 Elasticsearch 类似,请参考 Elasticsearch 的安装步骤。
-
启动 Kibana
运行 Kibana 的可执行文件。默认情况下,Kibana 会在端口 5601 上运行。
-
访问 Kibana
在浏览器中访问
http://localhost:5601
。您将看到 Kibana 的欢迎界面。 -
连接到 Elasticsearch
首次访问 Kibana 时,您需要配置 Elasticsearch 的连接信息。默认情况下,Kibana 会尝试连接到本地运行的 Elasticsearch 实例(
http://localhost:9200
)。如果您的 Elasticsearch 运行在不同的主机或端口上,您需要修改连接配置。 -
创建索引模式 (Index Pattern)
在 Kibana 中,您需要创建一个索引模式来告诉 Kibana 您要查看哪个 Elasticsearch 索引中的数据。
- 在 Kibana 的左侧导航栏中,点击 “Management”。
- 点击 “Stack Management”。
- 点击 “Index Patterns”。
- 点击 “Create index pattern”。
- 在 “Index pattern name” 字段中,输入您的 Elasticsearch 索引名称(例如
my_index
)。 - 如果您的索引包含时间字段,选择 “Time Filter field name”。
- 点击 “Create index pattern”。
-
探索数据
创建索引模式后,您就可以在 Kibana 的 “Discover” 页面中探索您的数据了。
- 在 Kibana 的左侧导航栏中,点击 “Discover”。
- 您将看到您的索引中的文档列表。
- 您可以使用搜索栏来过滤数据,或者使用字段列表来选择要显示的字段。
-
创建可视化
Kibana 提供了丰富的可视化类型,例如柱状图、折线图、饼图、地图等。您可以根据您的数据和分析需求创建各种可视化。
- 在 Kibana 的左侧导航栏中,点击 “Visualize”。
- 点击 “Create visualization”。
- 选择您要创建的可视化类型。
- 选择您的索引模式。
- 配置可视化选项,例如 X 轴、Y 轴、聚合方式等。
- 点击 “Save” 保存您的可视化。
-
创建仪表板 (Dashboard)
仪表板可以将多个可视化组合在一起,以便于集中查看和分析数据。- 在 Kibana 的左侧导航栏中,点击 “Dashboard”。
- 点击 “Create dashboard”。
- 点击 “Add an existing” 并选择之前创建的可视化,将它们添加到仪表板。
- 调整可视化的大小和位置。
- 点击 “Save” 保存您的仪表板。
第五部分:进阶主题
-
全文检索 (Full-Text Search)
Elasticsearch 最强大的功能之一是其全文检索能力。Elasticsearch 使用倒排索引(Inverted Index)来实现快速的全文检索。
-
倒排索引: 倒排索引是一种将单词映射到包含该单词的文档的数据结构。例如:
“`
文档 1: The quick brown fox
文档 2: Jumped over the lazy dog倒排索引:
The: [1, 2]
quick: [1]
brown: [1]
fox: [1]
Jumped: [2]
over: [2]
lazy: [2]
dog: [2]
``
match
* **分析器 (Analyzer):** 分析器负责将文本分解为单词(分词),并对单词进行规范化(例如转换为小写、去除停用词等)。Elasticsearch 内置了多种分析器,您也可以自定义分析器。
* **查询 DSL:** Elasticsearch 提供了丰富的查询 DSL 来构建各种全文检索查询。常用的查询类型包括:
*: 匹配包含指定单词的文档。
match_phrase
*: 匹配包含指定短语的文档。
multi_match
*: 在多个字段中搜索。
bool
*: 组合多个查询。
fuzzy`: 模糊查询,允许拼写错误。
*
-
-
聚合 (Aggregation)
聚合是 Elasticsearch 的另一个强大功能,它允许您对数据进行统计分析。
- 指标聚合 (Metrics Aggregations): 计算指标,例如平均值、最大值、最小值、总和等。
- 桶聚合 (Bucket Aggregations): 将文档分组到不同的桶中,例如按日期、按城市、按价格范围等。
- 管道聚合 (Pipeline Aggregations): 对其他聚合的结果进行进一步处理,例如计算移动平均值、百分比变化等。
-
映射 (Mapping) 进阶
- 自定义分析器: 可以根据需要组合不同的分词器(tokenizer)、分词过滤器(token filter) 和 字符过滤器(character filter) 来创建自定义分析器。
- 多字段 (Multi-fields): 允许您将一个字段以不同的方式进行索引,以便于不同的搜索和分析需求。例如,可以将一个文本字段既作为全文检索字段进行索引,又作为精确值字段进行索引。
- 动态映射 (Dynamic Mapping): Elasticsearch 可以根据您索引的文档自动推断字段类型。您可以通过配置来控制动态映射的行为。
-
显式映射 (Explicit Mapping): 建议在生产环境中显式定义映射,以确保数据类型和索引方式符合您的预期。
-
集群管理
- 节点发现: Elasticsearch 使用 Zen Discovery 机制来发现集群中的节点。
- 分片和副本: 合理配置分片和副本的数量可以提高性能和可用性。
- 监控: Elasticsearch 提供了各种 API 来监控集群的健康状况和性能指标。
- 备份和恢复: Elasticsearch 提供了快照和恢复 API 来备份和恢复数据。
-
安全性
- X-Pack Security: 提供用户认证、角色授权、加密通信等安全功能。(注意:X-Pack 的部分功能需要付费订阅)
- 网络安全: 配置防火墙规则,限制对 Elasticsearch 端口的访问。
-
与其他工具集成
- Logstash: Logstash 是一个数据收集引擎,可以将数据从各种来源收集到 Elasticsearch 中。
- Beats: Beats 是一组轻量级的数据采集器,可以将各种类型的数据发送到 Elasticsearch 或 Logstash。
- 其他编程语言的客户端: Elasticsearch 提供了各种编程语言的客户端库,例如 Java、Python、JavaScript、Go 等。
总结
本教程为您介绍了 Elasticsearch 的核心概念、安装配置、基本操作、Kibana 入门以及一些进阶主题。希望通过本教程,您能够对 Elasticsearch 有一个全面的了解,并能够开始使用 Elasticsearch 来解决实际问题。
Elasticsearch 是一个功能强大且灵活的工具,其应用场景非常广泛。随着您对 Elasticsearch 的深入了解,您将能够发掘出更多的可能性。祝您在 Elasticsearch 的学习之旅中取得成功!