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


Elasticsearch 零基础入门教程:从核心概念到基本操作

在当今数据爆炸的时代,如何快速、有效地存储、搜索和分析海量数据成为了一个巨大的挑战。传统的数据库在处理全文搜索、实时分析等场景时往往显得力不从心。这时,一个强大的分布式搜索和分析引擎——Elasticsearch——应运而生,并在日志分析、电商搜索、数据可视化等领域得到了广泛应用。

如果你对 Elasticsearch 充满了好奇,却苦于不知从何入手,那么这篇零基础入门教程正是为你准备的。我们将从最核心的概念出发,一步步带你了解 Elasticsearch 是什么、为什么使用它,以及如何进行最基本的数据操作和搜索。

第一章:Elasticsearch 是什么?为什么选择它?

1. Elasticsearch 是什么?

简单来说,Elasticsearch 是一个开源的、分布式的、实时的搜索和分析引擎。它基于 Apache Lucene™ 库构建,但提供了更高级的功能和易用性,例如分布式架构、RESTful API 接口、以及丰富的客户端库支持。

它不仅仅是一个简单的“数据库”。虽然它可以存储数据,但它的核心优势在于其强大的搜索能力和实时分析能力。你可以将各种类型的数据(文本、数字、地理位置、结构化数据等)存储到 Elasticsearch 中,然后进行闪电般的搜索、复杂的聚合分析,并几乎实时地获得结果。

2. 为什么选择 Elasticsearch?

与传统数据库或搜索引擎相比,Elasticsearch 具有以下显著优势:

  • 速度快 (Real-time): 它设计用于近实时地索引数据并进行搜索。一旦数据被索引,几乎立即可用。
  • 分布式与可扩展 (Distributed & Scalable): Elasticsearch 是天生分布式的。数据可以分散在多个节点上,轻松处理 PB 级别的数据。当数据量增长时,只需添加更多节点即可水平扩展。
  • 全文搜索能力强 (Full-text Search): 基于 Lucene,Elasticsearch 提供了强大的全文搜索功能,支持各种查询类型,如模糊搜索、短语搜索、相关性评分等。
  • 实时分析与聚合 (Real-time Analytics & Aggregation): 除了搜索,Elasticsearch 还能对大量数据进行聚合分析,例如计算总和、平均值、分组统计、趋势分析等,并以近实时的方式返回结果,这对于构建监控看板、BI 报表等非常有用。
  • 高可用性 (High Availability): 通过数据的复制(副本),Elasticsearch 可以确保在部分节点故障时,数据依然可用,服务不会中断。
  • Schema-free (相对灵活的模式): 虽然你可以定义数据的结构(Mapping),但 Elasticsearch 相对灵活,可以接受不同结构的文档,特别是对于日志等非结构化或半结构化数据非常友好。
  • RESTful API: 通过标准的 HTTP 请求进行交互,非常易于使用和集成。

典型应用场景:

  • 日志和事件数据分析 (Log and Event Data Analytics): 这是 Elasticsearch 最常见、也是最成功的应用场景之一。结合 Logstash 和 Kibana (ELK Stack),可以轻松收集、存储、搜索和可视化海量日志数据。
  • 全文搜索 (Full-text Search): 为网站、应用提供站内搜索功能,如电商网站的商品搜索、文档管理系统的文档搜索等。
  • 指标分析 (Metrics Analytics): 存储和分析时间序列数据,监控系统性能指标。
  • 地理位置搜索与分析 (Geospatial Search & Analysis): 存储和查询带有地理位置信息的数据,如“搜索我附近的所有餐厅”。
  • 安全智能 (Security Intelligence): 分析安全事件数据,检测异常行为。

第二章:核心概念:理解 Elasticsearch 的基石

在深入操作之前,理解 Elasticsearch 的几个核心概念至关重要:

1. 文档 (Document)

  • 概念: 文档是 Elasticsearch 中存储的基本单位。它可以类比于关系型数据库中的一行记录。
  • 格式: 文档是 JSON 格式的数据。JSON 是一种轻量级的数据交换格式,非常适合表示结构化或半结构化的数据。
  • 示例: 一个代表用户的文档可能如下:
    json
    {
    "name": "张三",
    "age": 30,
    "city": "北京",
    "interests": ["阅读", "跑步"]
    }
  • 特点: 每个文档都有一个唯一的 ID,可以是自己指定,也可以由 Elasticsearch 自动生成。文档是独立可搜索的信息单元。

