Elasticsearch 是什么?看这篇新手入门介绍就够了 – wiki基地


Elasticsearch 是什么?看这篇新手入门介绍就够了

在当今这个数据爆炸的时代,我们每天都在生成和消费海量的信息。无论是电商网站上数百万的商品、社交媒体上亿万的动态、系统运行产生的日志,还是企业内部积累的文档,如何快速、准确地从中找到所需信息,成为了一个巨大的挑战。传统的数据库在面对复杂的文本搜索、实时分析等场景时,往往显得力不从心。这时,一个强大的工具应运而生,它就是 Elasticsearch

如果你是第一次听说 Elasticsearch,或者对其只有模糊的概念,那么这篇文章就是为你量身定制的。我们将从基础出发,深入浅出地带你全面了解 Elasticsearch 是什么、它为什么如此流行、它的核心概念有哪些,以及它如何改变我们处理和利用数据的方式。看完这篇,你将对 Elasticsearch 有一个清晰而全面的认识。

一、Elasticsearch 到底是什么?

从本质上讲,Elasticsearch (简称 ES) 是一个基于 Apache Lucene 构建的开源、分布式、RESTful 风格的搜索和分析引擎

这个定义可能有点抽象,我们来拆解一下:

  1. 开源 (Open Source): Elasticsearch 的核心是开源的,这意味着任何人都可以免费下载、使用、修改其源代码。这极大地促进了它的普及和社区发展。虽然其母公司 Elastic 也提供商业版本和云服务,但其核心引擎的开放性是其成功的基石之一。
  2. 基于 Apache Lucene: Lucene 是一个非常成熟且强大的 Java 搜索库。你可以把它想象成一个高性能的“搜索引擎工具箱”。然而,直接使用 Lucene 需要编写复杂的 Java 代码。Elasticsearch 在 Lucene 的基础上进行了封装和扩展,提供了更易用的接口和更强大的功能,使得开发者无需深入了解 Lucene 的底层细节就能构建强大的搜索应用。
  3. 分布式 (Distributed): 这是 Elasticsearch 最核心的特性之一。它天生就是为处理大规模数据和高并发请求而设计的。数据可以被分割成多个部分(称为分片 Shard),存储在集群中的不同服务器(称为节点 Node)上。当你进行搜索或分析时,Elasticsearch 会自动将请求分发到相关的节点并行处理,然后汇总结果。这带来了高可用性(单个节点故障不影响服务)、高可扩展性(可以通过增加节点来线性提升存储容量和处理能力)和高性能
  4. RESTful 风格: Elasticsearch 提供了一套简单、一致、无状态的 RESTful API(基于 HTTP 协议,使用 GET, POST, PUT, DELETE 等方法)。这意味着你可以使用任何支持 HTTP 请求的工具或编程语言(如 Curl、Postman、Python、Java、JavaScript 等)轻松地与 Elasticsearch 进行交互,执行索引数据、搜索查询、管理集群等操作。这种标准化接口极大地降低了集成和使用的门槛。
  5. 搜索和分析引擎 (Search and Analytics Engine):
    • 搜索: 这是 Elasticsearch 的老本行。它擅长全文搜索 (Full-Text Search),能够快速地在大量非结构化或半结构化文本数据中查找相关内容,并根据相关性对结果进行排序。它支持复杂的查询语法、模糊搜索、地理位置搜索、聚合(Aggregations)等高级功能。
    • 分析: Elasticsearch 不仅仅能“搜得快”,还能“算得快”。其强大的聚合功能允许你对数据进行实时统计、分析和可视化。例如,你可以快速计算某个时间段内各类商品的销售额、分析网站访问日志以了解用户行为、监控服务器性能指标等。

通俗地理解:

想象一下,你有一个巨大的图书馆,里面藏有数不清的书籍(数据)。

  • Lucene 就像是图书馆底层最核心的图书索引卡片制作和查找规则,非常高效但使用复杂。
  • Elasticsearch 则像是一位超级图书管理员团队。
    • 他们使用 Lucene 的规则来管理所有书籍(构建索引)。
    • 他们把书籍分门别类,甚至把一本厚书拆分成几部分,交给不同的管理员保管(分布式存储、分片 Shard)。
    • 当你需要找书时(发起搜索请求),你只需要告诉前台(RESTful API)你要找什么。
    • 前台会将请求分派给相关的管理员(分布式查询),他们并行地在自己负责的区域查找。
    • 他们不仅能快速找到相关的书籍(全文搜索),还能告诉你哪些书被借阅最多、哪个主题的书最受欢迎(数据分析、聚合)。
    • 即使某个管理员生病请假了(节点故障),图书馆依然能正常运作,因为有其他管理员备份了他的工作(副本 Replica、高可用)。
    • 如果图书馆的书越来越多,可以雇佣更多的管理员(增加节点、水平扩展)。

