Elasticsearch教程:从入门到精通 – wiki大全


Elasticsearch教程:从入门到精通

1. 引言

在当今数据爆炸的时代,高效地存储、搜索和分析海量数据成为了企业和开发者面临的关键挑战。关系型数据库在处理全文搜索和大规模非结构化数据方面往往力不从心。这时,Elasticsearch 应运而生,成为了一个强大的解决方案。

什么是 Elasticsearch?

Elasticsearch 是一个开源的、分布式的、RESTful 风格的搜索与分析引擎,构建在 Apache Lucene 库之上。它以其惊人的速度、水平扩展能力以及处理各种数据类型的灵活性而闻名。Elasticsearch 不仅仅是一个搜索引擎,它还是一个 NoSQL 数据库,能够近乎实时地存储、搜索和分析大数据量。

为什么选择 Elasticsearch?

  • 极致的速度与近实时搜索: Elasticsearch 能够以极快的速度对数据进行索引和搜索,响应时间通常在毫秒级。
  • 强大的水平扩展能力: 作为一个分布式系统,Elasticsearch 可以从单机扩展到数百台服务器,轻松处理PB级别的数据。
  • 多功能性: 广泛应用于应用程序搜索、企业搜索、日志和指标分析(ELK Stack的核心)、安全分析等多个领域。
  • RESTful API: 通过简单的 HTTP 请求即可与 Elasticsearch 进行交互,学习曲线相对平缓。
  • 灵活的数据模型: 支持非结构化和半结构化数据,存储为 JSON 文档。

Elasticsearch 通常与 Logstash(数据收集和处理)和 Kibana(数据可视化)一起构成强大的 ELK Stack(现在更常称为 Elastic Stack),提供端到端的数据管理和分析解决方案。

2. 核心概念

要精通 Elasticsearch,首先需要理解其核心概念:

  • 文档 (Document):

    • Elasticsearch 中最小的存储单元。
    • 以 JSON 格式表示,是可被索引的基本信息单元。
    • 每个文档都有一个唯一的 ID。
    • 示例:
      json
      {
      "user": "Alice",
      "message": "Hello Elasticsearch!",
      "timestamp": "2023-01-01T12:00:00Z"
      }
  • 索引 (Index):

    • 文档的集合,类似于关系型数据库中的“数据库”。
    • 每个文档都必须属于一个索引。
    • 索引名称必须是小写。
    • 它是进行搜索、更新和删除操作的入口。
  • 类型 (Type) (Elasticsearch 7.x 及更高版本已移除此概念):

    • 在早期版本中,一个索引可以包含多个类型,类似于数据库中的“表”。
    • 但在 7.x 及更高版本中,一个索引只支持一个默认的 _doc 类型。这是为了简化数据模型,避免了不同类型在同一索引中可能导致的问题。
  • 分片 (Shard):

    • 索引的水平分区。由于一个索引可能存储大量数据,单机可能无法容纳,分片机制可以将索引数据分散到多个节点上。
    • 主分片 (Primary Shard): 存储索引数据的实际部分。索引创建时,主分片的数量就已确定且不能更改。
    • 副本分片 (Replica Shard): 主分片的精确副本,提供数据冗余(高可用性)和增加搜索吞吐量。副本分片的数量可以在运行时动态调整。
    • 分片是 Elasticsearch 分布式架构的核心,实现了数据的水平扩展和容错。
  • 副本 (Replica):

    • 指副本分片。它们是主分片的冗余备份,用于:
      • 高可用性: 当主分片所在的节点故障时,副本分片可以提升为新的主分片,保证服务不中断。
      • 提高查询性能: 搜索请求可以由主分片或其任何副本分片处理,从而分散负载,提高并发处理能力。
  • 节点 (Node):

    • 一个运行中的 Elasticsearch 实例。
    • 节点可以配置为不同的角色:
      • 数据节点 (Data Node): 存储分片数据。
      • 主节点 (Master Node): 负责管理集群状态,例如创建/删除索引、跟踪节点加入/离开集群等。集群中通常会选举一个主节点。
      • 协调节点 (Coordinating Node): 处理客户端请求,将请求路由到正确的分片,并聚合结果。
      • 摄取节点 (Ingest Node): 允许在索引文档之前对其进行预处理。
  • 集群 (Cluster):

    • 由一个或多个节点组成的集合,它们共同存储数据并提供索引和搜索功能。
    • 通过集群名称(cluster.name)来识别。
  • 映射 (Mapping):

    • 定义了文档及其字段的存储和索引方式。
    • 指定了每个字段的数据类型(如 text, keyword, integer, date 等)以及如何分析它们。
    • 正确的映射对于高效的查询至关重要。
    • 动态映射: Elasticsearch 会尝试根据接收到的文档自动推断字段类型。
    • 显式映射: 可以手动定义映射,以确保数据以期望的方式被索引。
  • 分析器 (Analyzer):

    • 在索引和搜索时,用于处理文本字段的模块。
    • 它将原始文本分解成独立的词条(tokens),并进行标准化处理(如转换为小写、去除停用词等),以便于搜索。
    • 一个分析器通常由以下三部分组成:
      • 字符过滤器 (Character Filters): 在文本被分词器处理之前,对文本进行处理(如删除 HTML 标签)。
      • 分词器 (Tokenizer): 将文本分解成词条。
      • 词条过滤器 (Token Filters): 对词条进行处理(如小写化、添加同义词、去除停用词)。

