Elasticsearch 教程:入门与基础介绍 – wiki基地


Elasticsearch 教程:入门与基础介绍

引言:揭秘强大的搜索与分析引擎

在当今数据爆炸的时代,如何高效地存储、检索和分析海量数据成为了企业面临的巨大挑战。传统的关系型数据库在处理全文搜索、实时分析以及PB级别的数据时往往力不从心。这时,一个专门为解决这些问题而生的技术应运而生,它就是——Elasticsearch。

Elasticsearch 不仅仅是一个数据库,更是一个分布式、RESTful 风格的搜索和分析引擎。它以其卓越的速度、可伸缩性和灵活性,在日志分析、电商搜索、数据可视化、安全情报等众多领域大放异彩。作为 Elastic Stack(前身为 ELK Stack:Elasticsearch, Logstash, Kibana)的核心组件,Elasticsearch 能够近乎实时地存储、搜索和分析大量数据,提供毫秒级的响应。

本教程旨在为初学者提供一个全面而深入的 Elasticsearch 入门指南,从核心概念到环境搭建,再到基本操作和高级特性,助您快速掌握 Elasticsearch 的基础知识,并迈出探索其强大功能的第一步。

第一章:Elasticsearch 核心概念解析

在深入实践之前,理解 Elasticsearch 的一些核心概念至关重要。这些概念构成了 Elasticsearch 分布式架构的基础。

1. 集群 (Cluster)

Elasticsearch 是一个分布式系统,集群是其最高层级的概念。一个集群由一个或多个节点组成,它们协同工作,共同存储和处理数据,提供统一的索引和搜索能力。集群通过一个唯一的名称(默认为 elasticsearch)来标识。

2. 节点 (Node)

节点是 Elasticsearch 集群中的一个独立服务器实例。每个节点都存储数据、参与集群的索引和搜索功能。一个集群可以包含多种类型的节点:
* Master Node (主节点):负责管理集群的元数据,如创建/删除索引、跟踪节点加入/离开集群等。集群中通常只有一个主节点。
* Data Node (数据节点):负责存储数据并执行数据相关的操作,如 CRUD (创建、读取、更新、删除) 和搜索聚合。
* Ingest Node (摄入节点):负责在文档被索引之前进行预处理,例如转换数据格式、移除字段等。
* Tribe Node (部落节点):在较旧版本中存在,用于连接多个集群,现在已被 Cross Cluster Search (跨集群搜索) 取代。
* Coordinating Node (协调节点):所有节点默认都具备协调能力,可以接收客户端请求,并将请求路由到正确的节点,然后汇集来自多个节点的结果。

3. 索引 (Index)

索引是 Elasticsearch 存储数据的地方,类似于关系型数据库中的“数据库”或“表”。一个索引是具有相似特征的文档集合,它们通常被分组在一起。例如,您可以有一个名为 products 的索引来存储所有商品信息,一个名为 logs 的索引来存储所有日志数据。索引通过名称来标识,并且是进行搜索、索引、更新和删除操作的入口。

4. 类型 (Type) – 已废弃

在 Elasticsearch 的早期版本中,每个索引可以包含一个或多个“类型”(Type),类似于关系型数据库中“表”的概念。例如,products 索引下可能有 electronicsbooks 两种类型。然而,由于类型与底层 Lucene 索引的工作方式不兼容,并且可能导致性能问题,Elasticsearch 7.x 版本中已经完全移除了类型。现在,一个索引只包含一种类型的文档。请注意:在最新的 Elasticsearch 版本中,您不再需要或应该使用类型。

5. 文档 (Document)

文档是 Elasticsearch 中最小的、可被索引的数据单元。它是一个 JSON 格式的结构化数据,可以包含各种字段和值,类似于关系型数据库中的“行”。每个文档在索引中都有一个唯一的 ID。

json
{
"title": "Elasticsearch 入门教程",
"author": "张三",
"publish_date": "2023-10-26",
"tags": ["搜索", "数据库", "NoSQL"],
"content": "这是一篇关于Elasticsearch基础概念和实践的教程。"
}

6. 字段 (Field)

文档由一个或多个字段组成,每个字段都是一个键值对,类似于关系型数据库中的“列”。字段有不同的数据类型,如字符串、数字、布尔值、日期等。

7. 映射 (Mapping)

映射定义了索引中文档及其字段的结构、数据类型以及如何被索引(例如,一个字符串字段是否可以全文搜索、是否区分大小写等)。Elasticsearch 可以根据数据的首次索引自动创建动态映射,但通常建议手动创建精确的映射以优化存储和搜索性能。

