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

Elasticsearch是一个基于Lucene构建的开源搜索引擎,它可以快速地存储、搜索和分析大量数据。Elasticsearch通常用于全文搜索、日志分析和实时数据分析等场景。它是Elastic Stack的核心组件,Elastic Stack还包括Kibana(数据可视化工具)、Logstash(数据处理工具)和Beats(数据采集工具)等。
Elasticsearch 特点
- 分布式和高可用:Elasticsearch可以跨多个服务器分布存储数据,提供数据冗余和故障转移。
- 实时搜索:Elasticsearch支持近乎实时的搜索,这意味着数据被索引后很快就可以被搜索到。
- 多租户:可以在一个Elasticsearch集群中创建多个索引,每个索引可以被视为一个独立的搜索引擎。
- RESTful API:Elasticsearch提供了丰富的RESTful API,可以通过HTTP进行数据的索引、搜索、更新和删除操作。
- 灵活的数据模型:Elasticsearch不需要预先定义数据模式,它可以处理不同格式的数据,并且可以动态地调整数据结构。
使用场景
- 全文搜索:Elasticsearch最初被设计为一个搜索引擎,因此它非常适合用于需要全文搜索功能的应用,如电子商务网站、内容管理系统和应用程序内搜索。
- 日志和事件数据分析:Elasticsearch经常与Logstash和Kibana一起使用,作为ELK Stack(现在称为Elastic Stack)的一部分,用于收集、存储、搜索和分析日志文件。这对于运维监控、安全信息和事件管理(SIEM)等场景非常有用。
- 实时分析:Elasticsearch的近实时能力使其适合需要实时分析的应用,如监控应用程序、实时数据仪表板和实时推荐系统。
- 大数据分析:由于其分布式架构,Elasticsearch可以处理大规模的数据集,使其成为大数据分析的一个流行选择。
- 地理位置分析和搜索: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)并执行以下命令:
- 首先,通过Homebrew添加Elasticsearch的官方Homebrew仓库:
brew tap elastic/tap
- 然后,使用Homebrew安装Elasticsearch:
brew install elastic/tap/elasticsearch-full
这将会安装最新版本的Elasticsearch。
- 安装完成后,你可以使用以下命令来启动Elasticsearch,让Elasticsearch作为服务运行
brew services start elastic/tap/elasticsearch-full
手动下载并安装
如果你不想使用Homebrew,可以手动下载Elasticsearch的tar.gz包进行安装。
- 访问Elasticsearch官方下载页面:https://www.elastic.co/cn/downloads/elasticsearch
- 下载适用于Mac的tar.gz压缩包。
- 打开终端,使用
cd
命令切换到下载文件所在的目录。 - 解压下载的文件:
tar -xzf elasticsearch-<version>-darwin-x86_64.tar.gz
请将<version>
替换为你下载的Elasticsearch版本号。
- 进入解压后的Elasticsearch目录:
cd elasticsearch-<version>/
- 启动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 提供了一个工具来自动生成密码或让你为内置用户(如 elastic
, kibana
, logstash_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"
...
}
}
基本概念&操作
核心概念
- 节点(Node):一个节点是Elasticsearch集群中的一个单独的服务器。每个节点都参与集群的数据索引和查询操作。
- 集群(Cluster):一个集群是由多个节点组成的一个整体,这些节点共同工作,共享数据和负载。每个集群都有一个唯一的名称,这样节点就可以加入到正确的集群中。
- 索引(Index):索引是具有某些相似特征的文档集合。在关系数据库中,索引类似于数据库中的“表”。
- 类型(Type):在Elasticsearch 7.x之前的版本中,一个索引可以定义多个类型,类型是索引中的一个逻辑分区。从7.x版本开始,Elasticsearch已经废弃了类型的概念。
- 文档(Document):文档是可以被索引的信息的基本单位。在关系数据库中,文档类似于表中的“行”。
- 映射(Mapping):映射是定义文档如何存储和索引的过程,包括字段的名称和数据类型等。类似于关系数据库中的“表结构”。
- 分片(Shard):为了能够水平扩展和分布数据,索引可以被分割成多个分片。每个分片本身就是一个完整的索引。
- 副本(Replica):副本是分片的一个复制,用于提供数据冗余和提高查询性能。
基本操作
- 索引数据(Indexing):将数据存储到Elasticsearch中的过程称为索引。这通常通过HTTP POST或PUT请求完成。
- 搜索(Searching):Elasticsearch的核心功能之一是能够快速执行复杂的搜索操作。搜索可以通过HTTP GET请求和一个查询体(Query Body)来完成。
- 更新(Updating):更新操作允许你修改已经索引的文档。这通常通过HTTP POST请求完成。
- 删除(Deleting):你可以删除单个文档或整个索引。这通常通过HTTP DELETE请求完成。
- 聚合(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"
}
}
}
}'
优势
- 高性能:Elasticsearch能够快速地索引和检索数据,提供近实时的搜索体验。
- 可扩展性:Elasticsearch是分布式的,可以通过添加更多节点来水平扩展,以处理更多的数据和负载。
- 灵活性:Elasticsearch不需要预定义的数据模式,可以处理各种类型的结构化和非结构化数据。
- 强大的API:Elasticsearch提供了丰富的RESTful API,支持各种语言的客户端库,易于与现有应用集成。
- 成熟的生态系统:Elasticsearch是Elastic Stack的一部分,与Kibana、Logstash和Beats等工具集成,提供了从数据采集到可视化的完整解决方案。
不足
- 学习曲线:对于初学者来说,Elasticsearch的概念和功能可能有些复杂,需要一定的学习和实践才能熟练使用。
- 资源消耗:Elasticsearch对系统资源(如内存和CPU)的需求较高,尤其是在处理大量数据和复杂查询时。
- 管理复杂性:维护一个大型的Elasticsearch集群可能会比较复杂,需要对集群管理、监控和调优有一定的了解。
- 安全性:在默认配置下,Elasticsearch不提供认证和加密功能。虽然可以通过X-Pack等插件增加这些功能,但可能需要额外的配置和成本。
- 数据一致性: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 开源地址