Elasticsearch 详细教程 – wiki基地


Elasticsearch 详细教程:从入门到实践

引言

在当今大数据时代,快速、准确地搜索和分析海量数据成为了一项核心需求。无论是构建企业内部的搜索引擎、分析用户行为日志、监控系统性能指标,还是为电子商务平台提供商品搜索功能,一个强大而灵活的搜索分析引擎都是不可或缺的。Elasticsearch 正是为了满足这一需求而诞生的。

Elasticsearch 是一个开源的分布式搜索和分析引擎,基于 Apache Lucene™ 构建。它以其高性能、高可用性、良好的扩展性以及实时的数据处理能力而闻名。本教程将带您深入了解 Elasticsearch 的世界,从基础概念到实际操作,帮助您掌握这一强大的工具。

第一部分:核心概念

理解 Elasticsearch 的核心概念是使用它的基础。虽然它经常被拿来与传统的关系型数据库 (RDBMS) 对比,但它们在设计思想和应用场景上有很大不同。

  1. 接近 RDBMS 的类比(用于理解,非精确对应)

    • 索引 (Index):类似于数据库 (Database)。它是具有相似特征的文档集合。
    • 类型 (Type):在 Elasticsearch 6.x 版本及之前存在,类似于数据库中的表 (Table)。用于区分同一索引下不同结构的文档。注意:在 Elasticsearch 7.x 及以后版本中,一个索引只允许有一个类型 (_doc),类型概念被淡化并最终移除。
    • 文档 (Document):类似于数据库中的行 (Row)。它是可以被索引的基本信息单元。文档以 JSON 格式表示。
    • 字段 (Field):类似于数据库中的列 (Column)。文档中的每个键值对都代表一个字段。
  2. Elasticsearch 特有的核心概念

    • 节点 (Node):一个 Elasticsearch 实例。可以是物理服务器、虚拟机或容器上的一个进程。多个节点可以组成一个集群。
    • 集群 (Cluster):一个或多个节点组成的集合,共享相同的 cluster.name。集群协同工作,共同存储数据并提供搜索和索引功能。集群具有高可用性、故障转移和扩展能力。
    • 分片 (Shard):索引被水平分割成多个分片。每个分片是一个独立的 Lucene 索引实例。分片的存在是 Elasticsearch 实现分布式和水平扩展的基础。
      • 主分片 (Primary Shard):索引的原始数据分片。一个文档只属于一个主分片。索引创建时指定主分片的数量,之后不能更改。
      • 副本分片 (Replica Shard):主分片的复制品。副本分片提供数据的冗余备份,从而提高读性能(搜索请求可以由主分片或副本分片处理)和可用性(当主分片失效时,副本分片可以被提升为新的主分片)。副本分片的数量可以动态更改。
    • 映射 (Mapping):定义文档及其字段的结构和数据类型。类似于数据库的表结构定义,但 Elasticsearch 默认是动态映射,可以自动识别字段类型。但为了精确控制索引和搜索行为,通常需要手动定义映射。
    • 分析器 (Analyzer):在索引时处理文本字段,以便于全文搜索。一个分析器由字符过滤器 (Character Filters)、分词器 (Tokenizer) 和 Token 过滤器 (Token Filters) 组成。它将原始文本转换成可搜索的词条 (Token)。

第二部分:安装与启动