8. 分片 (Shard)

分片是 Elasticsearch 分布式架构的核心。一个索引可以被分成多个分片。每个分片都是一个独立的、功能完整的 Lucene 索引。将索引分成多个分片有两大好处:
* 横向扩展:一个索引的大小可以超出单个节点的存储限制,因为它分散在多个分片上,而这些分片可以分布在集群中的不同节点上。
* 提高性能:通过在多个分片上并行执行操作,可以显著提高索引和搜索的性能。

分片又分为:
* 主分片 (Primary Shard):存储实际数据。
* 副本分片 (Replica Shard):主分片的副本。副本分片有以下作用:
* 高可用性:当主分片所在的节点发生故障时,副本分片可以提升为主分片,确保数据不丢失,服务不中断。
* 提高搜索性能:搜索请求可以由主分片或其任何副本分片处理,从而分散负载,提高搜索吞吐量。

默认情况下,Elasticsearch 7.x 及更高版本创建的新索引只有一个主分片和一个副本分片。

9. 倒排索引 (Inverted Index)

倒排索引是 Elasticsearch 实现快速全文搜索的基石。传统数据库通过行 ID 查找数据,而倒排索引则通过“词条”查找包含该词条的文档 ID。

传统索引:
文档 1: “Hello World”
文档 2: “World is great”

倒排索引:
Hello -> [文档 1]
World -> [文档 1, 文档 2]
is -> [文档 2]
great -> [文档 2]

当您搜索“World”时,倒排索引能立即告诉您哪些文档包含这个词,从而实现极速响应。

10. RESTful API

Elasticsearch 提供了丰富的 RESTful API,允许您通过 HTTP 请求(GET, POST, PUT, DELETE)与集群进行交互,执行索引、搜索、更新、删除、管理等各种操作。这使得与 Elasticsearch 的集成变得非常简单和灵活。

第二章:环境搭建与初体验

接下来,我们将手把手教您如何搭建一个单节点的 Elasticsearch 环境,并启动 Kibana 进行可视化交互。

1. 前置条件:Java Development Kit (JDK)

Elasticsearch 是用 Java 编写的,因此需要 Java 运行环境。建议安装 OpenJDK 8 或更高版本。

  • 下载并安装 JDK:访问 OpenJDK 官网或 Adoptium (Eclipse Temurin) 下载适合您操作系统的 JDK 版本,并按照安装向导进行安装。
  • 配置 JAVA_HOME 环境变量:确保系统正确识别 Java 安装路径。

2. 下载 Elasticsearch 和 Kibana

访问 Elastic 官网下载页面:
* Elasticsearch 下载
* Kibana 下载

选择与您操作系统兼容的最新稳定版本(通常推荐.tar.gz.zip 文件)。

3. 启动 Elasticsearch

  1. 解压文件:将下载的 elasticsearch-<version>.zip.tar.gz 文件解压到您选择的目录(例如 C:\elasticsearch/usr/local/elasticsearch)。
  2. 配置 (可选):进入解压后的目录,打开 config 文件夹。
    • elasticsearch.yml:这是 Elasticsearch 的主配置文件。对于入门,通常无需修改。但您可以设置 cluster.namenode.name
    • jvm.options:调整 JVM 堆内存大小。生产环境中通常需要根据服务器内存进行调整,例如 -Xms4g -Xmx4g
  3. 启动

    • Windows:打开命令行,进入 bin 目录,运行 elasticsearch.bat
    • Linux/macOS:打开终端,进入 bin 目录,运行 ./elasticsearch

    您会看到大量日志输出。当看到类似 [INFO ... ] cluster health [green][INFO ... ] bound_addresses {..., publish_address {...}, ...} 等信息时,表示 Elasticsearch 已经成功启动。

  4. 验证:打开浏览器或使用 curl 命令访问 http://localhost:9200
    如果看到如下 JSON 响应,说明 Elasticsearch 正在运行:

    json
    {
    "name" : "your_node_name",
    "cluster_name" : "elasticsearch",
    "cluster_uuid" : "...",
    "version" : {
    "number" : "8.x.x",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "...",
    "build_date" : "...",
    "build_snapshot" : false,
    "lucene_version" : "...",
    "minimum_wire_compatibility_version" : "...",
    "minimum_index_compatibility_version" : "..."
    },
    "tagline" : "You Know, for Search"
    }

4. 启动 Kibana