总结来说,Elasticsearch 是一个设计用来快速存储、搜索和分析海量数据的强大平台,它易于使用、功能丰富、高度可扩展且具有容错能力。

二、为什么选择 Elasticsearch?(核心优势)

Elasticsearch 之所以如此受欢迎,并在众多场景下取代传统方案,主要得益于以下几个核心优势:

  1. 极高的性能和速度:

    • 基于 Inverted Index (倒排索引): 这是 Elasticsearch (以及 Lucene) 实现快速全文搜索的关键。与传统数据库为每一行数据建立索引不同,倒排索引是为文档中的每个词(Term)建立索引,记录包含该词的所有文档 ID。当搜索某个词时,可以直接通过索引找到所有相关文档,无需扫描整个数据集。
    • 缓存机制: Elasticsearch 大量使用缓存,包括节点查询缓存、分片请求缓存、文件系统缓存等,以加速重复查询和数据访问。
    • 近实时 (Near Real-Time, NRT): 从数据被索引到它可以被搜索到,通常只需要很短的时间(默认是 1 秒)。这使得 Elasticsearch 非常适合需要快速反映数据变化的场景。
  2. 强大的全文搜索能力:

    • 相关性评分 (Relevance Scoring): Elasticsearch 不仅能找到匹配的文档,还能根据相关性(如 TF-IDF、BM25 算法)对结果进行排序,将最相关的结果排在前面。
    • 灵活的查询 DSL (Query Domain Specific Language): 提供基于 JSON 的丰富查询语言,支持各种复杂的查询,如布尔组合 (must, should, must_not)、范围查询、模糊查询、短语查询、通配符查询、地理空间查询等。
    • 分析器 (Analyzers): 在索引和搜索时,文本数据会经过分析器处理,进行分词 (Tokenization)、词干提取 (Stemming)、去除停用词 (Stop words) 等操作,以提高搜索的准确性和召回率。例如,将 “running”、”ran” 都处理成 “run”,使得搜索 “run” 时能匹配到包含这些词的文档。
  3. 分布式架构带来的高可用和可扩展性:

    • 水平扩展 (Horizontal Scaling): 当数据量增大或并发请求增多时,只需向集群中添加更多的节点即可线性扩展存储容量和处理能力。这比传统数据库的垂直扩展(升级硬件)更灵活、成本更低。
    • 数据分片 (Sharding): 将索引数据分割成多个分片,分布在不同节点上,实现了数据的分布式存储和并行处理。
    • 数据复制 (Replication): 每个主分片可以有零个或多个副本分片,分布在不同的节点上。副本不仅提供了数据冗余(某个节点宕机,数据不会丢失),还可以分担读请求,提高查询吞吐量。这保证了服务的高可用性。
  4. 强大的数据聚合与分析能力:

    • 聚合 (Aggregations): 这是 Elasticsearch 的另一大杀器。它允许你在查询的同时,对数据进行复杂的统计分析。常见的聚合类型包括:
      • 指标聚合 (Metrics Aggregations): 计算数值统计,如 sum, avg, min, max, cardinality (去重计数), percentiles (百分位数) 等。
      • 桶聚合 (Bucket Aggregations): 将文档划分到不同的“桶”中,类似 SQL 的 GROUP BY。例如,按产品类别、时间范围、地理位置等分组。
      • 管道聚合 (Pipeline Aggregations): 对其他聚合的结果进行再聚合或处理。
    • 聚合操作是实时执行的,非常适合需要快速洞察数据的场景,如仪表盘展示、业务监控等。
  5. 面向文档,模式灵活 (Schema Flexible):

    • 文档存储: Elasticsearch 以 JSON 文档的形式存储数据。JSON 格式灵活,易于理解和使用,非常适合存储半结构化或非结构化数据。
    • 动态映射 (Dynamic Mapping): 默认情况下,Elasticsearch 可以自动检测新字段并为其创建映射(定义数据类型和索引方式)。这在开发初期或数据结构不确定时非常方便。
    • 显式映射 (Explicit Mapping): 为了更精确地控制字段类型、索引方式和分析器,你也可以预先定义索引的映射(Schema)。这在生产环境中是推荐的做法。
  6. 简单的 RESTful API 和丰富的生态:

    • 易于集成: 标准的 REST API 使得与各种应用程序、脚本和工具集成变得非常简单。
    • 多语言客户端: Elastic 官方和社区提供了多种编程语言的客户端库(Java, Python, Go, Ruby, JavaScript, .NET 等),方便开发者在自己的应用中调用 Elasticsearch 功能。
    • Elastic Stack (ELK Stack): Elasticsearch 通常与 Logstash (数据收集和处理)、Kibana (数据可视化和仪表盘) 以及 Beats (轻量级数据采集器) 协同工作,构成强大的 Elastic Stack(曾被称为 ELK Stack),广泛应用于日志分析、应用性能监控 (APM)、安全信息和事件管理 (SIEM) 等领域。