3. 安装与设置

Elasticsearch 的安装相对简单,支持多种方式:

先决条件:

  • Java Development Kit (JDK) 8 或更高版本。Elasticsearch 100% 使用 Java 开发,并且需要 Java 运行时环境。

安装方法:

  1. 手动安装 (zip/tar.gz):

    • 从 Elastic 官方网站下载对应操作系统的 .zip (Windows) 或 .tar.gz (Linux/macOS) 文件。
    • 解压到指定目录。
    • 进入解压后的目录,通过 bin/elasticsearch (Linux/macOS) 或 bin\elasticsearch.bat (Windows) 启动。
    • 优点: 简单直接。
    • 缺点: 升级和管理相对繁琐。
  2. 包管理器安装 (apt/yum):

    • 对于 Debian/Ubuntu 系统,可以使用 apt
    • 对于 RedHat/CentOS 系统,可以使用 yum
    • 优点: 易于安装、升级和管理,与操作系统集成度高。
    • 缺点: 可能不是最新版本。
  3. Docker 安装:

    • 最推荐的开发和测试环境安装方式。
    • 运行 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.x.x 拉取镜像。
    • 运行 docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.x.x 启动单节点实例。
    • 优点: 快速部署、环境隔离、易于管理和移植。
    • 缺点: 需要了解 Docker 基础知识。
  4. 云服务:

    • Elastic Cloud (官方托管服务)。
    • AWS Elasticsearch Service (现在是 Amazon OpenSearch Service)。
    • 阿里云、腾讯云等提供 Elasticsearch 托管服务。
    • 优点: 无需自行运维,弹性伸缩,高可用。
    • 缺点: 成本较高,灵活性受限。

基本配置 (config/elasticsearch.yml):

  • cluster.name: 定义集群名称,所有节点必须有相同的集群名称才能加入同一个集群。
  • node.name: 定义节点名称。
  • network.host: 绑定网络接口,默认为 127.0.0.1。生产环境通常配置为实际 IP。
  • http.port: HTTP API 端口,默认为 9200
  • transport.port: 节点间通信端口,默认为 9300
  • path.data: 数据存储路径。
  • path.logs: 日志存储路径。
  • discovery.seed_hosts: 集群发现的种子节点列表(用于多节点集群)。
  • cluster.initial_master_nodes: 首次启动集群时,指定有资格成为主节点的节点名称列表。

4. 基本操作

Elasticsearch 主要通过 RESTful API 进行交互,你可以使用 curl 命令行工具、Postman 或各种编程语言的客户端库。

4.1 索引数据 (CRUD)

1. 创建/索引文档 (Create/Index Document):

  • 自动生成 ID:
    bash
    POST /my_index/_doc
    {
    "title": "Elasticsearch 入门",
    "author": "张三",
    "publish_date": "2023-01-01"
    }

    响应会包含生成的 _id

  • 指定 ID:
    bash
    PUT /my_index/_doc/1
    {
    "title": "Elasticsearch 进阶",
    "author": "李四",
    "publish_date": "2023-02-15"
    }

    如果 ID 1 已存在,则会更新文档。如果不存在,则创建。

2. 获取文档 (Get Document):

bash
GET /my_index/_doc/1

获取 ID 为 1 的文档。

3. 更新文档 (Update Document):

  • 部分更新 (Partial Update): 只更新文档的部分字段,推荐使用此方式。
    bash
    POST /my_index/_update/1
    {
    "doc": {
    "author": "王五"
    }
    }

  • 替换整个文档:
    bash
    PUT /my_index/_doc/1
    {
    "title": "Elasticsearch 高级技巧",
    "author": "王五",
    "publish_date": "2023-03-20",
    "tags": ["search", "analytics"]
    }

    这会完全替换掉 ID 为 1 的文档。

4. 删除文档 (Delete Document):

bash
DELETE /my_index/_doc/1

删除 ID 为 1 的文档。

4.2 查询数据 (Querying)

Elasticsearch 使用基于 JSON 的 Query DSL (Domain Specific Language) 进行查询。

1. 基本查询 (Match All Query):

bash
GET /my_index/_search
{
"query": {
"match_all": {}
}
}