Kibana 是 Elastic Stack 的可视化界面,提供了强大的数据探索、分析和管理工具,也是执行 Elasticsearch API 请求的便捷工具。

  1. 解压文件:将下载的 kibana-<version>.zip.tar.gz 文件解压到您选择的目录。
  2. 配置 (可选):进入解压后的目录,打开 config 文件夹,编辑 kibana.yml
    • server.port: 5601 (Kibana 默认端口)
    • server.host: "localhost"
    • elasticsearch.hosts: ["http://localhost:9200"] (确保指向您的 Elasticsearch 实例)
  3. 启动

    • Windows:打开命令行,进入 bin 目录,运行 kibana.bat
    • Linux/macOS:打开终端,进入 bin 目录,运行 ./kibana

    等待 Kibana 启动完成。

  4. 验证:打开浏览器访问 http://localhost:5601
    如果看到 Kibana 的登录界面(如果是新版本可能需要设置密码),或者直接进入主页,说明 Kibana 已经成功运行并连接到 Elasticsearch。

    重要提示:Elasticsearch 8.x 及更高版本默认启用了安全认证。首次启动时,Elasticsearch 会生成一个密码和注册令牌。您需要按照启动日志中的提示,使用 bin/elasticsearch-reset-password -u elastic 命令重置 elastic 用户的密码,并在 Kibana 启动时输入这个密码进行连接。如果希望暂时禁用安全功能以便快速入门,可以在 elasticsearch.yml 中添加 xpack.security.enabled: false,但这在生产环境中是极其不推荐的。

第三章:Elasticsearch 基本操作 (CRUD & 搜索)

现在,我们将在 Kibana 的 Dev Tools (开发工具) 中进行 Elasticsearch 的基本操作。在 Kibana 界面左侧导航栏找到 Dev Tools管理 -> 开发工具

1. 索引(创建/添加)文档

我们可以通过 POSTPUT 请求向索引中添加文档。

  • 自动生成 ID:使用 POST 请求,Elasticsearch 会自动为文档生成一个唯一的 ID。

    json
    POST /blogs/_doc
    {
    "title": "Elasticsearch 入门指南",
    "author": "李四",
    "publish_date": "2023-10-25",
    "tags": ["Elasticsearch", "教程", "搜索"],
    "content": "这是一篇非常详细的Elasticsearch入门指南,包含了核心概念和实践操作。"
    }

    响应会包含 _id 字段,即自动生成的文档 ID。

  • 指定 ID:使用 PUT 请求,您可以为文档指定一个 ID。如果 ID 存在,则更新文档;如果不存在,则创建新文档。

    json
    PUT /blogs/_doc/1
    {
    "title": "Kibana 数据可视化",
    "author": "王五",
    "publish_date": "2023-10-20",
    "tags": ["Kibana", "可视化", "数据分析"],
    "content": "Kibana是Elastic Stack的重要组成部分,用于数据的可视化和分析。"
    }

    响应会包含 _id1

2. 获取(读取)文档

通过 GET 请求,使用文档的 ID 可以获取特定文档。

json
GET /blogs/_doc/1

响应会返回 ID 为 1 的文档内容,包括 _source 字段。

3. 更新文档

更新文档有两种方式:
* 完全替换:使用 PUT 请求指定 ID,如果文档存在,新文档将完全替换旧文档。

```json
PUT /blogs/_doc/1
{
  "title": "Kibana 数据探索与分析",
  "author": "王五",
  "publish_date": "2023-10-20",
  "tags": ["Kibana", "可视化", "数据探索", "数据分析"],
  "content": "Kibana是Elastic Stack的重要组成部分,提供强大的数据可视化和分析能力。"
}
```
  • 部分更新:使用 POST 请求配合 _update 端点,可以只更新文档的特定字段。

    json
    POST /blogs/_update/1
    {
    "doc": {
    "tags": ["Kibana", "数据可视化", "仪表板"]
    }
    }

    这只会更新 tags 字段,其他字段保持不变。

4. 删除文档

通过 DELETE 请求,使用文档的 ID 可以删除特定文档。

json
DELETE /blogs/_doc/1

5. 搜索文档