三、Elasticsearch 核心概念详解

要深入理解 Elasticsearch 的工作原理,必须掌握以下几个核心概念:

  1. 节点 (Node):

    • 一个 Elasticsearch 实例就是一个节点。节点是集群的组成单元。
    • 每个节点都有一个唯一的名称(通常在启动时自动生成或手动配置)和一个传输地址(用于节点间通信)。
    • 节点扮演不同的角色:
      • 主节点 (Master Node): 负责集群范围的管理操作,如创建/删除索引、跟踪节点状态、决定分片分配等。一个集群只有一个活跃的主节点。主节点不参与文档级别的操作(索引、搜索)。
      • 数据节点 (Data Node): 存储数据(分片)并处理数据相关的操作,如 CRUD、搜索、聚合。这是最消耗 CPU、内存和 I/O 的角色。
      • 协调节点 (Coordinating Node): 接收客户端请求,将请求转发给相应的数据节点,然后收集结果并返回给客户端。所有节点默认都是协调节点。可以配置专门的协调节点来分担主节点和数据节点的压力。
      • 摄入节点 (Ingest Node): 在文档被索引之前,对其进行预处理(如添加字段、转换格式等)。
      • 机器学习节点 (Machine Learning Node): 运行机器学习任务(需要特定许可证)。
    • 在小型或开发环境中,一个节点可以扮演多个角色。在大型生产环境中,通常会配置专门角色的节点。
  2. 集群 (Cluster):

    • 一个或多个节点组成的集合,它们共同持有所有数据,并提供联合的索引和搜索功能。
    • 集群通过一个唯一的名称来标识(默认为 “elasticsearch”)。同一网络内的节点,如果集群名称相同,会自动发现并组成一个集群。
    • 集群具有高可用性和容错性。
  3. 索引 (Index):

    • 类似于关系数据库中的“数据库 (Database)”或 SQL 中的“表 (Table)”(虽然不完全等同)。它是具有相似特征的文档的集合。
    • 每个索引都有一个唯一的名称(必须小写),用于在执行索引、搜索、更新、删除操作时指定目标。
    • 一个集群可以包含任意多个索引。
  4. 类型 (Type) – (历史概念,需注意):

    • 在 Elasticsearch 的早期版本中,一个索引可以包含多个类型 (Type),类似于数据库中的“表 (Table)”。类型用于逻辑上区分索引内的不同文档类别。
    • 重要: 从 Elasticsearch 6.0 开始,类型被逐步废弃。7.0 版本开始,一个索引只能包含一个默认类型 _doc。从 8.0 版本开始,类型概念被完全移除。
    • 现在,推荐的做法是为不同的文档结构使用不同的索引(例如 products 索引和 users 索引),而不是在同一个索引中使用不同的类型。
  5. 文档 (Document):

    • 存储在 Elasticsearch 中的基本信息单元,相当于关系数据库中的“行 (Row)”。
    • 文档以 JSON (JavaScript Object Notation) 格式表示。
    • 每个文档都属于一个索引,并有一个唯一的 ID(可以自动生成,也可以手动指定)。
    • 例如,一个代表用户的文档可能看起来像这样:
      json
      {
      "user_id": 123,
      "username": "john_doe",
      "email": "[email protected]",
      "join_date": "2023-10-27T10:00:00Z",
      "interests": ["hiking", "photography", "coding"]
      }
  6. 映射 (Mapping):

    • 定义索引中的文档如何存储和索引其字段的过程。类似于数据库中的“模式 (Schema)”。
    • 映射定义了:
      • 每个字段的数据类型(如 text, keyword, integer, float, date, boolean, geo_point 等)。
      • 字段是否应该被索引(index: true/false)。
      • 字段值是否应该被存储(store: true/false)。
      • 对于 text 类型的字段,使用哪个分析器 (Analyzer)。
      • 其他索引选项(如 doc_values, norms 等)。
    • 如前所述,可以是动态映射(ES 自动推断)或显式映射(用户预先定义)。生产环境强烈建议使用显式映射。
  7. 分片 (Shard):

    • 由于单个节点可能无法存储所有数据或处理所有请求,Elasticsearch 允许将一个索引分割成多个部分,称为分片。
    • 每个分片本身就是一个功能齐全且独立的“索引”,可以托管在集群中的任何节点上。
    • 分片是 Elasticsearch 实现水平扩展并行处理的基础。
      • 扩展性: 索引的存储容量不再受限于单个节点的硬件。数据可以分布在多个节点上。
      • 性能: 搜索和聚合操作可以在所有分片上并行执行,提高了处理速度。
    • 一个索引的分片数量在创建时指定,并且创建后通常不能更改(可以通过 reindex 操作间接实现)。因此,合理规划分片数量非常重要。
    • 分片分为两种:
      • 主分片 (Primary Shard): 索引中的每个文档都属于一个主分片。写入操作(索引、更新、删除)首先在主分片上执行,然后同步到其副本分片。一个索引的主分片数量决定了其最大存储容量(理论上)。
      • 副本分片 (Replica Shard): 是主分片的精确拷贝。副本提供数据冗余和高可用性。如果持有主分片的节点失败,一个副本分片会被提升为新的主分片。副本还可以处理读请求(搜索、聚合),从而提高查询吞吐量。
    • 一个索引的副本数量可以随时动态调整。通常建议至少设置一个副本(number_of_replicas: 1),以确保高可用。
  8. 倒排索引 (Inverted Index):

    • Elasticsearch 快速搜索的核心数据结构。
    • 它不是存储“文档 -> 词”,而是存储“词 -> 文档列表”。
    • 构建过程大致如下:
      1. 分词 (Tokenization): 将文档内容拆分成独立的词(Tokens)。
      2. 标准化 (Normalization): 将词转换为标准形式(如转小写、词干提取)。
      3. 建立索引: 为每个唯一的词创建一个条目,并记录包含该词的所有文档 ID 以及词在文档中的位置、频率等信息。
    • 例如,对于文档:
      • Doc 1: “Elasticsearch is fast”
      • Doc 2: “Search engine is powerful”
    • 简化的倒排索引可能看起来像:
      • “elasticsearch”: [Doc 1]
      • “is”: [Doc 1, Doc 2]
      • “fast”: [Doc 1]
      • “search”: [Doc 2]
      • “engine”: [Doc 2]
      • “powerful”: [Doc 2]
    • 当搜索 “fast” 时,ES 只需查找 “fast” 条目,立即知道 Doc 1 包含该词。
  9. 分析 (Analysis) 与分析器 (Analyzer):

    • 分析是将文本数据转换为可供搜索的词(Tokens)的过程。这个过程在文档被索引时和查询文本被处理时都会发生。
    • 分析器是执行分析任务的组件,通常由三部分组成:
      • 字符过滤器 (Character Filters): 在分词前对原始文本进行处理,如去除 HTML 标签。
      • 分词器 (Tokenizer): 将文本流分割成独立的词(Tokens)。例如,standard 分词器按空格和标点符号分割。
      • 词单元过滤器 (Token Filters): 对分词器产生的词进行处理,如转小写 (Lowercase Token Filter)、去除停用词 (Stop Token Filter)、词干提取 (Stemming Token Filter) 等。
    • Elasticsearch 内置了多种分析器(如 standard, simple, whitespace, keyword 等),也允许用户自定义分析器以满足特定的语言或业务需求。正确配置分析器对于搜索质量至关重要。
  10. REST API:

    • 与 Elasticsearch 交互的主要方式。使用标准的 HTTP 方法(GET, POST, PUT, DELETE)和 JSON 请求体。
    • 常见操作示例:
      • 检查集群健康: GET /_cluster/health
      • 创建索引: PUT /my_index
      • 索引文档: POST /my_index/_doc/1PUT /my_index/_doc/1 (指定 ID)
      • 获取文档: GET /my_index/_doc/1
      • 搜索文档: GET /my_index/_searchPOST /my_index/_search (带查询体)
      • 删除文档: DELETE /my_index/_doc/1
      • 删除索引: DELETE /my_index