返回 my_index 索引中的所有文档。

2. 精确匹配查询 (Term Query):
用于精确匹配非文本字段(如 keywordnumericdate)或未被分析的文本字段。

bash
GET /my_index/_search
{
"query": {
"term": {
"author.keyword": "王五"
}
}
}

查询 author 字段精确匹配 “王五” 的文档(假设 author 字段有 keyword 子字段)。

3. 模糊匹配查询 (Match Query):
用于全文搜索,会根据字段的分析器对查询字符串进行分析,然后进行匹配。

bash
GET /my_index/_search
{
"query": {
"match": {
"title": "Elasticsearch 高级"
}
}
}

查询 title 字段包含 “Elasticsearch” 或 “高级”(或两者)的文档。

4. 组合查询 (Bool Query):
使用 must (AND)、should (OR)、must_not (NOT)、filter (非评分查询) 来组合多个查询条件。

bash
GET /my_index/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } }
],
"filter": [
{ "range": { "publish_date": { "gte": "2023-02-01" } } }
],
"should": [
{ "match": { "author": "李四" } }
],
"must_not": [
{ "term": { "tags.keyword": "deprecated" } }
]
}
}
}

5. 范围查询 (Range Query):

bash
GET /my_index/_search
{
"query": {
"range": {
"publish_date": {
"gte": "2023-01-01",
"lte": "2023-03-31",
"format": "yyyy-MM-dd"
}
}
}
}

查询 publish_date 在指定日期范围内的文档。

5. 进阶特性

掌握了基本操作后,Elasticsearch 真正强大的功能才得以展现。

5.1 聚合 (Aggregations)

聚合是 Elasticsearch 最强大的功能之一,它允许你从数据中提取复杂的统计信息、指标和洞察。它类似于 SQL 中的 GROUP BY 和聚合函数(如 SUM, AVG, COUNT)。

  • Metric Aggregations (指标聚合): 计算字段的统计信息。

    • avg: 平均值
    • sum: 总和
    • min: 最小值
    • max: 最大值
    • cardinality: 去重计数
    • stats, extended_stats: 综合统计
  • Bucket Aggregations (桶聚合): 将文档分组到“桶”中。

    • terms: 根据字段的值进行分组(最常用)。
    • range: 根据数值范围或日期范围进行分组。
    • date_histogram: 根据时间间隔(如每天、每月)进行分组。
    • histogram: 根据数值间隔进行分组。
  • 示例 (计算平均价格并按品牌分组):
    bash
    GET /products/_search
    {
    "size": 0, # 不返回原始文档
    "aggs": {
    "by_brand": {
    "terms": {
    "field": "brand.keyword"
    },
    "aggs": {
    "avg_price": {
    "avg": {
    "field": "price"
    }
    }
    }
    }
    }
    }

5.2 搜索相关性 (Search Relevance)

提高搜索结果的相关性是构建优质搜索引擎的关键。Elasticsearch 提供了多种机制来调整评分 (score)。

  • Boost (提升):

    • 在查询中通过 boost 参数为特定词或字段增加权重,使其在评分时更重要。
    • 示例:
      json
      "match": {
      "title": {
      "query": "Elasticsearch",
      "boost": 2
      }
      }
  • Function Score Query:

    • 允许你用一个函数来计算文档的评分,结合文档本身的分数和一些自定义函数。
    • 支持 weight, random_score, field_value_factor, script_score, decay functions 等。
    • 常用于根据文档的新旧、受欢迎程度等因素调整相关性。
  • 自定义分析器:

    • 通过定义更专业的分析器,例如同义词(synonym)、停用词(stop)、词干提取(stemming)等,可以显著提高搜索的准确性。

5.3 全文搜索 (Full-Text Search)

Elasticsearch 能够进行快速高效的全文搜索,这得益于其底层 Lucene 的倒排索引 (Inverted Index) 结构。

  • 倒排索引:

    • 一种将文档中的“词”映射到包含这些词的“文档”的索引结构。
    • 当一个文档被索引时,Elasticsearch 会分析文本,提取出词条,并建立词条到文档的映射。
    • 这使得根据关键词快速找到相关文档成为可能。
  • Query String Query:

    • 允许用户在查询字符串中指定 Lucene 查询语法,进行更复杂的全文搜索。
    • 示例: title:(Elasticsearch AND "高级技巧") OR author:王五
  • Multi-Match Query:

    • 允许在多个字段上执行相同的 match 查询。
    • 示例:
      json
      "multi_match": {
      "query": "Elasticsearch",
      "fields": ["title", "description", "tags"]
      }

5.4 优化技巧 (Optimization Techniques)

