当前位置: 首页 > news >正文

Elasticsearch搜索引擎深度解析:把搜索核心讲透,面试都是小菜

Elasticsearch搜索引擎深度解析:把搜索核心讲透,面试都是小菜

🎯写在前面:在大数据时代,全文搜索是每个系统必备的功能。Elasticsearch作为分布式搜索的标杆,以其强大的全文搜索能力和水平扩展能力,成为搜索领域的不二之选。但你真的了解ES的底层原理吗?这篇文章,将带你深度剖析Elasticsearch!

一、核心原理:倒排索引

1.1 正排索引 vs 倒排索引

┌─────────────────────────────────────────────────────────────────────┐ │ 正排索引 vs 倒排索引 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ 正排索引(MySQL默认): │ │ ┌─────────┬───────────────────────────────────┐ │ │ │ 文档ID │ 文档内容 │ │ │ ├─────────┼───────────────────────────────────┤ │ │ │ 1 │ 我爱北京天安门 │ │ │ │ 2 │ 北京是中国的首都 │ │ │ │ 3 │ 天安门在中国北京 │ │ │ └─────────┴───────────────────────────────────┘ │ │ 查询方式:文档ID → 文档内容 │ │ │ │ 倒排索引(ES采用): │ │ ┌───────────┬───────────────────────────────┐ │ │ │ 词 │ 文档ID │ │ │ ├───────────┼───────────────────────────────┤ │ │ │ 我 │ [1] │ │ │ │ 天安门 │ [1, 3] │ │ │ │ 北京 │ [1, 2, 3] │ │ │ │ 中国 │ [2, 3] │ │ │ │ 首都 │ [2] │ │ │ │ 是 │ [2] │ │ │ └───────────┴───────────────────────────────┘ │ │ 查询方式:词 → 包含该词的文档列表 │ │ │ │ 优势:查询"北京",直接返回[1,2,3],无需扫描全表! │ │ │ └─────────────────────────────────────────────────────────────────────┘

1.2 倒排索引详细结构

┌─────────────────────────────────────────────────────────────────────┐ │ 倒排索引结构 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ Dictionary(词典) │ │ │ │ 包含所有term,按字典序排列,支持二分查找 │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ ↓ │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ Posting List(倒排列表) │ │ │ │ 每个term对应一个列表,记录包含该term的文档ID │ │ │ │ [doc1, doc2, doc3, ...] │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ ↓ │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ FST(有限状态机) │ │ │ │ 用于前缀查询,如"开*"匹配"开放"、"开始" │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ Skip List(跳表) │ │ │ │ 用于AND/OR运算加速,避免逐个遍历Posting List │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ Bitmap(位图) │ │ │ │ 文档数量少时,使用bitset存储,节省空间 │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘

1.3 分词器原理

// ES分词流程"我是程序员,在北京工作"Analyzer["我","是","程序","程序员","员","在","北京","工作"]/** * 分词器组成 */publicclassAnalyzerComponents{// 1. Character Filter(字符过滤器)// - HTML Strip:去除HTML标签// - Mapping:字符映射(如把":"替换为"_")// - Pattern Replace:正则替换// 2. Tokenizer(分词器)// - Standard:默认分词,按单词分割// - Keyword:不分词,整个字符串作为一个token// - Whitespace:按空格分割// - Punctuation:按标点分割// 3. Token Filter(词元过滤器)// - Lowercase:转小写// - Stop:去停用词(the, a, is)// - Synonym:同义词处理// - Stemming:词干提取(running → run)}// 自定义分词器PUT/my_index{"settings":{"analysis":{"char_filter":{"my_char_filter":{"type":"mapping","mappings":["& => and"]}},"tokenizer":{"my_tokenizer":{"type":"pattern","pattern":"[,\\s]+"// 按逗号和空格分割}},"filter":{"my_synonym":{"type":"synonym","synonyms":["程序员,码农,程序猿","北京,帝都"]},"my_stopwords":{"type":"stop","stopwords":["的","了","在"]}},"analyzer":{"my_analyzer":{"type":"custom","char_filter":["my_char_filter"],"tokenizer":["my_tokenizer"],"filter":["lowercase","my_stopwords","my_synonym"]}}}}}

二、数据结构:Shard与Segment

2.1 ES数据存储架构