四、Elasticsearch 的典型应用场景

凭借其强大的搜索、分析能力和分布式特性,Elasticsearch 被广泛应用于各种场景:

  1. 站内搜索 / 应用搜索: 这是最经典的应用。为网站、App、电商平台提供快速、精准、功能丰富的商品搜索、文章搜索、用户搜索等。例如,GitHub 的代码搜索、Stack Overflow 的问题搜索、维基百科的词条搜索都使用了 Elasticsearch。
  2. 日志管理与分析 (Log Management and Analytics): Elasticsearch 是 Elastic Stack (ELK) 的核心。通过 Beats 采集服务器、应用、网络设备等产生的日志,经 Logstash 清洗、转换后存入 Elasticsearch,再由 Kibana 进行实时查询、分析和可视化。运维人员可以快速定位问题、监控系统状态、分析用户行为。
  3. 指标监控与分析 (Metrics Monitoring and Analytics): 类似于日志分析,可以收集系统性能指标(CPU、内存、磁盘、网络)、应用性能指标 (APM) 等,存储在 Elasticsearch 中进行实时监控、告警和趋势分析。
  4. 业务智能与数据可视化 (Business Intelligence & Data Visualization): Elasticsearch 的聚合能力使其成为一个强大的实时 BI 工具。可以快速分析销售数据、用户数据、市场数据等,并通过 Kibana 或其他 BI 工具(如 Grafana, Tableau)生成报表和仪表盘,辅助决策。
  5. 安全信息和事件管理 (SIEM – Security Information and Event Management): 收集和分析安全相关的日志和事件(如防火墙日志、入侵检测系统日志),用于威胁检测、安全审计和应急响应。Elastic SIEM 就是基于 Elastic Stack 构建的安全解决方案。
  6. 地理空间数据分析与搜索 (Geospatial Data Analysis and Search): Elasticsearch 支持 geo_pointgeo_shape 数据类型,可以存储地理位置信息,并执行复杂的地理空间查询,如查找指定半径范围内的点、判断点是否在某个区域内等。适用于 LBS 应用、地图服务、物流跟踪等。
  7. 推荐系统 (Recommendation Engine): 虽然不是专门的推荐引擎,但 Elasticsearch 的 “More Like This” 查询等功能可以用于构建简单的内容推荐或相关性推荐。

