Elasticsearch 零基础入门教程:从概念到实战
欢迎来到 Elasticsearch 的世界!如果您是第一次听说它,或者听说过但不知道从何入手,那么这篇教程正是为您准备的。我们将从最基本的概念讲起,一步步带您了解 Elasticsearch 是什么、它能做什么,并亲手进行一些基础操作。无需任何 Elasticsearch 预备知识,只需要一点点好奇心!
阅读本文,您将了解到:
- Elasticsearch 是什么?它有什么用?
- Elasticsearch 的核心概念(索引、文档、节点、分片等)。
- 如何快速搭建一个 Elasticsearch 环境(概述)。
- 如何与 Elasticsearch 交互(REST API)。
- Elasticsearch 的基础操作:索引、获取、更新、删除文档。
- 如何进行基础搜索。
- 一个简单的实战例子。
- 相关工具 Kibana 的作用。
引言:为什么需要 Elasticsearch?
在互联网时代,数据量呈爆炸式增长。无论是网站内容、用户日志、商品信息还是监控指标,我们都需要高效地存储、检索和分析这些数据。传统的数据库(如 MySQL、PostgreSQL)在处理结构化数据方面非常强大,但在以下场景中可能会遇到挑战:
- 全文搜索: 当我们需要在海量文本内容中快速找到包含特定关键词的信息时,传统数据库的 LIKE 查询效率往往不高,而且难以处理复杂的搜索需求(如同义词、相关性排序等)。
- 实时分析: 需要对大量数据进行实时聚合、统计和分析,以获取趋势或洞察。
- 海量数据的存储与扩展: 数据量达到 TB 或 PB 级别时,传统单机数据库可能面临存储和性能瓶颈,需要复杂的分布式方案。
Elasticsearch 正是为了解决这些问题而诞生的。它是一个构建在 Apache Lucene™ 之上的分布式、RESTful 风格的搜索和分析引擎。它具有以下特点:
- 分布式: 可以轻松地水平扩展,处理海量数据。
- 实时: 数据写入后很快就可以被搜索到。
- 全文搜索: 强大的文本处理和搜索能力。
- 高可用: 通过数据冗余保证服务不中断。
- RESTful API: 易于使用,可以通过 HTTP 请求进行交互。
- Schema-less (灵活模式): 默认情况下无需预先定义复杂的数据模式,文档可以有不同的字段结构。
简单来说,您可以把 Elasticsearch 理解为一个非常善于“找东西”的仓库管理员,而且这个管理员是分布在很多仓库里协同工作的,能处理各种格式的物品(数据),并且能快速找到您想要的东西,甚至还能帮您统计物品的总量或分类。
第一章:初识 Elasticsearch
1.1 Elasticsearch 是什么?
Elasticsearch 是 Elastic Stack(前身为 ELK Stack,现在通常指代 Elastic 的一系列产品)的核心组件之一。Elastic Stack 包括:
- Elasticsearch: 分布式搜索和分析引擎。
- Kibana: 数据可视化和管理工具(图形界面)。
- Logstash: 数据收集、处理和转发管道。
- Beats: 轻量级数据采集器(如 Filebeat、Metricbeat 等)。
Elasticsearch 通常用于以下场景:
- 网站搜索: 提供站内搜索功能(如电商网站的商品搜索)。
- 日志和指标分析: 收集、存储和分析大量的应用日志、服务器指标。
- APM(应用性能监控): 存储和分析应用追踪数据。
- 安全信息和事件管理 (SIEM): 收集和分析安全相关的日志和事件。
- 业务分析: 对业务数据进行搜索和聚合分析。
1.2 与传统数据库的区别
虽然 Elasticsearch 也存储数据,但它的设计目标和传统关系型数据库(RDBMS)有很大不同:
特性 | 传统数据库(RDBMS) | Elasticsearch |
---|---|---|
主要用途 | 事务处理、结构化数据存储 | 搜索、分析、非结构化/半结构化数据处理 |
数据模型 | 表、行、列(严格结构化) | 文档(JSON 格式,灵活模式) |
扩展性 | 通常垂直扩展为主,水平扩展复杂 | 天然分布式,易于水平扩展 |
读写性能 | 写性能通常较好,特定查询读快 | 读(搜索/分析)性能极佳,写性能也较好 |
事务支持 | 强 | 弱,通常用于写后不修改或少量修改场景 |
查询方式 | SQL | RESTful API (基于 JSON 的查询 DSL) |
理解这些区别非常重要,它能帮助您在合适的场景选择合适的工具。Elasticsearch 并非要取代传统数据库,它们常常结合使用,发挥各自的优势。
第二章:核心概念解析
学习 Elasticsearch,首先需要理解几个核心概念,它们是构建一切的基础。
2.1 文档 (Document)
文档是 Elasticsearch 中最基本的信息单元。您可以将其类比为传统数据库中的一行记录。
- 文档采用 JSON 格式,非常灵活,可以包含各种类型的数据(字符串、数字、布尔值、日期、嵌套对象等)。
- 每个文档都有一个唯一的 ID。您可以指定 ID,也可以让 Elasticsearch 自动生成。
- 文档是可搜索的最小单位。
示例文档:
json
{
"title": "Elasticsearch 入门指南",
"author": "张三",
"publish_date": "2023-10-26",
"tags": ["Elasticsearch", "搜索", "教程"],
"content": "这是一篇详细介绍 Elasticsearch 基础知识的文章...",
"views": 1200
}
2.2 索引 (Index)
索引是 Elasticsearch 中文档的集合。您可以将其类比为传统数据库中的一个数据库 (Database)。
- 索引有一个唯一的名称(小写)。
- 索引定义了存储在其中的文档的映射 (Mapping) 和设置 (Settings)。映射描述了文档中字段的数据类型和如何被索引(例如,文本字段是否需要分词),设置则包括分片数量、副本数量等。
- 在执行搜索、索引、更新、删除操作时,都需要指定是针对哪个索引进行的。
2.3 字段 (Field)
文档中的每个键值对(如 "title": "Elasticsearch 入门指南"
)就是一个字段。您可以将其类比为传统数据库表中的一个列 (Column)。
- 每个字段都有对应的数据类型(如
text
、keyword
、integer
、date
等)。 - Elasticsearch 会根据字段类型对数据进行不同的处理,例如
text
类型会进行分词以便全文搜索,而keyword
类型则用于精确匹配或聚合。
2.4 节点 (Node) 与 集群 (Cluster)
- 节点 (Node): 一个 Elasticsearch 实例就是一个节点。它是一台运行着 Elasticsearch 进程的服务器或虚拟机。节点根据其角色不同,可以承担不同的任务(如处理搜索请求、存储数据、管理集群等)。
- 集群 (Cluster): 一个或多个节点的集合。这些节点协同工作,共同存储您的数据,并提供索引和搜索能力。集群具有唯一的名称。单个节点的集群也是合法的,但生产环境通常是多节点集群以保证高可用和可扩展性。
分布式特性使得 Elasticsearch 可以通过增加节点来扩展存储和处理能力。
2.5 分片 (Shard) 与 副本 (Replica)
这是 Elasticsearch 实现分布式和高可用的关键概念。
- 分片 (Shard): 当您的索引数据量非常大时,单个节点可能无法存储或处理。Elasticsearch 会将一个索引分解成多个物理上的分片。每个分片都是一个独立的 Lucene 索引实例,它可以分布在集群中的不同节点上。通过分片,Elasticsearch 可以实现水平扩展,将数据和请求分散到多个节点上并行处理。分片数量在索引创建时确定,后续一般不能修改。
- 副本 (Replica): 为了保证高可用性,防止某个节点故障导致数据丢失或搜索中断,Elasticsearch 允许为每个分片创建副本。副本是分片的完整拷贝。副本分片分布在与原始主分片不同的节点上。如果主分片所在的节点故障,副本分片可以晋升为新的主分片。副本还可以在搜索时分担主分片的压力,提高搜索吞吐量。副本数量可以随时修改。
通常,一个索引由若干个主分片 (Primary Shard) 和每个主分片对应的若干个副本分片 (Replica Shard) 组成。
2.6 映射 (Mapping)
映射定义了一个索引中文档的结构和字段的数据类型,以及这些字段如何被索引。虽然 Elasticsearch 默认可以根据您提交的文档自动推断映射(Dynamic Mapping),但在生产环境中,通常建议手动或通过模板定义精确的映射,特别是对于文本字段,以控制分词行为。不过对于入门来说,依赖自动映射是快速上手的方式。
第三章:快速搭建环境(概述)
要开始使用 Elasticsearch,您需要在您的机器上安装并运行它。作为入门教程,我们不提供详细的安装步骤(因为这取决于您的操作系统和偏好,且安装方式可能会随版本变化),但概述几种常见方式:
- 官方下载: 从 Elastic 官网下载对应您操作系统的安装包(ZIP, TAR, DEB, RPM 等),解压后即可运行。
- Docker: 使用 Docker 是非常便捷的方式,可以快速拉取 Elasticsearch 镜像并运行容器。
- 包管理器: 在 Linux 系统上,可以使用 apt 或 yum 添加 Elastic 的仓库后进行安装。
建议新手使用 Docker 或官方下载 ZIP/TAR 包的方式,相对简单直接。
无论哪种方式,目标是:
- 成功启动一个 Elasticsearch 节点。
- Elasticsearch 默认运行在 9200 端口。
启动后,您可以通过简单的 HTTP GET 请求来检查 Elasticsearch 是否正在运行:
bash
curl http://localhost:9200
如果一切正常,您应该会看到一个 JSON 响应,包含有关您的 Elasticsearch 节点的信息(名称、版本等)。
此外,强烈建议您同时安装 Kibana。Kibana 通常运行在 5601 端口,它提供了一个用户友好的 Web 界面,特别是其中的 Dev Tools (开发工具),是与 Elasticsearch 交互的绝佳工具,比命令行 curl
更方便。
第四章:与 Elasticsearch 交互:REST API
Elasticsearch 提供了丰富的 RESTful API,您可以通过标准的 HTTP 方法(GET, POST, PUT, DELETE 等)与它进行交互。
API 的基本格式通常是:
METHOD /index_name/api_path -d 'request_body'
或者针对特定文档:
METHOD /index_name/_doc/document_id -d 'request_body'
其中:
METHOD
:HTTP 方法(如 GET, POST, PUT, DELETE)。/index_name
:操作的目标索引。如果操作不针对特定索引(如获取集群信息),可以省略。/api_path
:API 的路径(如_search
用于搜索,_doc
用于文档操作)。_doc
:表示操作的是文档。在较新的 Elasticsearch 版本中,类型 (Type) 的概念已经淡化,_doc
是推荐的文档端点。document_id
:要操作的文档的 ID。-d 'request_body'
:POST 或 PUT 请求通常需要一个请求体,以 JSON 格式表示。
在后续的例子中,我们将主要使用 Kibana Dev Tools 来演示 API 调用,因为它提供了代码高亮、自动补全和友好的结果展示。如果您使用 Kibana,打开 Dev Tools (通常在左侧导航栏的 Management
或 Dev Tools
下),您会看到一个控制台界面,左侧输入 API 请求,右侧显示响应。
Kibana Dev Tools 中的 API 格式:
METHOD /index_name/api_path
{
"request_body"
}
注意,在 Kibana Dev Tools 中,不需要写 http://localhost:9200
,它会自动发往配置好的 Elasticsearch 地址。每个请求之间用空行隔开。
第五章:基础操作实战
现在,我们通过 Kibana Dev Tools 来进行一些基础操作。假设您的 Elasticsearch 和 Kibana 都已成功启动。
5.1 索引文档 (Indexing Documents)
将数据添加到 Elasticsearch 中称为“索引文档”。
5.1.1 自动生成文档 ID
如果您不指定文档 ID,Elasticsearch 会自动为您生成一个唯一的 ID。使用 POST
方法:
kibana
POST /my_first_index/_doc
{
"title": "Elasticsearch 快速入门",
"content": "本文旨在帮助新手快速了解和使用 Elasticsearch。",
"publish_date": "2023-10-26T10:00:00Z"
}
执行后,Elasticsearch 会返回一个响应,包含文档所属的索引 (_index
)、自动生成的类型 (_type
,通常是 _doc
)、文档 ID (_id
)、版本号 (_version
) 以及操作结果 (result
为 created
)。
5.1.2 指定文档 ID
如果您有自己的唯一标识符,可以使用 PUT
方法并指定文档 ID:
kibana
PUT /my_first_index/_doc/doc_1
{
"title": "深入理解 Elasticsearch 核心概念",
"content": "探讨分片、副本、映射等关键概念。",
"publish_date": "2023-10-27T11:00:00Z"
}
执行后,如果 ID doc_1
之前不存在,result
是 created
;如果存在,则是 updated
(覆盖原文档)。
您可以多添加几个文档进行练习。
“`kibana
POST /my_first_index/_doc
{
“title”: “Kibana 入门教程”,
“content”: “学习如何使用 Kibana 可视化和管理 Elasticsearch 数据。”,
“publish_date”: “2023-10-28T12:00:00Z”
}
PUT /my_first_index/_doc/doc_3
{
“title”: “Elasticsearch 分布式原理”,
“content”: “了解 Elasticsearch 集群、节点、分片和副本的工作原理。”,
“publish_date”: “2023-10-29T13:00:00Z”,
“author”: “李四”
}
“`
5.2 获取文档 (Getting Documents)
根据文档 ID 获取特定文档的内容。使用 GET
方法:
kibana
GET /my_first_index/_doc/doc_1
响应会包含文档的元信息 (_index
, _type
, _id
, _version
, _seq_no
, _primary_term
) 以及文档的实际内容 (_source
字段)。如果文档不存在,会返回 404 错误。
5.3 更新文档 (Updating Documents)
更新现有文档。Elasticsearch 提供多种更新方式,最常用的是局部更新 (_update
API),您可以只提交需要修改的字段,而不是整个文档。
kibana
POST /my_first_index/_update/doc_1
{
"doc": {
"views": 500
}
}
这将向 ID 为 doc_1
的文档添加一个 views
字段(如果不存在),或者更新它(如果已存在)。result
将是 updated
或 noop
(如果更新内容与原文档一致)。
您也可以更新自动生成的 ID 的文档,只需在 _update
API 中使用该 ID。
5.4 删除文档 (Deleting Documents)
根据文档 ID 删除文档。使用 DELETE
方法:
kibana
DELETE /my_first_index/_doc/doc_1
响应中的 result
将是 deleted
。如果文档不存在,仍然会返回 200,但 result
是 not_found
。
5.5 简单搜索 (Simple Search)
搜索是 Elasticsearch 最核心的功能。使用 _search
端点,通常使用 GET
或 POST
方法。由于搜索请求体可能较大,通常推荐使用 POST
。
5.5.1 搜索所有文档 (match_all
)
最简单的搜索是搜索索引中的所有文档:
kibana
GET /my_first_index/_search
{
"query": {
"match_all": {}
}
}
响应会包含:
took
:搜索耗时(毫秒)。timed_out
:是否超时。hits
:搜索结果的核心部分。total.value
:总命中数。hits
数组:实际的搜索结果列表,每个元素代表一个命中的文档,包含_index
,_type
,_id
,_score
(相关性得分),_source
(原始文档内容) 等。
5.5.2 按字段精确搜索 (term
query)
term
查询用于查找字段中包含精确词条(term)的文档。这里的“词条”是指经过分析器处理后产生的最小单位,对于精确值字段(如 keyword
类型),词条就是字段的完整值。对于文本字段(如 text
类型),需要注意 term
查询通常不用于全文搜索,因为它不会对查询词进行分析(分词等)。
假设我们在索引中有一个文档的 author
字段是 "李四"
,且 author
字段被映射为 keyword
类型或默认被识别为精确值。
kibana
GET /my_first_index/_search
{
"query": {
"term": {
"author.keyword": "李四"
}
}
}
注意: 对于 text
类型的字段,Elasticsearch 默认会自动创建一个 .keyword
的子字段,它是 keyword
类型,存储未经分析的原始值。所以这里我们搜索 author.keyword
来进行精确匹配。如果您直接对 text
字段使用 term
查询,通常无法得到期望结果,除非您的查询词恰好是字段内容分析后的某个完整词条。
5.5.3 全文搜索 (match
query)
match
查询是进行全文搜索的主要方式。它会对查询词进行分词处理,然后查找包含任意分词词条的文档。
搜索 title
或 content
字段中包含“教程”的文档:
kibana
GET /my_first_index/_search
{
"query": {
"match": {
"title": "教程"
}
}
}
或者搜索 content
字段:
kibana
GET /my_first_index/_search
{
"query": {
"match": {
"content": "新手入门"
}
}
}
match
查询是“全文搜索”的基础,它会考虑文本分析(分词、大小写转换、同义词等),并根据匹配度计算相关性得分 (_score
)。
第六章:一个简单的实战例子
让我们创建一个名为 articles
的索引,并添加一些文章数据,然后进行搜索。
1. 创建索引 (可选,如果直接索引文档,ES 会自动创建):
(通常您不需要手动创建索引,直接索引文档时 Elasticsearch 会自动创建并应用动态映射。但在实际应用中,为了精确控制字段类型,常常需要手动或通过模板创建索引并定义映射。)
kibana
PUT /articles
{
"settings": {
"index": {
"number_of_shards": 1,
"number_of_replicas": 0
}
},
"mappings": {
"properties": {
"title": { "type": "text", "analyzer": "ik_smart" },
"author": { "type": "keyword" },
"publish_date": { "type": "date" },
"tags": { "type": "keyword" },
"content": { "type": "text", "analyzer": "ik_smart" },
"views": { "type": "integer" }
}
}
}
注:ik_smart
是一个常用的中文分词器,如果您的环境中没有安装,请移除 "analyzer": "ik_smart"
部分,Elasticsearch 会使用标准分词器。对于入门,先忽略分析器细节,理解字段类型即可。number_of_replicas: 0
是为了单节点环境演示方便,生产环境建议至少设置为 1。
2. 添加文档:
“`kibana
POST /articles/_doc
{
“title”: “Elasticsearch 教程:从零到一”,
“author”: “王五”,
“publish_date”: “2023-10-20T09:00:00Z”,
“tags”: [“Elasticsearch”, “入门”, “教程”],
“content”: “这是一篇非常适合新手的 Elasticsearch 入门教程,涵盖基础概念和操作。”,
“views”: 800
}
POST /articles/_doc
{
“title”: “深入了解 Elasticsearch 分布式架构”,
“author”: “赵六”,
“publish_date”: “2023-10-25T14:30:00Z”,
“tags”: [“Elasticsearch”, “架构”, “分布式”],
“content”: “本文详细解析了 Elasticsearch 的集群、节点、分片和副本机制。”,
“views”: 1500
}
POST /articles/_doc
{
“title”: “使用 Kibana 进行数据可视化”,
“author”: “王五”,
“publish_date”: “2023-10-22T10:00:00Z”,
“tags”: [“Kibana”, “可视化”, “教程”],
“content”: “学习如何在 Kibana 中创建各种图表和仪表盘来分析数据。”,
“views”: 1000
}
“`
3. 获取特定文档:
假设第二个文档的 ID 是自动生成的,我们尝试获取它(您需要替换为您实际获得的 ID)。如果使用 PUT /articles/_doc/article_id
创建,直接用您指定的 ID 即可。
kibana
GET /articles/_doc/YOUR_SECOND_DOC_ID
4. 搜索包含“教程”的文章:
kibana
GET /articles/_search
{
"query": {
"match": {
"title": "教程"
}
}
}
您应该能搜到第一篇和第三篇文章。
5. 搜索作者是“王五”的文章:
kibana
GET /articles/_search
{
"query": {
"term": {
"author.keyword": "王五"
}
}
}
您应该能搜到第一篇和第三篇文章。
6. 搜索内容包含“分布式”的文章:
kibana
GET /articles/_search
{
"query": {
"match": {
"content": "分布式"
}
}
}
您应该能搜到第二篇文章。
7. 更新第一篇文章的浏览量:
假设第一篇文章的 ID 是 YOUR_FIRST_DOC_ID
。
kibana
POST /articles/_update/YOUR_FIRST_DOC_ID
{
"doc": {
"views": 900
}
}
8. 删除第三篇文章:
假设第三篇文章的 ID 是 YOUR_THIRD_DOC_ID
。
kibana
DELETE /articles/_doc/YOUR_THIRD_DOC_ID
通过这个简单的例子,您已经体验了 Elasticsearch 最基础的 CRUD(创建、读取、更新、删除)和搜索操作。
第七章:相关工具简介:Kibana
在上面的实战中,我们大量使用了 Kibana 的 Dev Tools。Kibana 不仅仅是一个用于与 Elasticsearch 交互的控制台,它还是一个功能强大的数据可视化和管理平台。
- Discover: 浏览 Elasticsearch 中的原始文档数据。
- Visualize: 基于 Elasticsearch 数据创建各种图表(折线图、柱状图、饼图、地图等)。
- Dashboard: 将多个可视化图表组合成一个仪表盘,进行多维度的数据监控和分析。
- Dev Tools: 与 Elasticsearch 进行交互的控制台,执行各种 API 请求。
- Management: 管理 Elasticsearch 集群、索引、快照、用户权限等。
对于初学者来说,先熟悉 Dev Tools 进行 API 操作,然后可以探索 Discover 来查看数据,再尝试 Visualize 创建简单的图表。
第八章:进阶之路
恭喜您!您已经掌握了 Elasticsearch 的核心概念和基础操作。但这仅仅是冰山一角。Elasticsearch 还有更多强大的功能等待您探索:
- 更复杂的查询: 布尔查询 (Boolean Query) 组合多种查询条件、过滤 (Filter) 提高性能、范围查询 (Range Query)、模糊查询 (Fuzzy Query) 等。
- 聚合分析 (Aggregations): 类似 SQL 的 GROUP BY,用于对数据进行分组、统计、计算最大最小值、平均值等,是构建报表和分析的关键。
- 文本分析 (Analysis): 深入了解分词器 (Tokenizer)、词条过滤器 (Token Filter) 等如何影响搜索结果。
- 映射深入 (Mapping): 精确控制字段类型和索引行为。
- 集群管理: 了解节点角色、集群健康、扩容缩容、快照恢复等。
- 性能优化: 针对特定场景优化索引、查询和集群配置。
下一步建议:
- 继续练习: 尝试使用 Dev Tools 进行更多复杂的查询和聚合操作。
- 探索 Kibana: 使用 Discover 查看您的数据,尝试创建一些简单的可视化图表。
- 阅读官方文档: Elasticsearch 的官方文档非常全面和权威,是学习进阶知识的最佳资源。从概念到具体的 API 参考,都能在其中找到答案。
结语
Elasticsearch 是一个强大且灵活的工具,广泛应用于各种场景。希望这篇零基础入门教程能帮助您搭建起基本的知识框架,并让您有信心继续深入学习。记住,最好的学习方法是动手实践!不断尝试、犯错、解决问题,您将越来越熟练地掌握 Elasticsearch。
祝您在 Elasticsearch 的学习旅程中取得成功!