┌─────────────────────────────────────────────────────────────────────┐ │ ES数据存储架构 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ Index(索引) │ │ ↓ │ │ ┌────────┬────────┬────────┐ │ │ │ Shard 0│ Shard 1│ Shard 2│ ← 主分片(Primary Shard) │ │ │ (P0) │ (P1) │ (P2) │ │ │ └────────┴────────┴────────┘ │ │ ↓ ↓ ↓ │ │ ┌────────┬────────┬────────┐ │ │ │ Shard 0│ Shard 1│ Shard 2│ ← 副本分片(Replica Shard) │ │ │ (R0) │ (R1) │ (R2) │ │ │ └────────┴────────┴────────┘ │ │ │ │ Shard = Lucene Index │ │ ↓ │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ Segment(分段) │ │ │ │ 每个Shard包含多个Segment(_segments API查看) │ │ │ │ 新数据写入新Segment,查询时并行搜索所有Segment │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ ↓ │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ Document写入流程 │ │ │ │ 1. 写入内存Buffer │ │ │ │ 2. 写入translog(保证持久性) │ │ │ │ 3. refresh后生成Segment │ │ │ │ 4. flush时清空Buffer和translog │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘

2.2 文档写入流程

/** * 文档写入完整流程 */// 1. 客户端请求PUT/my_index/_doc/1{"name":"张三","age":28,"skills":["Java","Python"]}// 2. 请求路由到主分片// hash(document_id) % number_of_shards = primary_shard// 3. 主分片写入流程/** * ┌─────────────────────────────────────────────────────────────────┐ * │ 写入流程 │ * │ │ * │ 1. 写入内存Buffer(不可搜索) │ * │ ↓ │ * │ 2. 写入Translog(保证持久性) │ * │ ↓ │ * │ 3. 定期refresh(默认1秒,可配置) │ * │ ↓ │ * │ 4. 生成新Segment(可搜索) │ * │ ↓ │ * │ 5. Segment定期flush(清空Buffer和Translog) │ * │ ↓ │ * │ 6. Segment定期merge(合并小Segment,优化查询) │ * │ │ * └─────────────────────────────────────────────────────────────────┘ */// 4. 并行复制到副本分片// 只有所有副本都写入成功,才算写入成功(co
http://www.jsqmd.com/news/638665/

相关文章:

  • EldenRingFPSUnlockAndMore:艾尔登法环终极帧率解锁与游戏优化指南
  • CasRel模型企业级部署架构设计:高可用与弹性伸缩
  • 探寻杜邦艺术漆加盟靠谱吗,为你解答疑惑 - myqiye
  • k8s字段
  • 大模型Post-training优化新趋势:GRPO算法深度解析(小白程序员必备,建议收藏)
  • 2026从原理到实战:C# 深度解析 Modbus TCP 报文结构与通信机制
  • Phi-4-mini-reasoning开发者手册:vLLM服务日志排查与Chainlit调试技巧
  • 5分钟解锁Windows本地实时语音转文字:隐私与效率的完美平衡
  • AI编程助手完全指南:Cursor、Copilot、Claude深度对比 (2026版)
  • 2026 北京地区老酒回收实测报告:主流商家实测对比与科学选择指南 - 资讯焦点
  • 2026年新疆升学宴场地预定与发布会年会场地公司推荐:十二星座礼宴中心一站式礼宴解决方案专业供应 - 品牌推荐官
  • VBA图表绘制:处理不同日期的数据
  • 3小时落地企业级RAG应用:从文档检索到智能问答全流程
  • GLM-4.1V-9B-Base免配置环境:内置Jupyter+Web双入口,调试运维一体
  • 深度解析Balena Etcher:跨平台镜像烧录工具的技术实现与应用指南
  • OpenClaw开源汉化发行版:2026最新完整介绍+下载+安装+配置全教程
  • FLUX.小红书极致真实V2内容提效:单日产出30+小红书笔记配图工作流拆解
  • 终极指南:如何在Zotero中一键实现PDF文献智能双语翻译
  • 实验报告一
  • 纯化正常兔IgG,DEAE层析+免疫电泳双重质控
  • 2026年PVC公司最新排行榜/PVC排水管,PVC给水管,PVC穿线管,PVC七孔管,PVC工程管 - 品牌策略师
  • RWKV7-1.5B-g1a多场景应用:法律条文摘要+合同关键条款提取演示
  • 实测踩坑:MPQ4572降压芯片SW波形出现大小波,别急着换电感,先看这个补偿设置
  • 手把手教你部署清音刻墨:基于Qwen3的智能字幕对齐工具实战体验
  • 开源OBS多路RTMP推流插件:3个核心机制深度解析与实战指南
  • 2026年压焊钢格板厂家推荐:热镀锌/不锈钢/重型/轻型/插接钢格板专业供应 - 品牌推荐官
  • Qwen2.5-14B-Instruct部署指南:像素剧本圣殿OSS图床对接与缓存策略
  • 2025网盘下载效率革命:LinkSwift直链工具全面解析
  • VMware虚拟机中体验PyTorch:Ubuntu系统安装与GPU穿透配置指南
  • 1990-2025年省市县土地利用面积土地覆盖面积数据