文章摘要

文章介绍了Elasticsearch的基本概念和使用方法,帮助读者构建强大的搜索和分析引擎。内容涵盖Elasticsearch的安装与配置、核心概念(如索引、文档和节点)、基本操作(如数据索引、搜索和聚合),以及常见的使用场景。文章还提供了实践建议和优化技巧,帮助用户提升Elasticsearch的性能和效率。通过这篇指南,读者可以快速上手并有效利用Elasticsearch进行数据搜索和分析。

Elasticsearch是一个基于Lucene构建的开源搜索引擎,它可以快速地存储、搜索和分析大量数据。Elasticsearch通常用于全文搜索、日志分析和实时数据分析等场景。它是Elastic Stack的核心组件,Elastic Stack还包括Kibana(数据可视化工具)、Logstash(数据处理工具)和Beats(数据采集工具)等。

Elasticsearch 特点

  1. 分布式和高可用:Elasticsearch可以跨多个服务器分布存储数据,提供数据冗余和故障转移。
  2. 实时搜索:Elasticsearch支持近乎实时的搜索,这意味着数据被索引后很快就可以被搜索到。
  3. 多租户:可以在一个Elasticsearch集群中创建多个索引,每个索引可以被视为一个独立的搜索引擎。
  4. RESTful API:Elasticsearch提供了丰富的RESTful API,可以通过HTTP进行数据的索引、搜索、更新和删除操作。
  5. 灵活的数据模型:Elasticsearch不需要预先定义数据模式,它可以处理不同格式的数据,并且可以动态地调整数据结构。

使用场景

  1. 全文搜索:Elasticsearch最初被设计为一个搜索引擎,因此它非常适合用于需要全文搜索功能的应用,如电子商务网站、内容管理系统和应用程序内搜索。
  2. 日志和事件数据分析:Elasticsearch经常与Logstash和Kibana一起使用,作为ELK Stack(现在称为Elastic Stack)的一部分,用于收集、存储、搜索和分析日志文件。这对于运维监控、安全信息和事件管理(SIEM)等场景非常有用。
  3. 实时分析:Elasticsearch的近实时能力使其适合需要实时分析的应用,如监控应用程序、实时数据仪表板和实时推荐系统。
  4. 大数据分析:由于其分布式架构,Elasticsearch可以处理大规模的数据集,使其成为大数据分析的一个流行选择。
  5. 地理位置分析和搜索:Elasticsearch支持地理位置数据和查询,可以用于地图应用、地理位置搜索和地理空间分析。

为什么不用 ES 作为数据库存储

虽然 Elasticsearch 在搜索和数据分析方面表现出色,它通常不被推荐作为主数据库用于数据存储。这主要是因为它的设计和优化是为了满足搜索和分析的需求,而不是传统数据库的一些关键特性。

1. 事务支持缺乏

Elasticsearch 不支持事务处理和多表(多索引)原子性操作。这意味着在需要执行复杂的事务性操作(如银行转账等需要多步骤、原子性保证的操作)时,Elasticsearch 无法满足需求。

2. 数据一致性模型

Elasticsearch 采用的是最终一致性模型,而非即时一致性。这意味着数据写入后,可能需要一段时间才能在所有节点上可见。这与传统的关系数据库系统(如 PostgreSQL、MySQL)提供的即时一致性不同。

3. 复杂的数据关系处理

Elasticsearch 不擅长处理复杂的数据关系。虽然它支持嵌套对象和父子关系,但这些关系的管理和查询都不如传统的关系数据库系统简单和直观。

4. 数据完整性和安全

传统的关系数据库提供了广泛的数据完整性保护措施,如外键、约束等。Elasticsearch 缺乏这样的内置机制来保证数据完整性。此外,关系数据库通常提供更为成熟的安全特性,如基于角色的访问控制和详细的审计日志。

5. 备份和恢复

虽然 Elasticsearch 提供了快照和恢复功能,但这些功能的复杂性和灵活性通常不如传统数据库管理系统。在处理大规模数据丢失或系统故障时,数据库的备份和恢复策略至关重要。

6. 成本和资源使用

