Elasticsearch(简称 ES)最初发布于2010年,是一款基于 Apache Lucene 构建的现代分布式搜索与分析引擎。它用 Java 编写,是一个 NoSQL 数据库——数据以非结构化方式存储,你无法用 SQL 去查询它,但它拥有令人惊叹的搜索能力。
一句话定义:Elasticsearch 是当今最流行的日志分析平台 ELK Stack(Elasticsearch + Logstash + Kibana)的核心引擎,甚至已经成为整个技术栈的代名词。
⚠️ 重要变更:自 2021 年 1 月起,Elasticsearch 和 Kibana(7.11 版本起)已从 Apache 2.0 开源许可迁移至 SSPL 专有双许可。AWS 随即分叉出了 OpenSearch 和 OpenSearch Dashboards,继续保持 Apache 2.0 开源。
ES 概念 | 关系型数据库类比 | 说明 |
|---|---|---|
Cluster(集群) | 整个数据库服务器 | 多个节点组成的分布式系统 |
Index(索引) | 数据库(Database) | 文档的集合,存储映射和设置 |
Document(文档) | 行记录(Row) | 一条 JSON 格式的数据 |
Field(字段) | 列(Column) | 文档中的属性 |
Shard(分片) | 表分区 | 索引被水平拆分的单元,ES 的扩展性之源 |
Type(类型) | 表(Table) | ⚠️ 7.x 中已彻底删除! 6.x 时代一个 index 只能有一个 type,7.x 直接砍掉 |
传统数据库以 ID 为主键,是 key → value 的查找模式。而 Elasticsearch 采用倒排索引(Inverted Index),是 value → key 的反向查找:
传统 DB:id=1 → "Java编程思想"
ES 倒排索引:"Java" → [id:1, id:3]
"Python" → [id:2, id:4]所有不重复的词条构成索引,每个词条下挂着包含它的文档列表。这就是为什么 ES 能在 PB 级数据中毫秒级返回结果的根本原因。
7.0 引入了"搜索空闲"机制:当一个分片 30 秒内没有搜索请求时,自动进入 search idle 状态,跳过所有计划内的 refresh,直到下一次搜索到来才触发 refresh。
💡 这意味着:对于读多写少的场景,索引吞吐量可大幅提升!
⚠️ 注意:此行为仅在未显式设置 refresh_interval 时生效。如需旧行为,请显式配置刷新间隔。
对于匹配少量文档的查询,7.x 引入了 Magic WAND 算法,通过跳过低排名记录来加速 Top Hits 的检索。这是一项基于算法层面的重大优化(注意:不适用于聚合查询)。
Cross-Cluster Replication 让数据在不同集群间实时同步,对于灾备和多活架构是巨大的利好。
bashdocker pull elasticsearch:7.6.1bashdocker run --name elasticsearch \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms256m -Xmx256m" \
-d elasticsearch:7.6.1浏览器访问 http://你的IP:9200,看到 JSON 响应即表示成功。
bashdocker exec -it elasticsearch /bin/bash
cd /usr/share/elasticsearch/config
vim elasticsearch.yml追加:
yamlhttp.cors.enabled: true
http.cors.allow-origin: "*"bashdocker pull kibana:7.6.1
docker run --name kibana --link elasticsearch:test -p 5601:5601 -d kibana:7.6.1访问 http://你的IP:5601 即可进入可视化界面。
⚠️ Kibana 版本必须与 Elasticsearch 版本一致!
API | 用途 | 示例 |
|---|---|---|
GET /_cat/indices | 查看所有索引信息 | 文档数、磁盘大小、主副本分片数 |
GET /<index>/_search | 搜索匹配查询的结果 | {"query": {"match": {"title": "Elasticsearch"}}} |
GET /<index>/_doc/<id> | 获取单条文档 | — |
PUT /<index>/_doc/<id> | 索引/更新文档 | Body 为 JSON |
DELETE /<index>/_doc/<id> | 删除文档 | — |
布尔查询(Bool Query)是 ES 中最强大的查询组合方式:
json{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" }}
],
"filter": [
{ "range": { "date": { "gte": "2026-01-01" }}}
],
"should": [
{ "match": { "content": "高性能" }}
],
"must_not": [
{ "term": { "status": "deleted" }}
]
}
}
}子句 | 作用 | 是否影响评分 | 是否可缓存 |
|---|---|---|---|
must | 必须匹配(AND) | ✅ 是 | ❌ 否 |
filter | 过滤条件 | ❌ 否 | ✅ 是! |
should | 应该匹配(OR,加分) | ✅ 是 | ❌ 否 |
must_not | 必须不匹配(NOT) | ❌ 否 | ✅ 是! |
💡 性能秘诀:能用
filter就别用must!Filter 不计算评分且可缓存,性能提升显著。
建议 | 说明 |
|---|---|
用 SSD,别用 HDD | 随机 IO 是 ES 的命脉 |
内存要慷慨 | 堆内存建议 32GB 起步,但不要超过 32GB(避免 JVM 指针压缩失效) |
Tip | 详情 |
|---|---|
磁盘水位线 | 默认 low watermark 为 85%。1TB 硬盘 + 10GB 分片 → 默认只能放 80 个分片。建议加 50% 安全系数,设为 92.5% |
mlockall | 设为 true 禁止 swap,需配合 -Xmx 足够大 |
刷新间隔 | 批量写入时调大 refresh_interval(如 30s → 60s),或利用 search idle 机制 |
批量写入 | 用 Bulk API,多线程并行。收到 429 响应即达上限,增加队列无意义 |
搜索字段越少越快 | 多字段查询慢,可在索引时将多字段 copy 到一个 all 字段 |
用 alias 控制搜索范围 | 如 things_latest 只包含最近几天数据,避免全表扫描 |
用 Rollup 做预聚合 | 年度报告用 Rollup Job 而非实时聚合,性能差距可达数十倍 |
禁用不必要的正则 | 7.7% 的用户在 Painless 脚本中启用了 regex,极慢!默认已禁用 |
限制脚本上下文 | 88% 的用户未限制脚本,这是巨大的安全和性能隐患 |
Elasticsearch 7.x 默认没有任何安全防护——任何人都能访问你的所有数据。这在生产环境中是灾难性的。
elasticsearch.ymlyamlxpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
discovery.seed_hosts: ["host1", "host2"]
cluster.initial_master_nodes: ["node1", "node2"]bash/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive会为以下账户设置密码:
elastic — 超级管理员 ⚠️ 务必复杂且妥善保管kibana_system / logstash_system / beats_system — 服务账户bash/usr/share/elasticsearch/bin/elasticsearch-certutil ca
/usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12jsonPUT /_security/role/logs_readonly
{
"indices": [{ "names": ["logs-*"], "privileges": ["read"] }]
}
PUT /_security/user/log_viewer
{
"password": "securepassword123",
"roles": ["logs_readonly"],
"full_name": "Log Viewer Account"
}yamlxpack.security.audit.enabled: true
xpack.security.audit.logfile.events.include: authentication_failed, access_denied
xpack.security.audit.logfile.events.exclude: authentication_success🛡️ 即使在内网环境也应启用安全功能! 内部威胁和横向移动攻击同样危险。
在 pom.xml 中引入依赖(版本需与 ES 集群一致):
xml<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.17.0</version>
</dependency>配置文件:
yamlspring:
elasticsearch:
rest:
uris: http://localhost:9200
username: elastic
password: your_password结合 @Document 注解即可实现对象与 ES 文档的自动映射。
维度 | 核心理念 |
|---|---|
架构 | 分布式 + 倒排索引 = 水平扩展无上限 |
搜索 | 尽可能用 filter 代替 must,用 constant_score 代替评分查询 |
写入 | Bulk + 多线程 + 调大 refresh_interval |
安全 | 默认裸奔 ≠ 可以裸奔,生产必须上 RBAC + SSL + 审计 |
运维 | SSD + 大内存 + 监控水位线 + 限制脚本 |
Elasticsearch 7.x 不仅仅是一个搜索引擎,它是现代数据平台的搜索与分析基石。掌握它,你就掌握了让数据"开口说话"的钥匙。🔑
本文基于 Elasticsearch 7.x 官方文档及实战经验整理,适用于 7.0 ~ 7.17 全系列版本。如需了解 8.x 新特性,建议查阅最新官方发布说明。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。