搜索与 ELK 概览
倒排索引、场景与 Docker。
搜索与 Elasticsearch 概览
这一课你将能做到
- 说清楚「数据库 LIKE 查询」在搜索场景下的三个硬伤,以及倒排索引如何解决
- 用 Docker 在本地启动一个 Elasticsearch 8.x 单节点,并通过 curl 完成第一次写入和搜索
- 说出 Elasticsearch、Kibana、Logstash、Beats 各自的角色,以及索引、文档、分片三个核心词的含义
为什么要学
本站题库将来要支持两个搜索入口:学员在搜索框里输入「Spring 事务失效」,要从几千道题的题干、选项、解析里找出相关题目;输入「倒排索引」,要能同时搜到相关题目和对应课时。这类需求用 MySQL 写就是:
SELECT * FROM question WHERE stem LIKE '%Spring 事务失效%' OR analysis LIKE '%Spring 事务失效%';
这条 SQL 有三个硬伤:① 前置通配符 %xxx 走不了 B+ 树索引,几千行还行,几十万行就是全表扫描;② 搜「事务失效」能中,搜「失效 事务」「事务不生效」就不中,用户不可能记住原文措辞;③ 结果没有相关性排序,命中和没命中一样平铺。
人话:数据库是为「精确存取」设计的——按主键取一行、按外键关联一批;Elasticsearch(下称 ES)是为「按相关性找内容」设计的——给你一段文字,它按「有多匹配」排序返回。两者不是替代关系,是分工关系。本站题库数据仍以 MySQL 为准,ES 只承担搜索,不做数据库同步(不接 binlog/CDC),题目通过应用层写入和批量导入进入 ES。
先建立图像
ES 的底层叫倒排索引(Inverted Index)。正向索引是「文档 → 词」:
文档1(题干): Spring 事务 失效 的 场景
文档2(题干): Redis 缓存 失效 与 数据库 一致性
倒排索引反过来,是「词 → 文档列表」:
词 文档列表 频率
spring → 文档1
事务 → 文档1
失效 → 文档1, 文档2
redis → 文档2
缓存 → 文档2
一致性 → 文档2
搜「缓存 失效」时,ES 拿两个词的文档列表求交集,文档 2 两个词都中、文档 1 中一个,按命中程度打分排序。这就是相关性的来源,也是搜索能做到毫秒级的原因——查表而不是逐行翻文本。
ELK 全家桶的分工:
Beats/Logstash(采集、加工)→ Elasticsearch(存储、检索、聚合)→ Kibana(界面、图表、告警)
跟着做
约定:本课全程使用 ES 8.x。8.x 默认开启安全认证(HTTPS + 账号密码),下文 curl 统一用 -k(跳过自签名证书校验)和 -u elastic:你的密码,请把密码替换成你自己的;Windows PowerShell 下 curl 如有别名问题,用 curl.exe。
步骤 1:Docker 启动单节点 ES
docker network create es-net
docker run -d --name es01 --net es-net \
-p 9200:9200 \
-e "discovery.type=single-node" \
-e "ELASTIC_PASSWORD=abcd1234" \
-e "xpack.security.http.ssl.enabled=false" \
docker.elastic.co/elasticsearch/elasticsearch:8.11.0
说明:discovery.type=single-node 表示单节点模式(免去集群发现配置);ELASTIC_PASSWORD 设置 elastic 超级用户密码;学习环境里我们关闭了 HTTP 层 SSL,所以下面用 http://。生产环境不要关 SSL。
等约 30 秒,验证:
curl -u elastic:abcd1234 http://localhost:9200
返回集群名、版本号 即成功。