Elasticsearch 的存储和计算要求通常高于传统数据库。它被设计用来优化读取和搜索操作,而不是数据写入。频繁的写入、更新和删除操作可能会导致性能下降和资源使用不经济。

安装

依赖java环境,请先自行安装jdk

在Mac上安装Elasticsearch,你可以选择使用Homebrew(一个包管理器),或者手动下载并安装。以下是两种安装方法的步骤:

使用Homebrew安装

如果你的Mac上安装了Homebrew,可以直接使用它来安装Elasticsearch。打开终端(Terminal)并执行以下命令:

  1. 首先,通过Homebrew添加Elasticsearch的官方Homebrew仓库:
brew tap elastic/tap
  1. 然后,使用Homebrew安装Elasticsearch:
brew install elastic/tap/elasticsearch-full

这将会安装最新版本的Elasticsearch。

  1. 安装完成后,你可以使用以下命令来启动Elasticsearch,让Elasticsearch作为服务运行
brew services start elastic/tap/elasticsearch-full

手动下载并安装

如果你不想使用Homebrew,可以手动下载Elasticsearch的tar.gz包进行安装。

  1. 访问Elasticsearch官方下载页面:https://www.elastic.co/cn/downloads/elasticsearch
  2. 下载适用于Mac的tar.gz压缩包。
  3. 打开终端,使用cd命令切换到下载文件所在的目录。
  4. 解压下载的文件:
tar -xzf elasticsearch-<version>-darwin-x86_64.tar.gz

请将<version>替换为你下载的Elasticsearch版本号。

  1. 进入解压后的Elasticsearch目录:
cd elasticsearch-<version>/
  1. 启动Elasticsearch:
./bin/elasticsearch

启动后,默认情况下,Elasticsearch会在本地的9200端口监听HTTP请求。

然后访问http://localhost:9200/看到如下输出,证明ES启动成功

注意事项

  • Elasticsearch需要Java环境,确保你的Mac上安装了Java。可以使用java -version命令来检查Java是否已安装。
  • 如果你在使用Elasticsearch时遇到权限问题,可能需要调整文件权限或者使用sudo命令。
  • Elasticsearch的默认配置文件位于config/elasticsearch.yml,你可以根据需要编辑这个文件来更改配置。

设置密码

编辑 config/elasticsearch.yml,添加或确保以下行存在,如果你的 Elasticsearch 集群有多个节点,确保在所有节点的配置文件中都添加了这一行。

xpack.security.enabled: true

Elasticsearch 提供了一个工具来自动生成密码或让你为内置用户(如 elastickibanalogstash_system 等)手动设置密码。你可以通过运行以下命令来初始化密码:

bin/elasticsearch-setup-passwords interactive

该命令将会提示你为每个内置用户设置密码。如果你选择自动生成密码,可以使用,该命令会为所有预定义的用户生成随机密码,并显示在命令行中。

bin/elasticsearch-setup-passwords auto

一旦密码设置完成,你需要更新依赖 Elasticsearch 的服务配置,例如 Kibana、Logstash 等,以使用新的凭证。

更新 Kibana 配置

elasticsearch.username: "kibana"
elasticsearch.password: "your_kibana_password"

更新 Logstash 配置

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    user => "elastic"
    password => "your_elastic_password"
    ...
  }
}

基本概念&操作

核心概念

  1. 节点(Node):一个节点是Elasticsearch集群中的一个单独的服务器。每个节点都参与集群的数据索引和查询操作。
  2. 集群(Cluster):一个集群是由多个节点组成的一个整体,这些节点共同工作,共享数据和负载。每个集群都有一个唯一的名称,这样节点就可以加入到正确的集群中。
  3. 索引(Index):索引是具有某些相似特征的文档集合。在关系数据库中,索引类似于数据库中的“表”。
  4. 类型(Type):在Elasticsearch 7.x之前的版本中,一个索引可以定义多个类型,类型是索引中的一个逻辑分区。从7.x版本开始,Elasticsearch已经废弃了类型的概念。
  5. 文档(Document):文档是可以被索引的信息的基本单位。在关系数据库中,文档类似于表中的“行”。
  6. 映射(Mapping):映射是定义文档如何存储和索引的过程,包括字段的名称和数据类型等。类似于关系数据库中的“表结构”。
  7. 分片(Shard):为了能够水平扩展和分布数据,索引可以被分割成多个分片。每个分片本身就是一个完整的索引。
  8. 副本(Replica):副本是分片的一个复制,用于提供数据冗余和提高查询性能。