搜索是 Elasticsearch 的核心功能。主要有两种搜索方式:URI 搜索和请求体搜索。

  • URI 搜索 (URI Search):简单快捷,通过 URL 参数进行查询。适用于简单的查询。

    GET /blogs/_search?q=Kibana
    这会搜索 blogs 索引中包含 “Kibana” 的所有文档。

  • 请求体搜索 (Request Body Search):强大灵活,通过 JSON 请求体构建复杂的查询。这是更常用和推荐的方式。

    json
    GET /blogs/_search
    {
    "query": {
    "match_all": {}
    }
    }

    match_all 查询会返回索引中的所有文档。

    常见的查询类型:

    • match 查询:最常用的全文搜索查询。它会对查询字符串进行分析器处理,然后匹配文档。

      json
      GET /blogs/_search
      {
      "query": {
      "match": {
      "content": "入门教程"
      }
      }
      }

      这会搜索 content 字段中包含“入门”或“教程”的文档。

    • term 查询:用于精确匹配单个词条。它不会对查询字符串进行分析器处理,要求查询词与文档中的词条完全一致(包括大小写、标点等)。适用于精确匹配,如 ID、状态码等。

      json
      GET /blogs/_search
      {
      "query": {
      "term": {
      "author.keyword": "李四"
      }
      }
      }

      注意author.keyword 表示使用 author 字段的非分析版本(通常用于精确匹配)。

    • bool 查询:结合多个查询条件,实现复杂的布尔逻辑。

      • must:文档必须满足所有条件(AND 关系),会计算相关性分数。
      • filter:文档必须满足所有条件(AND 关系),不会计算相关性分数,性能更好,适用于过滤。
      • should:文档应该满足至少一个条件(OR 关系),会影响相关性分数。
      • must_not:文档不能满足任何条件(NOT 关系)。

      json
      GET /blogs/_search
      {
      "query": {
      "bool": {
      "must": [
      { "match": { "content": "Elasticsearch" } },
      { "match": { "tags": "教程" } }
      ],
      "filter": [
      { "range": { "publish_date": { "gte": "2023-10-20" } } }
      ],
      "must_not": [
      { "term": { "author.keyword": "王五" } }
      ]
      }
      }
      }

      此查询将查找:内容包含 “Elasticsearch” 且标签包含 “教程” 的文档,同时要求发布日期在 2023-10-20 之后,并且作者不是 “王五”。

    • 高亮 (Highlighting):在搜索结果中高亮匹配的片段,便于用户快速定位关键词。

      json
      GET /blogs/_search
      {
      "query": {
      "match": {
      "content": "Elasticsearch"
      }
      },
      "highlight": {
      "fields": {
      "content": {}
      }
      }
      }

    • 分页 (Pagination):使用 fromsize 参数控制返回结果的起始位置和数量。

      json
      GET /blogs/_search
      {
      "query": {
      "match_all": {}
      },
      "from": 0, // 从第0个结果开始 (第一页)
      "size": 10 // 返回10个结果
      }

    • 排序 (Sorting):根据一个或多个字段进行排序。

      json
      GET /blogs/_search
      {
      "query": {
      "match_all": {}
      },
      "sort": [
      { "publish_date": { "order": "desc" } } // 按发布日期降序排列
      ]
      }

第四章:高级概念与功能简介

掌握了基本操作后,我们来看一些更高级但同样重要的概念。

1. 映射 (Mapping)

映射定义了文档中字段的类型以及如何处理这些字段。
* 动态映射 (Dynamic Mapping):当您第一次索引一个文档时,如果之前没有为某个字段定义映射,Elasticsearch 会尝试根据字段值的类型自动推断其类型并创建映射。例如,如果您索引一个包含 age: 30 的文档,Elasticsearch 会自动将其 age 字段映射为 long 类型。
* 显式映射 (Explicit Mapping):为了更精确地控制字段的行为,通常建议手动定义映射。这在需要自定义分析器、设置多字段(multi-fields)或控制索引行为时尤为重要。

**示例:创建带有自定义映射的索引**

```json
PUT /my_articles
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "ik_smart"  // 使用中文分词器 (需安装IK分词插件)
      },
      "content": {
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "tags": {
        "type": "keyword"   // 不分词,用于精确匹配和聚合
      },
      "publish_date": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss"
      },
      "view_count": {
        "type": "integer"
      }
    }
  }
}
```
通过 `GET /my_articles/_mapping` 可以查看索引的映射。

2. 分析器 (Analyzers)

分析器是 Elasticsearch 处理文本字段(text 类型)的关键组件,它将原始文本转换为可搜索的词条 (tokens)。一个分析器由以下部分组成:
* 字符过滤器 (Character Filters):在文本分词之前对文本进行处理,例如移除 HTML 标签、将特殊字符转换为普通字符。
* 分词器 (Tokenizer):将文本分解成独立的词条(Tokens)。例如,标准分词器会将“Quick Brown Fox”分解为“quick”、“brown”、“fox”。中文分词器(如 IK Analyzer、jieba)则针对中文特点进行分词。
* 词条过滤器 (Token Filters):对分词器生成的词条进行处理,例如将所有词条转换为小写、移除停用词(如“的”、“是”)、应用词干提取(如将“running”提取为“run”)。