Elasticsearch 需要 Java 运行时环境(JRE)的支持。请确保您的系统已安装 Java。

  1. 下载 Elasticsearch
    访问 Elasticsearch 官方网站 (https://www.elastic.co/cn/downloads/elasticsearch) 下载适合您操作系统的版本(如 .tar.gz.zip 包)。

  2. 解压
    将下载的文件解压到您希望安装的目录。

  3. 配置 (可选)
    进入解压目录下的 config 文件夹。

    • elasticsearch.yml: 主要的配置文件,可以修改集群名、节点名、网络绑定地址、端口等。
    • jvm.options: 配置 JVM 选项,如堆内存大小。生产环境中建议调整堆内存(Xms 和 Xmx)大小,通常设置为物理内存的一半,但不超过 30GB。
  4. 启动 Elasticsearch

    • Linux/macOS: 打开终端,进入 Elasticsearch 目录,运行 ./bin/elasticsearch
    • Windows: 打开命令提示符或 PowerShell,进入 Elasticsearch 目录,运行 .\bin\elasticsearch.bat

    首次启动可能会花费一些时间。当看到类似 published [{}] 的日志输出时,表示 Elasticsearch 节点已成功启动并加入或创建了集群。

  5. 验证
    打开浏览器或使用 curl 工具访问 http://localhost:9200。如果看到包含集群名、节点名、版本号等信息的 JSON 响应,说明 Elasticsearch 已成功运行。

第三部分:基本操作 (CRUD + Search)

我们将使用 RESTful API 与 Elasticsearch 交互。您可以使用 curl、Kibana 的 Dev Tools 或任何支持发送 HTTP 请求的客户端。以下示例使用 curl

约定:
* PUTPOSTGETDELETE 是 HTTP 方法。
* /index_name 是索引名称。
* /_doc 是文档类型(在 7.x+ 版本中常用)。
* /document_id 是文档的唯一标识符。
* /_search 是搜索 API 端点。

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

向索引添加一个新文档。如果指定 ID 存在,则会覆盖现有文档。

“`bash

方式一:指定文档ID (PUT)

curl -X PUT “localhost:9200/my_index/_doc/1?pretty” -H ‘Content-Type: application/json’ -d’
{
“title”: “Elasticsearch 详细教程”,
“author”: “教程作者”,
“publish_date”: “2023-10-27”,
“content”: “这是一篇关于 Elasticsearch 的详细教程,涵盖核心概念、安装和基本操作。”,
“views”: 100
}

方式二:不指定文档ID,由ES自动生成 (POST)

curl -X POST “localhost:9200/my_index/_doc?pretty” -H ‘Content-Type: application/json’ -d’
{
“title”: “Elasticsearch 使用场景”,
“author”: “教程作者”,
“publish_date”: “2023-10-27”,
“content”: “Elasticsearch 广泛应用于日志分析、搜索和指标监控等领域。”,
“views”: 50
}

``-X PUT-X POST指定请求方法,?pretty参数让返回的 JSON 格式化更易读,-H ‘Content-Type: application/json’指定请求体类型,-d` 后面是请求体内容(JSON 格式)。

2. 获取文档 (Get Document)

根据文档 ID 获取特定文档的内容。

bash
curl -X GET "localhost:9200/my_index/_doc/1?pretty"

3. 更新文档 (Update Document)

修改文档的局部内容,而不是替换整个文档。

bash
curl -X POST "localhost:9200/my_index/_update/1?pretty" -H 'Content-Type: application/json' -d'
{
"doc": {
"views": 101,
"tags": ["搜索", "教程"]
}
}
'

注意这里使用了 _update 端点和 "doc": {...} 结构来指定要更新的字段。

4. 删除文档 (Delete Document)

根据文档 ID 删除特定文档。

bash
curl -X DELETE "localhost:9200/my_index/_doc/1?pretty"

5. 搜索文档 (Search Document)

这是 Elasticsearch 最强大的功能。使用 _search 端点和 Query DSL (Domain Specific Language) 构建复杂的查询。

  • 匹配所有文档 (Match All)

    bash
    curl -X GET "localhost:9200/my_index/_search?pretty" -H 'Content-Type: application/json' -d'
    {
    "query": {
    "match_all": {}
    }
    }
    '

    返回索引中的所有文档(默认最多返回前 10 个)。

  • 全文搜索 (Match Query)

    在文本字段中搜索包含特定词语的文档。Elasticsearch 会对查询词和文档内容进行分词和分析处理。

    bash
    curl -X GET "localhost:9200/my_index/_search?pretty" -H 'Content-Type: application/json' -d'
    {
    "query": {
    "match": {
    "content": "教程 概念"
    }
    }
    }
    '

    搜索 content 字段中包含 “教程” 或 “概念” 的文档。

  • 精确匹配 (Term Query)

    在非分析字段(如 keywordintegerdate)中搜索精确匹配的文档。term 查询不会对查询词进行分析。

    bash
    curl -X GET "localhost:9200/my_index/_search?pretty" -H 'Content-Type: application/json' -d'
    {
    "query": {
    "term": {
    "views": 100
    }
    }
    }
    '

    搜索 views 字段精确等于 100 的文档。

  • 布尔组合查询 (Bool Query)

    结合多个查询条件。bool 查询包含以下子句:
    * must: 文档必须匹配此查询(相当于 AND)。
    * filter: 文档必须匹配此查询,但不会计算相关性得分(适用于精确过滤)。
    * should: 文档应该匹配此查询(相当于 OR)。
    * must_not: 文档不能匹配此查询(相当于 NOT)。

    bash
    curl -X GET "localhost:9200/my_index/_search?pretty" -H 'Content-Type: application/json' -d'
    {
    "query": {
    "bool": {
    "must": [
    { "match": { "content": "Elasticsearch" } },
    { "match": { "author": "教程作者" } }
    ],
    "filter": [
    { "range": { "publish_date": { "gte": "2023-01-01" } } }
    ],
    "must_not": [
    { "term": { "views": 0 } }
    ]
    }
    }
    }
    '

    搜索 content 包含 “Elasticsearch” 且 author 包含 “教程作者”,并且 publish_date 在 2023-01-01 或之后,且 views 不等于 0 的文档。

  • 范围查询 (Range Query)

    查询某个字段在指定范围内的数据。

    bash
    curl -X GET "localhost:9200/my_index/_search?pretty" -H 'Content-Type: application/json' -d'
    {
    "query": {
    "range": {
    "views": {
    "gte": 50, # 大于等于
    "lt": 200 # 小于
    }
    }
    }
    }
    '

    搜索 views 字段值在 [50, 200) 范围内的文档。

第四部分:更深入的特性

  1. 映射 (Mapping)
    虽然 Elasticsearch 支持动态映射,但为了更好地控制字段的索引和搜索行为,推荐显式定义映射。特别是文本字段,可以选择 text(用于全文搜索,会分词)或 keyword(用于精确匹配、排序、聚合,不会分词)。

    “`bash

    创建索引时定义映射

    curl -X PUT “localhost:9200/my_articles?pretty” -H ‘Content-Type: application/json’ -d’
    {
    “mappings”: {
    “properties”: {
    “title”: {
    “type”: “text”,
    “analyzer”: “ik_smart” # 假设安装了ik分词器
    },
    “author”: {
    “type”: “keyword”
    },
    “publish_date”: {
    “type”: “date”
    },
    “content”: {
    “type”: “text”,
    “analyzer”: “ik_smart”
    },
    “views”: {
    “type”: “integer”
    },
    “tags”: {
    “type”: “keyword”
    }
    }
    }
    }

    查看现有索引的映射

    curl -X GET “localhost:9200/my_articles/_mapping?pretty”
    ``
    这里的
    ik_smart` 是一个常用的中文分词器,需要额外安装插件。

  2. 分析器 (Analyzers)
    分析器是 Elasticsearch 处理文本的核心。它决定了文本如何被分解成词条存储在倒排索引中,以及搜索时查询词如何被处理。选择合适的分词器对于搜索结果的相关性至关重要,尤其是对于中文、日文、韩文等语言。常见的分析器有:

    • standard: 默认分析器,基于 Unicode 文本分割算法,适合英文等。
    • simple: 按非字母字符分割。
    • whitespace: 按空白字符分割。
    • 特定语言分析器(如 english, chinese,或第三方插件如 ik)。

    您可以通过 _analyze API 查看文本如何被分析:

    “`bash
    curl -X GET “localhost:9200/_analyze?pretty” -H ‘Content-Type: application/json’ -d’
    {
    “analyzer”: “standard”,
    “text”: “Elasticsearch 是一个强大的搜索引警”
    }

    如果安装了ik分词器

    curl -X GET “localhost:9200/_analyze?pretty” -H ‘Content-Type: application/json’ -d’
    {
    “analyzer”: “ik_smart”,
    “text”: “Elasticsearch 是一个强大的搜索引警”
    }

    “`

  3. 聚合 (Aggregations)
    聚合功能让 Elasticsearch 成为强大的分析工具。它可以对搜索结果进行分组、计算指标(如总和、平均值、最大值、最小值)、统计词频等。

    “`bash

    示例:统计每个作者发布的文章数量

    curl -X GET “localhost:9200/my_articles/_search?pretty” -H ‘Content-Type: application/json’ -d’
    {
    “size”: 0, # 不返回匹配的文档,只返回聚合结果
    “aggs”: {
    “articles_by_author”: {
    “terms”: {
    “field”: “author.keyword” # 对keyword类型字段进行精确分组统计
    }
    }
    }
    }

    ``terms聚合是最常用的聚合之一,用于按字段值进行分组统计。注意,对于text类型的字段,如果希望按完整字符串分组,需要在映射中额外添加一个keyword子字段(如author.keyword`),然后对该子字段进行聚合。

  4. 集群管理与监控
    Elasticsearch 提供了丰富的 Cluster API (_cluster) 和 Cat API (_cat) 来管理和监控集群。

    • _cluster/health: 查看集群健康状态(绿色、黄色、红色)。
    • _cat/nodes: 查看集群中的节点信息。
    • _cat/indices: 查看集群中的索引信息。

    bash
    curl "localhost:9200/_cluster/health?pretty"
    curl "localhost:9200/_cat/nodes?v" # v参数显示列头
    curl "localhost:9200/_cat/indices?v"

  5. 集成 ELK Stack (或 Elastic Stack)
    Elasticsearch 通常与 Kibana 和 Logstash (或 Beats) 一起使用,构成强大的日志分析和监控平台:

    • Beats: 轻量级数据采集器,如 Filebeat (日志文件)、Metricbeat (系统指标)。
    • Logstash: 数据处理管道,用于从各种来源采集数据、转换数据并发送到 Elasticsearch。
    • Elasticsearch: 存储、索引和分析数据。
    • Kibana: 可视化和探索 Elasticsearch 中的数据,提供搜索界面、仪表盘等。

