ElasticSearch
什么是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 |
|
启动过程提示(首次运行可能显示):
生成默认密码
自动启用安全性(Elastic 用户名是 elastic,密码会显示在控制台)
一定要复制保存好初始密码!
验证服务是否启动成功
方法 1:浏览器访问测试
打开浏览器,输入:
1 | http://localhost:9200 |
你应该会看到如下 JSON:
1 | { |
方法 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 | cluster.name: my-cluster |
关闭服务的方法
在控制台按下:
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 | # 进入Elasticsearch bin目录 |