正确选择和配置分析器对于实现高质量的搜索结果至关重要。

3. 聚合 (Aggregations)

聚合是 Elasticsearch 强大的分析能力的核心。它允许您在大量数据上执行复杂的数据汇总和统计操作,而无需获取原始文档。聚合可以回答“最受欢迎的商品是什么?”、“不同时间段内的日志量是多少?”这类问题。

聚合主要分为两类:
* 度量聚合 (Metrics Aggregations):计算某个字段的统计信息,如 sum (求和)、avg (平均值)、min (最小值)、max (最大值)、cardinality (基数,即不重复值的数量) 等。

```json
GET /my_articles/_search
{
  "size": 0,  // 不返回原始文档,只返回聚合结果
  "aggs": {
    "avg_view_count": {
      "avg": {
        "field": "view_count"
      }
    }
  }
}
```
  • 桶聚合 (Bucket Aggregations):根据某个条件将文档分组到“桶”中,每个桶代表一个分类。常见的桶聚合有:

    • terms:按字段的值进行分组(例如,按作者分组)。
    • range:按数值范围进行分组。
    • date_histogram:按时间间隔进行分组(例如,按天、按月)。

    示例:按作者统计文章数量

    json
    GET /my_articles/_search
    {
    "size": 0,
    "aggs": {
    "articles_by_author": {
    "terms": {
    "field": "author.keyword",
    "size": 10 // 返回前10位作者
    }
    }
    }
    }

    聚合可以嵌套,从而实现更复杂的分析,例如“按作者统计文章,并计算每位作者文章的平均浏览量”。

4. 集群健康状态 (Cluster Health)

了解集群的健康状态对于管理 Elasticsearch 至关重要。

  • Green (绿色):所有主分片和副本分片都正常运行,集群健康。
  • Yellow (黄色):所有主分片都正常运行,但至少有一个副本分片未分配(例如,某个节点宕机导致副本分片无法分配)。集群功能完整,但存在单点故障风险。
  • Red (红色):至少有一个主分片未分配(例如,所有包含该主分片的节点都宕机)。集群部分或全部数据不可用。

您可以通过 GET /_cluster/health 命令查看集群健康状态。

第五章:实际应用场景

Elasticsearch 的灵活性使其在各种场景中都有广泛应用:

  1. 日志和事件数据分析:Elastic Stack (ELK/ECK) 最经典的用途。Logstash 负责收集、处理日志,Elasticsearch 负责存储和索引,Kibana 负责可视化和分析。这对于监控、故障排查、安全审计等至关重要。
  2. 电商网站搜索:提供商品名称、描述、属性的毫秒级全文搜索,支持模糊查询、拼写纠错、相关性排序、聚合筛选(按品牌、价格、颜色等)。
  3. 内容管理系统 (CMS) 或网站搜索:为博客、新闻网站、文档系统提供强大的站内搜索功能,快速定位文章、文档。
  4. 业务智能 (BI) 与数据分析:对各种业务数据进行实时聚合和分析,生成仪表板和报告,辅助决策。
  5. 安全信息和事件管理 (SIEM):收集、关联和分析安全日志,实时检测威胁和异常行为。
  6. 地理空间数据搜索:支持地理位置搜索(Geo-spatial search),例如“查找附近 5 公里内的餐馆”。

第六章:总结与展望

通过本教程的学习,您应该对 Elasticsearch 的核心概念、基本操作以及一些高级功能有了初步的认识。您已经学会了如何搭建一个单节点环境,并使用 Kibana Dev Tools 进行文档的增删改查和复杂的搜索聚合。

Elasticsearch 的世界远不止于此,还有更多强大的功能等待您探索:

  • 索引生命周期管理 (ILM):自动化管理索引的生命周期,例如定期删除旧数据、将冷数据迁移到更廉价的存储。
  • 机器学习 (Machine Learning):异常检测、预测等。
  • 安全 (Security):用户认证、授权、TLS/SSL 加密。
  • SQL 支持:通过 ES/SQL 语法查询 Elasticsearch。
  • 性能优化与调优:如何优化索引性能、搜索性能、JVM 内存、分片策略等。
  • 生产部署与集群扩展:如何构建高可用、高性能的生产级 Elasticsearch 集群。
  • 集成:与各种编程语言(Java, Python, Node.js 等)的客户端库集成。

从现在开始,您可以尝试将自己的数据导入 Elasticsearch,并开始探索其强大的搜索和分析能力。持续学习和实践是掌握 Elasticsearch 的关键。祝您在 Elasticsearch 的探索之路上取得丰硕成果!


发表评论

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

滚动至顶部