五、开始使用 Elasticsearch

想要开始体验 Elasticsearch?有几种常见的方式:

  1. 本地安装: 从 Elastic 官网下载对应操作系统的安装包,按照文档进行安装和配置。适合学习和开发。
  2. Docker 运行: Elastic 官方提供了 Docker 镜像。使用 Docker 可以快速启动单节点或多节点的 Elasticsearch 集群,环境隔离性好。
  3. Elastic Cloud: Elastic 官方提供的托管服务。无需关心底层的安装、运维和扩展,可以直接在云上创建和使用 Elasticsearch 集群。提供不同规模和功能的订阅计划。适合生产环境和希望减少运维负担的用户。

启动 Elasticsearch 后,可以通过以下方式与其交互:

  • Kibana Dev Tools: Kibana 提供了一个方便的 Web UI (开发者工具 Console),可以直接在浏览器中编写和发送 REST API 请求给 Elasticsearch,并查看结果。这是学习和调试查询的最佳方式。
  • Curl 或其他 HTTP 客户端: 使用命令行工具 curl 或 Postman 等图形化工具发送 HTTP 请求。
  • 官方客户端库: 在你的应用程序代码中引入相应语言的 Elasticsearch 客户端库。

一个简单的交互示例 (使用 Kibana Dev Tools 或 Curl):