2. 索引 (Index)

  • 概念: 索引是具有相似特征的文档集合。可以类比于关系型数据库中的一个数据库(Database)或一张表(Table)。
  • 作用: 索引是 Elasticsearch 中进行搜索和分析的最小单位。你通常会在一个或多个索引中进行搜索。
  • 命名: 索引名必须是小写字母,不能包含 \/*?"<>|、空格、, 等字符,不能以 _- 开头,不能超过 255 字节。
  • 示例: 你可以有一个 users 索引来存储用户文档,一个 products 索引来存储商品文档,一个 logs-2023-10-27 索引来存储某一天的日志。

3. 映射 (Mapping)

  • 概念: 映射是定义索引中文档结构和字段类型的过程,类似于关系型数据库中的表结构定义 (Schema)。它告诉 Elasticsearch 如何索引每个字段的数据(例如,一个字段是字符串、数字、日期,还是地理位置信息),以及如何对这些字段进行搜索和分析。
  • 重要性: 映射非常重要,因为它直接影响到数据的索引效率、存储空间以及搜索的准确性和可用性。例如,如果你想对一个文本字段进行全文搜索,需要将其类型设置为 text;如果只想进行精确匹配或聚合,可以设置为 keyword
  • 自动映射: Elasticsearch 具有动态映射功能,当你第一次索引一个文档时,如果索引尚不存在或字段是新的,Elasticsearch 会尝试根据字段的值自动猜测字段类型并创建映射。
  • 显式映射: 在生产环境中,为了更好的控制和性能,通常推荐手动定义映射,而不是完全依赖自动映射。

4. 节点 (Node)

  • 概念: 一个节点就是一个运行中的 Elasticsearch 实例
  • 类型: 节点可以扮演不同的角色,例如:
    • master 节点:负责集群的管理任务,如创建/删除索引、分配分片等。
    • data 节点:负责存储数据并执行数据相关的操作(如搜索、聚合)。
    • ingest 节点:用于在索引文档之前进行预处理。
    • coordinating 节点:接收客户端请求,并将请求路由到适当的数据节点。
  • 单节点: 对于开发或测试,可以只运行一个节点。
  • 多节点: 在生产环境中,通常会运行多个节点以构建分布式集群。

5. 集群 (Cluster)

  • 概念: 一个集群是一个或多个相互关联的节点的集合
  • 特点: 集群中的所有节点共享同一个集群名称,它们协同工作,共同存储数据、提供搜索和分析能力。集群提供了高可用性和可扩展性。
  • 健康状态: 集群有健康状态 (Health Status),通常用颜色表示:green (健康)、yellow (部分数据可用,副本未完全分配)、red (部分主分片不可用,集群功能受限)。

6. 分片 (Shard)

  • 概念: 一个索引可以被水平分割成多个分片。每个分片本身就是一个功能完整的独立索引。
  • 作用: 分片的主要目的是:
    • 允许你水平地分割和扩展数据量。一个大索引可以分散在多个节点上存储。
    • 允许你在多个分片(以及多个节点)上并行执行操作,提高性能。
  • 主分片 (Primary Shard): 每个文档都属于一个主分片。一个索引创建时会指定主分片的数量,这个数量在索引创建后就不能改变(尽管可以通过 reindex 操作来改变)。
  • 分片数量: 合理设置分片数量很重要。太少不利于扩展,太多会增加管理的开销和资源的消耗。

7. 副本 (Replica)

  • 概念: 副本是主分片的拷贝
  • 作用: 副本的主要目的是:
    • 提高高可用性 (High Availability): 如果主分片所在的节点故障,副本可以晋升为新的主分片,确保数据不丢失和服务不中断。
    • 提高读取性能 (Read Performance): 搜索请求可以由主分片或其任何一个副本处理,增加了系统的吞吐量。
  • 数量: 每个主分片可以有零个或多个副本。副本的数量可以在索引创建后动态调整。
  • 位置: 副本分片永远不会与它所复制的主分片位于同一个节点上,以保证高可用性。

理解了文档、索引、映射、节点、集群、分片和副本这七个核心概念,你就对 Elasticsearch 的基本工作原理有了初步认识。

第三章:开始入门:安装与运行

对于初学者,有几种方便的方式来安装和运行 Elasticsearch:

1. 使用 Docker (推荐):

Docker 是最简单快捷的方式,无需关心复杂的环境配置。
* 首先确保你安装了 Docker。
* 拉取 Elasticsearch 镜像(这里以 8.x 版本为例):
bash
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.10.2 # 选择一个版本号

* 运行容器:
bash
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:8.10.2

* -d: 后台运行
* --name elasticsearch: 给容器命名
* -p 9200:9200: 将容器的 9200 端口映射到宿主机的 9200 端口 (HTTP API)
* -p 9300:9300: 将容器的 9300 端口映射到宿主机的 9300 端口 (节点间通信,可不映射,但单节点需要)
* -e "discovery.type=single-node": 强制以单节点模式运行,跳过集群发现步骤,方便入门。
* 注意: Elasticsearch 8.x 版本默认开启安全功能(HTTPS, 用户认证)。对于入门学习,你可以选择禁用安全或者配置简单的认证。禁用安全(不推荐生产环境):在运行命令中添加 -e "xpack.security.enabled=false"。或者查看官方文档学习如何配置用户认证。为了简化本教程,我们假设你已经处理了安全问题,可以直接通过 HTTP 访问。

2. 下载安装包:

  • 访问 Elasticsearch 官方网站 (https://www.elastic.co/cn/downloads/elasticsearch) 下载对应操作系统的安装包 (ZIP 或 TAR.GZ)。
  • 确保你的系统安装了 Java (JDK) 环境,Elasticsearch 需要 Java 运行。建议使用官方推荐的 JDK 版本。
  • 解压下载的文件到合适的位置。
  • 进入解压后的目录,运行启动脚本(Linux/macOS: bin/elasticsearch, Windows: bin\elasticsearch.bat)。

验证安装:

无论使用哪种方式,启动 Elasticsearch 后,打开浏览器或使用 curl 工具访问 http://localhost:9200。如果看到类似以下内容的 JSON 响应,说明 Elasticsearch 已经成功运行:

json
{
"name" : "your_node_name",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "...",
"version" : {
"number" : "8.10.2", // 版本号
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "...",
"build_date" : "...",
"build_snapshot" : false,
"lucene_version" : "...",
"minimum_wire_compatibility_version" : "...",
"minimum_index_compatibility_version" : "..."
},
"tagline" : "You Know, for Search"
}

第四章:基本操作:数据的增、删、改、查 (CRUD)

Elasticsearch 主要通过 RESTful API 进行交互。你可以使用任何支持 HTTP 请求的工具,如 curl、Postman、Kibana 的 Dev Tools 等。对于初学者,Kibana 的 Dev Tools 是一个非常方便的选择,它提供了友好的界面来发送请求。假设你已经安装了 Kibana 并连接到 Elasticsearch。

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

有两种方式创建文档:指定 ID 或让 Elasticsearch 自动生成 ID。

  • 指定 ID (PUT): 如果你知道文档的唯一 ID,可以使用 PUT 请求。如果该 ID 的文档已存在,则会替换(更新)它。
    bash
    # 使用 curl
    curl -X PUT "localhost:9200/my_index/_doc/1" -H "Content-Type: application/json" -d'
    {
    "title": "Elasticsearch 入门",
    "author": "张三",
    "views": 100,
    "tags": ["技术", "搜索"],
    "publish_date": "2023-10-27"
    }
    '

    • URL 格式: /{index}/_doc/{id}
    • 响应会包含索引名、ID、版本号 (_version) 等信息。
  • 自动生成 ID (POST): 如果你没有现成的 ID,可以使用 POST 请求。Elasticsearch 会自动生成一个唯一的 ID。
    bash
    # 使用 curl
    curl -X POST "localhost:9200/my_index/_doc" -H "Content-Type: application/json" -d'
    {
    "title": "分布式系统原理",
    "author": "李四",
    "views": 150,
    "tags": ["技术", "架构"],
    "publish_date": "2023-10-26"
    }
    '

    • URL 格式: /{index}/_doc
    • 响应会包含自动生成的 ID (_id)。

2. 获取文档 (Get Document)

使用 GET 请求和文档的 ID 来获取文档的内容。

“`bash

获取 ID 为 1 的文档

curl -X GET “localhost:9200/my_index/_doc/1”
``
* URL 格式:
/{index}/_doc/{id}* 响应会包含文档的元信息(如索引、ID、版本号)以及存储在_source` 字段中的原始文档内容。

3. 更新文档 (Update Document)

Elasticsearch 的更新操作不是在原地修改,而是先删除旧文档,再索引新文档(乐观并发控制)。

  • 完全替换 (PUT): 使用 PUT 请求,如果 ID 存在,新文档会完全替换旧文档。这在上面创建文档时已经演示过了。

  • 部分更新 (POST with _update): 使用 POST 请求和 _update 端点,可以只修改文档中的部分字段,而不是替换整个文档。
    bash
    # 将 ID 为 1 的文档的 views 字段增加 50
    curl -X POST "localhost:9200/my_index/_update/1" -H "Content-Type: application/json" -d'
    {
    "doc": {
    "views": 150
    }
    }
    '

    或者使用脚本更新:
    bash
    # 将 ID 为 1 的文档的 views 字段增加 50 (使用 script)
    curl -X POST "localhost:9200/my_index/_update/1" -H "Content-Type: application/json" -d'
    {
    "script": {
    "source": "ctx._source.views += params.count",
    "lang": "painless",
    "params": {
    "count": 50
    }
    }
    }
    '

    • URL 格式: /{index}/_update/{id}
    • 在请求体中使用 doc 字段包含要更新的部分字段,或者使用 script 进行更复杂的更新逻辑。

4. 删除文档 (Delete Document)

使用 DELETE 请求和文档 ID 来删除文档。

“`bash

删除 ID 为 1 的文档

curl -X DELETE “localhost:9200/my_index/_doc/1”
``
* URL 格式:
/{index}/_doc/{id}`
* 响应表示删除操作是否成功。文档并不会立即从磁盘上移除,而是被标记为删除,并在后台的段合并 (segment merge) 过程中最终清除。

第五章:基本搜索:找到你想要的数据

Elasticsearch 最强大的功能是搜索。搜索通过 _search 端点进行,支持使用 URI 参数 (q=) 进行简单搜索,或者使用请求体(Query DSL)进行复杂、结构化的搜索。建议使用 Query DSL,它更强大和灵活。

1. 简单搜索 (URI Search)

使用 q= 参数进行简单的基于字段值的搜索。

“`bash

搜索 my_index 索引中所有文档

curl -X GET “localhost:9200/my_index/_search”

搜索 title 字段包含 “入门” 的文档

curl -X GET “localhost:9200/my_index/_search?q=title:入门”

搜索 author 字段包含 “张三” 并且 views 大于 100 的文档

curl -X GET “localhost:9200/my_index/_search?q=author:张三 AND views:>100”
``
*
q=` 参数支持 Lucene 查询语法。

2. 结构化搜索 (Query DSL)

Query DSL (Domain Specific Language) 是 Elasticsearch 提供的基于 JSON 的查询语言。它强大且灵活,能够构建各种复杂的搜索条件。

  • 搜索所有文档:
    bash
    curl -X GET "localhost:9200/my_index/_search" -H "Content-Type: application/json" -d'
    {
    "query": {
    "match_all": {}
    }
    }
    '

    • query 对象是 Query DSL 的入口。
    • match_all 查询匹配所有文档。
  • 匹配查询 (match query): 进行全文搜索或精确匹配。对于 text 字段会进行分词处理,对于其他类型字段进行精确匹配。
    “`bash
    # 搜索 title 字段包含 “入门” 的文档 (会进行分词)
    curl -X GET “localhost:9200/my_index/_search” -H “Content-Type: application/json” -d’
    {
    “query”: {
    “match”: {
    “title”: “入门”
    }
    }
    }

    搜索 tags 字段精确匹配 “技术” 的文档 (假设 tags 是 keyword 字段)

    curl -X GET “localhost:9200/my_index/_search” -H “Content-Type: application/json” -d’
    {
    “query”: {
    “match”: {
    “tags”: “技术”
    }
    }
    }

    “`

  • 精确匹配查询 (term query): 用于精确查找字段值,不会进行分词处理。通常用于 keyword、数字、日期等字段。
    bash
    # 搜索 author 字段精确匹配 "张三" 的文档
    curl -X GET "localhost:9200/my_index/_search" -H "Content-Type: application/json" -d'
    {
    "query": {
    "term": {
    "author": "张三"
    }
    }
    }
    '

  • 范围查询 (range query): 查找字段值在指定范围内的文档。
    bash
    # 搜索 views 大于等于 100 且小于等于 200 的文档
    curl -X GET "localhost:9200/my_index/_search" -H "Content-Type: application/json" -d'
    {
    "query": {
    "range": {
    "views": {
    "gte": 100, # 大于等于
    "lte": 200 # 小于等于
    }
    }
    }
    }
    '

    • 范围参数: gt (大于), gte (大于等于), lt (小于), lte (小于等于)。
  • 布尔查询 (bool query): 组合多个查询条件 (must – 必须匹配, filter – 必须匹配且不参与评分, should – 应该匹配, must_not – 必须不匹配)。
    bash
    # 搜索 author 是 "张三" 并且 views 大于 100 的文档
    curl -X GET "localhost:9200/my_index/_search" -H "Content-Type: application/json" -d'
    {
    "query": {
    "bool": {
    "must": [
    { "term": { "author": "张三" } },
    { "range": { "views": { "gt": 100 } } }
    ]
    }
    }
    }
    '

    • filter 查询非常适合用于过滤结果而不影响相关性评分,通常比 must 更高效。

搜索结果:

搜索请求的响应通常包含以下重要部分:
* took: 查询执行时间 (毫秒)。
* timed_out: 是否超时。
* hits: 包含搜索结果的部分。
* total: 匹配到的文档总数。
* max_score: 所有匹配文档中的最高相关性得分。
* hits: 包含匹配到的具体文档列表。每个文档信息包括 _index, _id, _score (相关性得分), 以及 _source (原始文档内容)。

相关性评分 (_score):

Elasticsearch 在执行全文搜索时,会根据文档与查询的相关程度计算一个评分 (_score),并默认按评分降序排列结果。这使得最相关的文档排在前面。Query DSL 中的许多查询(如 match)会参与评分,而 filter 中的查询则不参与评分,这有助于提高过滤性能。

第六章:Elastic Stack 概览 (ELK/ECK Stack)

Elasticsearch 通常不是单独使用的,它是一个生态系统中的一部分,最常见的是与 Kibana 和 Logstash 一起组成 ELK Stack (现在更常称为 Elastic Stack)。

  • Logstash: 开源的数据收集引擎,用于从各种源(文件、数据库、消息队列等)实时地采集数据,进行转换处理(如解析、过滤、丰富),然后将数据发送到 Elasticsearch。
  • Kibana: 开源的数据可视化和探索工具。它提供了一个 Web 界面,可以连接到 Elasticsearch,让你方便地搜索数据、构建各种图表和仪表板进行数据可视化和分析,还提供了 Dev Tools 方便你直接与 Elasticsearch API 交互。

这三者(或加上 Beats 等数据采集器)协同工作,构建了一个强大的数据处理和分析平台。对于入门者,学习 Kibana 的使用特别是 Dev Tools 会极大地提升学习效率。

第七章:总结与下一步

恭喜你!通过本文的学习,你已经对 Elasticsearch 有了初步的认识,包括它的核心概念、安装方法以及如何进行基本的数据操作(CRUD)和搜索。

核心要点回顾:

  • Elasticsearch 是一个强大的分布式搜索和分析引擎。
  • 理解文档、索引、映射、节点、集群、分片、副本是掌握 Elasticsearch 的基础。
  • 通过 RESTful API 进行交互,可以使用 curl 或 Kibana Dev Tools。
  • 学会基本的文档索引 (PUT/POST)、获取 (GET)、更新 (POST _updatePUT)、删除 (DELETE) 操作。
  • 掌握基本的搜索语法,特别是 Query DSL。
  • Elasticsearch 通常是 Elastic Stack 的一部分,与 Logstash (数据采集) 和 Kibana (可视化) 协同工作。

下一步学习建议:

  • 动手实践: 立即按照教程尝试安装和运行 Elasticsearch,使用 Kibana Dev Tools 进行文档的增删改查和基本搜索。
  • 深入 Query DSL: Query DSL 非常丰富,学习更多查询类型(如 bool 的更多用法、fuzzyphrasehighlight 等)和搜索特性(如分页、排序、聚合)。
  • 学习 Mapping: 深入理解映射的概念,学习如何创建和管理显式映射,以及不同字段类型 (text, keyword, date, long, geo_point 等) 的用法和区别。
  • 学习 Aggregations: 聚合是 Elasticsearch 强大的分析能力的关键,学习如何使用聚合进行数据统计、分组和分析。
  • 了解集群管理: 虽然入门教程是单节点,但了解多节点集群的搭建、配置和管理对于实际应用至关重要。
  • 阅读官方文档: Elasticsearch 的官方文档是最好的学习资源,详细且权威。
  • 学习 Kibana: 熟练使用 Kibana 进行数据探索和可视化。
  • 了解 Logstash/Beats: 学习如何将你的数据导入到 Elasticsearch 中。

结语

Elasticsearch 是一个功能强大且应用广泛的技术。本教程只是带你迈出了第一步。掌握它需要持续的学习和实践。不要害怕尝试,从简单的例子开始,逐步深入更复杂的概念和功能。随着实践的深入,你将越来越感受到 Elasticsearch 在处理和分析海量数据方面的魅力。

祝你在 Elasticsearch 的学习旅程中一切顺利!


发表评论

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

滚动至顶部