在生产环境中,Elasticsearch 的性能优化至关重要。

  • 硬件配置:

    • 内存 (RAM): 尽可能多,JVM 堆内存 (-Xms, -Xmx) 通常设置为物理内存的一半,但不超过 30.5GB。
    • CPU: 核心数越多越好,尤其对于复杂的查询和聚合。
    • 磁盘: SSD 是必须的,尤其对于数据盘。
    • 网络: 高带宽低延迟的网络对于分布式集群至关重要。
  • 索引策略:

    • 合理设置主分片数量: 一旦设定,无法更改。过少影响扩展,过多增加管理开销和相关性计算复杂性。通常建议每个分片大小在 20-50GB。
    • 合理设置副本分片数量: 提供高可用性和读扩展。通常 1-2 个副本足够。
    • 生命周期管理 (ILM): 自动管理索引的生命周期,包括滚动更新、Shrink、Force Merge、冻结、删除等,以优化存储和性能。
    • 路由 (Routing): 在索引和查询时指定路由键,确保相关文档位于同一个分片上,减少查询时的扇出 (fan-out)。
  • 查询优化:

    • 避免深度分页 (Deep Paging): 使用 search_after 或 Scroll API 来处理大量结果集,而不是传统的 from/size
    • 使用 filter 上下文: 对于不影响评分的查询条件,使用 bool 查询的 filter 子句,而不是 mustshould,因为 filter 会被缓存且不计算分数,性能更高。
    • 避免大量 script 查询: 脚本查询开销大,尽量使用内置查询。
    • 缓存: 理解并利用 Elasticsearch 的各种缓存机制。
  • JVM 调优:

    • 合理配置 JVM 堆内存,防止内存溢出或垃圾回收频繁。
    • 调整 max_map_count (Linux) 以允许 Elasticsearch 创建足够的 MMap 文件。
  • 批量操作:

    • 使用 _bulk API 进行批量索引、更新和删除操作,减少网络开销,提高吞吐量。

5.5 ELK Stack 集成 (Logstash, Kibana)

Elasticsearch 是 Elastic Stack (ELK Stack) 的核心,与 Logstash 和 Kibana 紧密集成,构建强大的数据管道和可视化平台。

  • Logstash (数据收集与处理):

    • 一个开源的数据处理管道,能够同时从多个源获取数据、转换数据,然后将数据发送到您选择的“存储库”(如 Elasticsearch)。
    • 输入 (Input): 从文件、数据库、消息队列等获取数据。
    • 过滤器 (Filter): 对数据进行解析、转换、丰富、删除字段等操作。
    • 输出 (Output): 将处理后的数据发送到 Elasticsearch。
  • Kibana (数据可视化与管理):

    • 一个开源的数据可视化和探索工具,专门用于与 Elasticsearch 配合使用。
    • Discover: 探索和查询 Elasticsearch 中的原始数据。
    • Visualize: 创建各种图表、图形、地图等可视化组件。
    • Dashboard: 将多个可视化组件组合成一个交互式仪表板,提供数据的全面视图。
    • Dev Tools: 提供 Console,方便直接向 Elasticsearch 发送请求。
    • Stack Monitoring: 监控 Elastic Stack 的健康和性能。

6. 学习资源

要成为 Elasticsearch 专家,持续学习和实践是必不可少的。

  • 官方 Elastic 文档:

    • 最权威、最全面的学习资源。从安装指南到高级概念和 API 参考,应有尽有。
    • www.elastic.co/guide/en/elasticsearch/reference/current/index.html
  • 在线课程:

    • Udemy, Coursera, Pluralsight 等平台提供了大量从入门到精通的 Elasticsearch 课程,通常包含实践练习。
    • 搜索关键词如 “Elasticsearch Masterclass”、“Complete Elasticsearch Guide”。
  • 社区论坛和博客:

    • Elastic Stack 的官方论坛是提问和获取帮助的好地方。
    • Medium、知乎、CSDN、掘金等技术社区和博客上有大量关于 Elasticsearch 的教程、经验分享和问题解决方案。关注业界专家和知名公司的技术博客,获取最新动态和最佳实践。
  • GitHub:

    • 查看 Elasticsearch 的开源代码,深入了解其内部工作原理。
    • 查找相关的客户端库、工具和示例项目。
  • 实践项目:

    • 理论知识最终需要通过实践来巩固。尝试在你的个人项目或工作中应用 Elasticsearch,例如:
      • 为你的博客或电商网站添加搜索功能。
      • 构建日志分析平台。
      • 搭建实时监控系统。

总结

Elasticsearch 是一个功能强大且用途广泛的工具,无论是作为搜索引擎、数据分析平台还是日志管理系统,都能发挥巨大作用。从理解核心概念开始,掌握安装与基本操作,进而深入学习聚合、相关性调优和性能优化,最后结合 ELK Stack 进行实战,你将逐步从 Elasticsearch 的初学者成长为专家。持续学习和实践,是精通任何复杂技术的必由之路。

滚动至顶部