什么是ElasticSearch

Elasticsearch 是一个分布式的搜索与分析引擎,专门用于处理大规模数据的全文搜索、结构化查询、日志分析和实时数据可视化等场景。它是 Elasticsearch Stack(原 ELK Stack) 的核心组件,和 Logstash、Kibana 一起广泛应用于日志收集和分析系统中。

核心特点

全文搜索 支持分词、模糊匹配、相关性打分等强大的全文检索功能。

分布式架构 可以横向扩展,支持亿级数据的快速读写和查询。

实时分析 支持对数据的实时聚合、过滤、统计分析。
RESTful API 操作基于 HTTP 的 JSON 请求,易于集成。

强大的查询 DSL 提供基于 JSON 的查询语法,支持布尔、范围、模糊、地理、聚合等多种查询方式。

Elasticsearch工作原理

数据写入流程: 搜索查询流程:
┌──────────┐ ┌────────────┐
│ 客户端 │ │ 客户端 │
└────┬─────┘ └─────┬──────┘
│ HTTP/JSON │ HTTP/JSON
▼ ▼
┌────────────┐ ┌─────────────┐
│ Elasticsearch│ │ Elasticsearch │
└────┬───────┘ └─────┬────────┘
│ 分片分发 │ 查询路由
▼ ▼
┌────────────┐ ┌────────────┐
│ 倒排索引构建│ │ 倒排索引查找│
└────────────┘ └────────────┘

核心概念先掌握

文档(Document) Elasticsearch 中的最小数据单元(如一条商品信息),JSON格式
索引(Index) 一组类似文档的集合,相当于数据库中的表
分片(Shard) 索引被分成的物理存储单位,分布在不同节点
倒排索引 实现全文搜索的关键数据结构
节点(Node) Elasticsearch 集群中的单个服务器实例
集群(Cluster) 一组 Elasticsearch 节点组成,提供统一服务

数据写入(索引)过程

客户端提交 JSON 数据(Document)

选择目标索引(如:products)

路由算法决定写入哪个主分片(Primary Shard)

字段经过分析器(Analyzer)处理 → 分词、去停用词

构建倒排索引:词 → 文档 ID 映射

主分片写入完成后,同步写入副本分片(Replica)

数据查询(搜索)过程

客户端发起查询(DSL / REST)

协调节点(通常是接收请求的节点)解析查询

路由到所有涉及的分片(主分片或副本分片)执行查询

每个分片执行倒排索引搜索,计算匹配度

汇总所有分片的结果,按相关性排序

将最终结果返回给客户端

倒排索引机制(全文搜索核心)

示例:
我们有三个文档:

ID 内容
1 我喜欢苹果手机
2 苹果手机很好用
3 华为手机也不错

分词后:
苹果 → [1, 2]
手机 → [1, 2, 3]
华为 → [3]

这就形成了“关键词 → 文档列表”的倒排索引结构,搜索“苹果 手机”时可快速定位文档 1 和 2。

分布式架构的工作方式

每个索引由若干个 主分片(Primary Shard) 和 副本分片(Replica Shard) 组成。

查询请求可以由主分片或副本分片任意响应,写入只能到主分片。

分片分布在不同节点上,支持高可用和水平扩展。

示例(products 索引):

分片类型 分片编号 所在节点
主分片 shard-0 Node-A
副本分片 shard-0 Node-B

近实时特性(NRT)

Elasticsearch 是近实时(Near Real Time)系统:

文档写入后,不是立即可搜索的。

默认每隔 1 秒 会刷新(refresh),使新数据可见。

可手动调用 POST /index/_refresh 强制刷新。

总结关键点
环节 技术原理
写入 分片路由 + 分词 + 倒排索引构建
查询 分片并行 + 倒排索引搜索 + 聚合汇总
扩展 多节点多分片自动负载均衡
实时性 默认 1 秒刷新,近实时可查

安装ElasticSearch

打开浏览器访问官方下载页面:
https://www.elastic.co/downloads/elasticsearch