“`bash

1. 创建一个名为 ‘my_products’ 的索引

PUT /my_products
{
“settings”: {
“number_of_shards”: 1,
“number_of_replicas”: 0
},
“mappings”: {
“properties”: {
“name”: { “type”: “text” },
“description”: { “type”: “text” },
“price”: { “type”: “float” },
“tags”: { “type”: “keyword” },
“available”: { “type”: “boolean” },
“release_date”: { “type”: “date” }
}
}
}

2. 索引一篇文档 (ID 会自动生成)

POST /my_products/_doc
{
“name”: “Awesome Gadget”,
“description”: “A very fast and reliable gadget for everyday use.”,
“price”: 99.99,
“tags”: [“tech”, “gadget”, “new”],
“available”: true,
“release_date”: “2024-01-15T12:00:00Z”
}

3. 索引另一篇文档 (指定 ID 为 1)

PUT /my_products/_doc/1
{
“name”: “Super Widget”,
“description”: “An affordable widget, quite fast too.”,
“price”: 49.50,
“tags”: [“tech”, “widget”],
“available”: true,
“release_date”: “2023-11-20T08:30:00Z”
}

4. 刷新索引,使新文档可搜索 (在 NRT 环境下通常不需要手动执行)

POST /my_products/_refresh

5. 搜索名称或描述中包含 “fast” 的产品

GET /my_products/_search
{
“query”: {
“multi_match”: {
“query”: “fast”,
“fields”: [“name”, “description”]
}
}
}

6. 聚合查询:按 ‘tags’ 统计产品数量

GET /my_products/_search
{
“size”: 0, # 不需要返回文档内容,只关心聚合结果
“aggs”: {
“products_by_tag”: {
“terms”: { “field”: “tags” }
}
}
}
“`

六、新手需要注意的事项

  • 理解核心概念: 掌握节点、集群、索引、分片、副本、映射等概念是基础。
  • 合理规划分片: 索引的主分片数一旦设定通常不能修改,需要根据预期数据量和查询负载提前规划。过少可能导致单分片过大影响性能和扩展,过多则会增加集群管理开销。
  • 重视映射设计: 使用显式映射来精确控制字段类型和索引方式,避免动态映射带来的潜在问题。特别是区分 text(用于全文搜索,会分词)和 keyword(用于精确匹配、排序、聚合,不分词)。
  • 理解查询与过滤上下文: Elasticsearch 查询有查询上下文 (Query Context,关心相关性得分) 和过滤上下文 (Filter Context,只关心是否匹配,不计分,通常更快且可缓存)。合理使用过滤上下文能提升性能。
  • 循序渐进学习查询 DSL: 查询 DSL 功能强大但也复杂,从简单的 match 查询开始,逐步学习 bool 组合、term 精确匹配、范围查询、聚合等。
  • 监控集群状态: 使用 Kibana Stack Monitoring 或其他监控工具密切关注集群健康、节点负载、JVM 堆内存使用、查询性能等指标。
  • 备份与恢复: 制定合理的快照备份策略,以防数据丢失。

七、总结

Elasticsearch 已经从一个单纯的全文搜索引擎,发展成为一个功能全面、性能卓越、高度可扩展的数据平台,广泛应用于搜索、日志分析、指标监控、业务智能、安全分析等众多领域。其分布式的特性、灵活的文档存储、强大的聚合能力以及简单的 RESTful API,使其成为现代数据架构中不可或缺的一环。

对于新手而言,理解其核心概念(节点、集群、索引、分片、副本、映射、倒排索引)是入门的关键。通过实践操作(本地安装、Docker 或 Elastic Cloud),结合 Kibana Dev Tools 进行交互式学习,可以快速掌握其基本用法。虽然初看起来概念较多,但其设计哲学和核心优势(速度、扩展性、灵活性)使得学习曲线相对平缓,且回报丰厚。

希望这篇详尽的入门介绍能够帮助你清晰地理解 Elasticsearch 是什么,并为你后续深入学习和应用打下坚实的基础。数据的价值在于被发现和利用,而 Elasticsearch 正是那个帮你点亮数据、挖掘价值的强大引擎。

发表评论

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

滚动至顶部