Elasticsearch 零基础入门教程 – wiki基地


Elasticsearch 零基础入门教程:从概念到实战

欢迎来到 Elasticsearch 的世界!如果您是第一次听说它,或者听说过但不知道从何入手,那么这篇教程正是为您准备的。我们将从最基本的概念讲起,一步步带您了解 Elasticsearch 是什么、它能做什么,并亲手进行一些基础操作。无需任何 Elasticsearch 预备知识,只需要一点点好奇心!

阅读本文,您将了解到:

  • Elasticsearch 是什么?它有什么用?
  • Elasticsearch 的核心概念(索引、文档、节点、分片等)。
  • 如何快速搭建一个 Elasticsearch 环境(概述)。
  • 如何与 Elasticsearch 交互(REST API)。
  • Elasticsearch 的基础操作:索引、获取、更新、删除文档。
  • 如何进行基础搜索。
  • 一个简单的实战例子。
  • 相关工具 Kibana 的作用。

引言:为什么需要 Elasticsearch?

在互联网时代,数据量呈爆炸式增长。无论是网站内容、用户日志、商品信息还是监控指标,我们都需要高效地存储、检索和分析这些数据。传统的数据库(如 MySQL、PostgreSQL)在处理结构化数据方面非常强大,但在以下场景中可能会遇到挑战:

  1. 全文搜索: 当我们需要在海量文本内容中快速找到包含特定关键词的信息时,传统数据库的 LIKE 查询效率往往不高,而且难以处理复杂的搜索需求(如同义词、相关性排序等)。
  2. 实时分析: 需要对大量数据进行实时聚合、统计和分析,以获取趋势或洞察。
  3. 海量数据的存储与扩展: 数据量达到 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)

  • 每个字段都有对应的数据类型(如 textkeywordintegerdate 等)。
  • 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,您需要在您的机器上安装并运行它。作为入门教程,我们不提供详细的安装步骤(因为这取决于您的操作系统和偏好,且安装方式可能会随版本变化),但概述几种常见方式:

  1. 官方下载: 从 Elastic 官网下载对应您操作系统的安装包(ZIP, TAR, DEB, RPM 等),解压后即可运行。
  2. Docker: 使用 Docker 是非常便捷的方式,可以快速拉取 Elasticsearch 镜像并运行容器。
  3. 包管理器: 在 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 (通常在左侧导航栏的 ManagementDev 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) 以及操作结果 (resultcreated)。

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 之前不存在,resultcreated;如果存在,则是 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 将是 updatednoop (如果更新内容与原文档一致)。

您也可以更新自动生成的 ID 的文档,只需在 _update API 中使用该 ID。

5.4 删除文档 (Deleting Documents)

根据文档 ID 删除文档。使用 DELETE 方法:

kibana
DELETE /my_first_index/_doc/doc_1

响应中的 result 将是 deleted。如果文档不存在,仍然会返回 200,但 resultnot_found

5.5 简单搜索 (Simple Search)

搜索是 Elasticsearch 最核心的功能。使用 _search 端点,通常使用 GETPOST 方法。由于搜索请求体可能较大,通常推荐使用 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 查询是进行全文搜索的主要方式。它会对查询词进行分词处理,然后查找包含任意分词词条的文档。

搜索 titlecontent 字段中包含“教程”的文档:

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): 精确控制字段类型和索引行为。
  • 集群管理: 了解节点角色、集群健康、扩容缩容、快照恢复等。
  • 性能优化: 针对特定场景优化索引、查询和集群配置。

下一步建议:

  1. 继续练习: 尝试使用 Dev Tools 进行更多复杂的查询和聚合操作。
  2. 探索 Kibana: 使用 Discover 查看您的数据,尝试创建一些简单的可视化图表。
  3. 阅读官方文档: Elasticsearch 的官方文档非常全面和权威,是学习进阶知识的最佳资源。从概念到具体的 API 参考,都能在其中找到答案。

结语

Elasticsearch 是一个强大且灵活的工具,广泛应用于各种场景。希望这篇零基础入门教程能帮助您搭建起基本的知识框架,并让您有信心继续深入学习。记住,最好的学习方法是动手实践!不断尝试、犯错、解决问题,您将越来越熟练地掌握 Elasticsearch。

祝您在 Elasticsearch 的学习旅程中取得成功!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部