找到最新版(如 9.0.3),点击 Windows zip (x86_64) 版本下载。
文件示例:elasticsearch-9.0.3-windows-x86_64.zip

配置环境变量

启动 Elasticsearch 服务

方法 1:命令行启动(推荐用于开发)
打开 PowerShell 或 CMD(以管理员身份)


进入 bin 目录:

1
cd E:\elasticsearch-9.0.3-windows-x86_64\elasticsearch-9.0.3\bin

执行启动命令:

1
2

.\elasticsearch.bat

启动过程提示(首次运行可能显示):
生成默认密码

自动启用安全性(Elastic 用户名是 elastic,密码会显示在控制台)
一定要复制保存好初始密码!

验证服务是否启动成功

方法 1:浏览器访问测试
打开浏览器,输入:

1
http://localhost:9200

你应该会看到如下 JSON:

1
2
3
4
5
6
7
8
9
{
"name": "DESKTOP-ABC123",
"cluster_name": "elasticsearch",
"version": {
"number": "9.0.3",
...
},
"tagline": "You Know, for Search"
}

方法 2:命令行测试

1
curl -u elastic http://localhost:9200

查看默认用户名和密码

Elasticsearch 9.x 默认启用安全认证,初始用户为:

用户名 密码
elastic 启动时在控制台生成(或 logs 中找)

可通过如下文件查看密码:

1
E:\elasticsearch-9.0.3-windows-x86_64\elasticsearch-9.0.3\log\elasticsarch.log

搜索关键词 generated password。

配置文件路径说明(可选修改)

路径:E:\elasticsearch-9.0.3-windows-x86_64\elasticsearch-9.0.3\config\elasticsearch.yml

可配置内容:

1
2
3
4
5
6
7
8
9
cluster.name: my-cluster
node.name: node-1
path.data: D:\esdata
path.logs: D:\eslogs

network.host: 0.0.0.0 # 允许外部访问
http.port: 9200

xpack.security.enabled: true

关闭服务的方法

在控制台按下:

Ctrl + C
或关闭 PowerShell 窗口即可。

ElasticSearch一些问题

一个异常received plaintext http traffic on an https

原因分析

日志级别为WARN,表示有异常情况
日志来自o.e.h.n.
Netty4HttpServerTransport,即Elasticsearch的HTTP服务器组件
日志内容提示”received plaintext http traffic on an https channel”,即在HTTPS通道上接收到了明文HTTP流量
Elasticsearch的应对措施是”closing connection”,即关闭了这个连接
所以可以判断,Elasticsearch服务器期望客户端使用HTTPS发送请求,但实际收到的是明文HTTP请求,因此拒绝了这些请求。

同时日志中也提到了请求的源地址和目标地址,这里都是[0:0:0:0:0:0:0:1],即IPv6环回地址,相当于IPv4的127.0.0.1,表示请求来自本机。目标端口为9200,即Elasticsearch的默认端口。

方案一(使用HTTPS)

使用HTTPS协议访问Elasticsearch而不是HTTP。
之前你PUT访问的是http://localhost:9200,现在将设你如将请求的URL改为https://localhost:9200,并确保Elasticsearch配置了正确的SSL证书。开发环境下可以直接请求。

身份验证

但是用https会弹出elasticSearch省份验证。

Elasticsearch 9.0.3 的内置用户包括:

elastic:超级管理员用户,拥有所有权限。
kibana_system:Kibana 用于与 Elasticsearch 通信的用户。
logstash_system:Logstash 用于与 Elasticsearch 通信的用户。
beats_system:Beats 用于与 Elasticsearch 通信的用户。

使用 elasticsearch-reset-password 工具(推荐)
若要重置 elastic 用户的密码,可执行以下命令:

1
2
3
4
5
6
7
8
# 进入Elasticsearch bin目录
cd /path/to/elasticsearch/bin

# 交互式重置密码(会提示输入新密码)
./elasticsearch-reset-password -u elastic

# 或自动生成随机密码并显示(非交互式)
./elasticsearch-reset-password -u elastic --batch

浏览器测试https://localhost:9200