第五部分:实际应用场景

  • 站内搜索/全文搜索: 为网站、应用提供快速、相关的搜索功能。
  • 日志和指标分析: 收集、存储和分析服务器日志、应用程序日志、系统指标,用于故障排查、性能监控和安全审计。这是 ELK Stack 最典型的应用场景。
  • APM (应用性能监控): 收集应用性能数据,分析请求链路、错误率、响应时间等。
  • 安全信息和事件管理 (SIEM): 收集安全相关的日志和事件,进行实时威胁检测和安全分析。
  • 地理空间搜索: 索引和搜索地理位置数据。
  • 电商搜索: 提供商品搜索、过滤、排序、推荐等功能。

第六部分:一些最佳实践和提示

  • 设计合理的映射: 花时间规划字段类型和分析器,这对搜索质量和性能至关重要。
  • 考虑分片数量: 索引创建后主分片数量不可更改。根据预计数据量、增长速度和集群规模合理规划。过多的分片会增加集群开销,过少则可能限制扩展和可用性。
  • 利用副本分片: 副本分片提供冗余和提高读性能,建议至少配置一个副本 (number_of_replicas: 1)。
  • 监控集群状态: 定期检查集群健康状态、节点资源使用、索引大小等。
  • 安全配置: 生产环境务必启用安全功能(如用户认证、权限控制),Elastic Stack 提供了 X-Pack Security(部分功能免费,部分收费)。
  • 索引生命周期管理 (ILM): 对于日志等时序数据,使用 ILM 策略自动管理索引的创建、滚动、收缩、冻结和删除。
  • 版本管理: 关注官方文档,了解新版本特性和升级注意事项。

结论

Elasticsearch 是一个功能强大、用途广泛的分布式搜索和分析引擎。通过本教程,您应该对 Elasticsearch 的核心概念、基本操作和一些高级特性有了初步了解。从文档索引和搜索,到复杂的聚合分析和集群管理,Elasticsearch 为处理海量数据提供了高效的解决方案。掌握 Elasticsearch,将极大地提升您在数据搜索、分析和监控方面的能力。

这只是一个起点,Elasticsearch 还有更多强大的功能和细节等待您去探索,比如更复杂的 Query DSL、Suggest API、Percolator、Snapshot/Restore、Translog、Segment Merge等等。建议您继续查阅官方文档、社区资源,并通过实践深入学习。

希望这篇详细教程对您有所帮助!


发表评论

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

滚动至顶部