基本操作

  1. 索引数据(Indexing):将数据存储到Elasticsearch中的过程称为索引。这通常通过HTTP POST或PUT请求完成。
  2. 搜索(Searching):Elasticsearch的核心功能之一是能够快速执行复杂的搜索操作。搜索可以通过HTTP GET请求和一个查询体(Query Body)来完成。
  3. 更新(Updating):更新操作允许你修改已经索引的文档。这通常通过HTTP POST请求完成。
  4. 删除(Deleting):你可以删除单个文档或整个索引。这通常通过HTTP DELETE请求完成。
  5. 聚合(Aggregations):聚合操作允许你基于搜索结果进行数据分析,如求和、计数、平均值等。

示例操作

以下是一些使用curl命令的基本Elasticsearch操作示例:

创建索引

curl -X PUT "localhost:9200/people" -H 'Content-Type: application/json' -d'
{
  "mappings": {
    "properties": {
      "name": { "type": "text" },
      "age": { "type": "integer" },
      "interests": { "type": "keyword" }
    }
  }
}'

也可以将 json 数据存到文件中

curl -X PUT "localhost:9200/people" -H 'Content-Type: application/json' -d @index_config.json
  • 索引一个文档
curl -X PUT "http://localhost:9200/my_index/_doc/1" -H 'Content-Type: application/json' -d'
{
  "title": "Elasticsearch Basics",
  "description": "Introduction to Elasticsearch concepts and operations."
}'
  • 索引列表
    curl -X GET “http://localhost:9200/_cat/indices?v”
  • 搜索文档
curl -X GET "http://localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "title": "Basics"
    }
  }
}'
  • 更新文档
curl -X POST "http://localhost:9200/my_index/_doc/1/_update" -H 'Content-Type: application/json' -d'
{
  "doc": {
    "description": "Updated description."
  }
}'
  • 删除文档
curl -X DELETE "http://localhost:9200/my_index/_doc/1"
  • 聚合查询
curl -X GET "http://localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d'
{
  "size": 0,
  "aggs": {
    "avg_field": {
      "avg": {
        "field": "numeric_field"
      }
    }
  }
}'

优势

  1. 高性能:Elasticsearch能够快速地索引和检索数据,提供近实时的搜索体验。
  2. 可扩展性:Elasticsearch是分布式的,可以通过添加更多节点来水平扩展,以处理更多的数据和负载。
  3. 灵活性:Elasticsearch不需要预定义的数据模式,可以处理各种类型的结构化和非结构化数据。
  4. 强大的API:Elasticsearch提供了丰富的RESTful API,支持各种语言的客户端库,易于与现有应用集成。
  5. 成熟的生态系统:Elasticsearch是Elastic Stack的一部分,与Kibana、Logstash和Beats等工具集成,提供了从数据采集到可视化的完整解决方案。

不足

  1. 学习曲线:对于初学者来说,Elasticsearch的概念和功能可能有些复杂,需要一定的学习和实践才能熟练使用。
  2. 资源消耗:Elasticsearch对系统资源(如内存和CPU)的需求较高,尤其是在处理大量数据和复杂查询时。
  3. 管理复杂性:维护一个大型的Elasticsearch集群可能会比较复杂,需要对集群管理、监控和调优有一定的了解。
  4. 安全性:在默认配置下,Elasticsearch不提供认证和加密功能。虽然可以通过X-Pack等插件增加这些功能,但可能需要额外的配置和成本。
  5. 数据一致性:Elasticsearch是最终一致的,这意味着在某些情况下,数据可能不会立即在所有节点上同步更新。

相关链接:

https://www.elastic.co/guide/en/elasticsearch/reference/current/targz.html
https://qii404.me/2018/11/22/elastic-search.html
https://www.tizi365.com/archives/780.html

Github 开源地址

https://github.com/elastic/elasticsearch?tab=readme-ov-file