ElasticSearch 学习笔记:Python 开发者视角下的全文检索引擎
ElasticSearch 学习笔记Python 开发者视角下的全文检索引擎不聊虚的从实际需求出发搞懂 ES 是什么、能干什么、跟 Python 怎么配合一、我是怎么接触到 ES 的先交代一下背景我学 Python 2个多月了主要方向是 AI 应用开发。做过一些课程项目——数据分析脚本、爬虫、基础的大模型调用、简单的 RAG 知识库问答。接触的东西多了有些问题就慢慢暴露出来了。第一次觉得搜索是个问题是在做一个知识库问答应用的时候。当时我跟着教程搭了一个简单的 RAG 流程把文档切成小块用 Sentence-BERT 转成向量存在内存里然后算余弦相似度来找相关内容。原型跑起来效果还行但数据量稍微大一点——大概一两千个 chunks——就开始卡顿了。每次检索都要遍历所有向量耗时越来越长。教程里提到生产环境推荐用向量数据库比如 Milvus 或 Elasticsearch。Milvus 我后来学了但 ES 一直没认真了解过。直到最近重新翻 RAG 相关的内容发现 ES 不仅能做全文检索还能当向量数据库用支持 dense vector 字段存储和搜索。这才决定认真学一下 ES。说白了就是做 AI 相关的应用迟早要碰到怎么在大量数据里快速找到相关内容的问题。ES 是解决这个问题的一个主流方案绕不过去。二、ElasticSearch 到底是什么官方定义ElasticSearch 是一个开源的分布式搜索和分析引擎用 Java 开发是目前最流行的企业级搜索引擎能够实现近实时搜索。我自己理解得更直白一些ES 就是一个专门用来找东西的工具。你可能会说“找东西MySQL 也能做啊为什么要单独搞一个这里的关键是规模”。MySQL 在百万级数据里做模糊查询还能勉强撑住到了千万级、亿级就扛不住了。而 ES 天生就是为这种场景设计的。几个关键特点它不是数据库虽然 ES 确实能存储数据但它的核心价值是检索不是存储。ES 不支持事务、不支持 Join、不适合频繁更新。你仍然需要 MySQL 或 PostgreSQL 做主数据库ES 作为补充提供搜索能力。它是分布式的数据量大了一个节点扛不住ES 会自动把数据拆分到多个节点上查询的时候也自动并行处理。这些对开发者来说是透明的——你往一个集群里塞数据ES 自己管分片、管副本、管路由。它是近实时的数据写入后大约 1 秒就能被搜索到。不是毫秒级也不是分钟级而是秒级。对大多数搜索场景来说1 秒的延迟完全可以接受。我刚开始学 ES 的时候经常把它和 MySQL 搞混觉得ES 能存数据那是不是可以替代 MySQL后来才明白它们解决的问题完全不同MySQL 解决数据怎么可靠地存的问题ES 解决数据怎么高效地找的问题。各司其职。关于版本Elasticsearch 的版本迭代很快目前最新版本已经是 8.x。学习的时候要注意7.x 和 8.x 之间有一些 API 变化直接看 8.x 的文档就好。三、先看数据ES 到底有多流行不吹不黑用数据说话。根据 DB-Engines 2024 年 7 月的搜索引擎排名排名搜索引擎得分1Elasticsearch130.822Splunk92.923Solr38.884OpenSearch16.64差距很明显。ES 的得分是第二名 Splunk 的 1.4 倍是第三名 Solr 的 3 倍多。这个排名不是瞎排的它综合了 Google 搜索热度、技术讨论活跃度、招聘岗位数量、相关项目数量等多个维度。为什么 ES 这么受欢迎我理解是这么几个原因功能足够强全文检索、模糊匹配、同义词处理、高亮显示、地理位置查询、聚合分析……你能想到的搜索功能ES 基本都支持。使用门槛不算高ES 提供了 RESTful API发 HTTP 请求就能操作不需要学一门新的查询语言。中文文档和社区资源也比较丰富遇到问题基本能搜到答案。生态完整ES 不是孤零零的它的背后是 Elastic Stack——从数据采集Beats到数据处理Logstash到存储搜索ES到可视化Kibana一整套工具链都是现成的。四、Elastic Stack 四件套ES 在大部分场景下不是单独使用的它和三个小伙伴组成了 Elastic StackElasticsearch核心数据的存储和检索引擎。所有的数据最终都会汇聚到这里建立索引提供搜索服务。Logstash数据管道负责从各种数据源采集数据进行过滤、解析、格式转换然后把处理好的数据发送到 ES。你可以把它理解成一个数据处理流水线——输入端可以接日志文件、数据库、消息队列输出端可以接 ES、Kafka 等。Beats轻量级采集器运行在数据源所在的服务器上负责收集特定类型的数据并发送出去。Filebeat 收集日志文件Metricbeat 收集系统和服务的性能指标Heartbeat 监控服务是否存活。它们比 Logstash 更轻量资源消耗更少。Kibana可视化界面ES 的图形化管理工具。在 Kibana 里可以执行查询、查看数据分布、创建图表和仪表盘不需要写代码就能对数据做可视化分析。这个组合的设计思路是Beats 负责采集Logstash 负责处理ES 负责存储和搜索Kibana 负责展示。每个组件各司其职可以单独替换或扩展。我目前用到的还只是 ES 本身没有把整套 Stack 都跑起来。但了解这个生态对理解 ES 的定位有帮助——ES 不是一个孤立的工具而是整套数据解决方案的一部分。五、ES 为什么搜索这么快这是我最关心的问题它到底是怎么做到搜索速度远快于普通数据库的核心答案就是倒排索引。为了理解这个概念我们先看普通数据库的做法。正向索引MySQL 的 LIKE 查询假设有三篇文档文档1: ElasticSearch 是一个分布式搜索引擎 文档2: Python 可以使用 ElasticSearch 客户端 文档3: 搜索引擎的核心技术是倒排索引如果使用 MySQL 的LIKE %搜索引擎%来搜索MySQL 需要做全表扫描——逐行检查每个文档的文本字段里是否包含搜索引擎这个词。数据量小的时候感觉不到慢但数据量达到百万级的时候每次查询都要扫几百万行记录代价非常大。倒排索引ES 的方式ES 的做法是在数据写入的时候提前对文本进行分词然后建立一张词 → 文档的映射表。分词就是把一段文本拆成一个个独立的词条。比如ElasticSearch 是一个分布式搜索引擎经过分词后会得到[“ElasticSearch”, “分布式”, “搜索引擎”]实际的分词会更复杂涉及停用词过滤、词干提取等但核心思想就是拆词。建好的倒排索引大概长这样词条出现在哪些文档ElasticSearch文档1, 文档2分布式文档1搜索引擎文档1, 文档3Python文档2倒排索引文档3现在用户搜索搜索引擎ES 直接在倒排索引表里查这个词条立刻就能知道它出现在文档1和文档3中。不需要扫描所有文档只需要查一张哈希表时间复杂度从 O(n) 降到了 O(1)。这就是 ES 搜索速度快得多的根本原因。代价是写入的时候需要额外做分词和建索引但搜索场景下一次写入、多次查询的读写比让这个代价完全可以接受。相关性得分除了快ES 还能按相关性排序。搜索搜索引擎的时候文档1里这个词出现了两次标题和正文各一次文档3只出现了一次所以文档1的相关性得分更高排在前面。ES 用 TF-IDF 或 BM25 算法计算这个分数具体的公式我现在还没完全搞懂但大致知道它是怎么工作的。六、ES 有哪些核心概念在开始用 ES 之前有几个核心概念需要先搞清楚。我尽可能用跟 MySQL 类比的方式来说方便理解。索引Index类比 MySQL 的 Database。一个索引里可以存很多文档每个文档有相同的字段结构。比如你建了一个articles索引专门存文章数据。文档Document类比 MySQL 的一行记录。ES 存储的基本单位是 JSON 格式的文档。一个文档就是一个 JSON 对象包含多个字段。字段Field类比 MySQL 的列。文档里的每个键值对就是一个字段。但 ES 的字段可以指定类型——text类型用于全文检索keyword类型用于精确匹配geo_point用于地理位置搜索dense_vector用于向量检索。映射Mapping类比 MySQL 的表结构定义。它定义了索引里每个字段的类型和属性。ES 支持动态映射——你往里塞数据的时候ES 会自动推断字段类型并创建映射。但自动推断不一定准确生产环境建议手动定义映射。分片Shard这是 ES 分布式的核心机制。一个索引的数据会被拆分成多个分片分布到不同的节点上。查询的时候每个分片并行搜索然后汇总结果。分片数在索引创建时确定之后不能修改这一点要注意。副本Replica分片的备份。每个分片可以有一个或多个副本提供高可用性——某个节点挂了副本分片可以顶上。同时副本也能分担查询压力提升读取性能。节点Node运行 ES 实例的一台机器。多个节点组成一个集群。这些概念初学的时候容易搞混我自己的经验是跟着教程跑一遍建索引、插数据、查数据的流程这些概念自然就清楚了光看定义记不住。七、ES 的应用场景课里讲了三个主要的应用场景我来逐个说下自己的理解。场景一全文检索这是 ES 最核心、应用最广泛的场景。电商搜商品、知识库搜文档、应用商店搜 App、代码仓库搜代码……只要是输入关键词找内容的场景ES 基本都能胜任。我印象比较深的是ES 不只是搜出来它提供的能力比我想象的丰富得多相关性排序匹配度高的排前面用户最可能想要的结果先看到关键词高亮在搜索结果里把匹配的词用特殊样式标出来拼写纠错用户打错字了也能自动纠正比如输elasitc能找到elastic同义词处理搜手机也能匹配到移动电话拼音搜索输拼音也能搜出对应的中文内容这些功能在 MySQL 里做非常麻烦甚至做不到ES 开箱即用。很多知名企业在用——阿里巴巴的电商搜索、腾讯文档的全文检索、滴滴的订单搜索背后都有 ES。场景二日志分析这个场景我虽然没在生产环境实践过但能理解它的价值。系统运行会产生海量日志出了问题要排查的时候从几十 GB 的日志文件里找线索非常痛苦。ES 可以把日志集中存储、建立索引然后提供快速检索能力。你可以按时间范围筛选、按错误级别过滤ERROR / WARN / INFO、按关键词搜索。配合 Kibana 的图表功能还能看到日志的趋势变化——某个时间段 ERROR 突然增多可能就是系统出问题的信号。Elastic Stack 中的 Filebeat 就是专门用来采集日志文件的Logstash 可以解析日志格式ES 存储检索Kibana 可视化展示——整套方案覆盖了日志处理的全链路。场景三商业智能与数据分析ES 不仅能查还能算。它支持聚合分析可以做数据统计和分组汇总。比如统计每个月的销售额按地区分组统计用户数量计算某个字段的平均值、最大值、最小值做时间序列分析看趋势变化配合 Kibana 的仪表盘功能可以搭建出实时更新的数据看板。对于需要快速做数据探索和分析的场景ES Kibana 的组合比写 SQL 脚本要快得多。八、ES 和 MySQL 的对比总结对比维度ElasticSearchMySQL核心用途全文检索、数据分析事务性数据存储索引方式倒排索引B 树查询类型模糊匹配、相关性排序精确查询、范围查询事务支持不支持 ACID 事务支持 ACID 事务水平扩展原生分布式需要额外方案分库分表适用数据量GB 到 PB 级百万到亿级看配置实时性近实时约 1 秒延迟强一致性两者是互补关系不是替代关系。一般用 MySQL 存业务数据用 ES 提供搜索能力。数据从 MySQL 同步到 ES 是常见的架构模式。同步方式可以是应用层双写写入 MySQL 的同时写入 ES异步同步用 Logstash 或 Canal 监听 MySQL binlog增量同步到 ES定时批量同步定期从 MySQL 导出数据全量重建 ES 索引九、Python 开发者怎么用 ESES 提供了 RESTful API所以任何能发 HTTP 请求的语言都可以操作 ES。对于 Python 来说官方客户端elasticsearch-py是最直接的方式。安装pipinstallelasticsearch连接 ESfromelasticsearchimportElasticsearch# 连接本地 ES默认端口 9200esElasticsearch(http://localhost:9200)# 检查连接是否成功print(es.ping())# True 表示连接正常创建索引相当于 MySQL 的 CREATE DATABASE 建表# 定义索引的映射表结构mapping{mappings:{properties:{title:{type:text,analyzer:ik_max_word},content:{type:text,analyzer:ik_max_word},author:{type:keyword},publish_date:{type:date},view_count:{type:integer}}}}# 创建索引如果已存在会报错es.indices.create(indexarticles,bodymapping)注意analyzer: ik_max_word是中文分词器插件需要额外安装。如果只是英文内容用默认的standard分析器就行。索引文档插入数据doc{title:ElasticSearch 入门教程,content:ElasticSearch 是一个基于 Lucene 的分布式搜索引擎提供全文检索、结构化搜索和分析能力。,author:张三,publish_date:2026-01-15,view_count:1024}# 插入文档如果 id 不存在则创建存在则覆盖es.index(indexarticles,id1,bodydoc)搜索文档# 搜索在 title 和 content 字段中匹配 搜索引擎resultes.search(indexarticles,body{query:{multi_match:{query:搜索引擎,fields:[title,content]}},highlight:{fields:{content:{}}}})# 处理结果forhitinresult[hits][hits]:print(f得分:{hit[_score]})print(f标题:{hit[_source][title]})ifhighlightinhit:print(f高亮:{hit[highlight][content]})print(---)这个搜索会返回所有在标题或内容里包含搜索引擎的文档按相关性得分从高到低排序。highlight部分会让匹配的词在结果中被标记出来。聚合分析# 按作者分组统计文章数量resultes.search(indexarticles,body{size:0,# 不返回具体文档只返回聚合结果aggs:{by_author:{terms:{field:author}}}})forbucketinresult[aggregations][by_author][buckets]:print(f{bucket[key]}:{bucket[doc_count]}篇文章)删除索引# 删除索引谨慎操作es.indices.delete(indexarticles)这些操作基本覆盖了日常开发 80% 的使用场景。更复杂的查询语法布尔查询、范围查询、嵌套查询等等到实际用到的时候再深入学。十、ES 在 AI 领域的应用作为学 AI 方向的学生我关注 ES 还有一个原因它在 AI 应用开发中越来越常被用到了特别是在 RAG 和 Agent 相关的场景里。最直接的应用是向量检索。从 ES 8.0 开始官方加入了dense_vector字段类型可以存储和搜索 embedding 向量。这就意味着 ES 可以作为向量数据库来使用。具体用法大致是这样的# 定义包含向量字段的映射mapping{mappings:{properties:{text:{type:text},embedding:{type:dense_vector,dims:768}# 768 维向量}}}# 搜索的时候用 script_score 计算余弦相似度resultes.search(indexdocuments,body{query:{script_score:{query:{match_all:{}},script:{source:cosineSimilarity(params.query_vector, embedding) 1.0,params:{query_vector:query_embedding}}}}})这样你就能在同一个系统里同时做关键词检索传统的全文搜索和语义检索基于向量的相似度搜索还可以把两者混合起来——先用关键词搜一遍再用向量搜一遍然后合并排序。这在 RAG 应用里非常实用。我现在的理解是对于个人项目或原型阶段用 Chroma 或 FAISS 足够了。但如果数据量大了、或者需要跟现有的 ES 基础设施整合用 ES 做向量存储和检索是合理的选择。ES 支持混合检索全文检索 向量检索 过滤条件组合这是很多专门做向量的数据库暂时还做不到的。十一、简单总结一下学完这篇之后我对 ElasticSearch 的认识大概可以归纳成几点ES 本质上是一个专门做搜索的工具它和 MySQL 不打架各干各的活。MySQL 管数据怎么存得稳、管事务一致性ES 管数据怎么查得快。实际项目里通常是两者配合用不是二选一。ES 快的原因我算是搞明白了核心就是倒排索引。提前分词、建映射表搜索的时候直接查表而不是扫全文时间复杂度的差距在数据量大到一定程度后会变得非常明显。这也解释了为什么小项目可能感觉不到 ES 的必要性但数据量一上去差距就出来了。ES 在 AI 相关开发里也有用武之地尤其是向量检索和混合检索这块。做 RAG 应用的时候如果能用 ES 同时做关键词匹配和语义匹配比单用向量数据库更灵活。对我个人来说目前水平只是刚刚够到 ES 的门槛——会用 Python 客户端连上去做基础的增删改查能看懂简单的查询语句遇到复杂需求知道去翻文档。后面跟其他知识点一起学慢慢积累。希望这篇对正在了解 ES 的同学有点帮助哪怕只是把倒排索引这个概念搞清楚了我觉得就没白看。

相关新闻

【Springboot毕设全套源码+文档】基于springboot智能民宿预定与游玩系统设计与实现(丰富项目+远程调试+讲解+定制)

【Springboot毕设全套源码+文档】基于springboot智能民宿预定与游玩系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/22 17:21:05 阅读更多 →
实战指南:用MAT快速上手AI图像修复技术

实战指南:用MAT快速上手AI图像修复技术

实战指南:用MAT快速上手AI图像修复技术 【免费下载链接】MAT MAT: Mask-Aware Transformer for Large Hole Image Inpainting 项目地址: https://gitcode.com/gh_mirrors/ma/MAT 想象一下,当你翻出珍藏多年的老照片,却发现照片上出现了…

2026/7/22 17:20:05 阅读更多 →
深入解析TI EMIFA异步接口:Normal与Select Strobe模式读写时序配置

深入解析TI EMIFA异步接口:Normal与Select Strobe模式读写时序配置

1. 项目概述与核心价值在嵌入式系统开发,尤其是基于德州仪器(TI)C6000系列DSP或ARM协处理器的复杂应用中,外部存储器接口(External Memory Interface, EMIF)的设计与调试往往是决定系统性能与稳定性的关键一…

2026/7/22 17:20:05 阅读更多 →

最新新闻

Lazytainer核心原理大揭秘:从网络监控到容器休眠的完整实现

Lazytainer核心原理大揭秘:从网络监控到容器休眠的完整实现

Lazytainer核心原理大揭秘:从网络监控到容器休眠的完整实现 【免费下载链接】Lazytainer Docker container lazy loading 项目地址: https://gitcode.com/gh_mirrors/la/Lazytainer Lazytainer是一款创新的Docker容器懒加载工具,通过智能网络监控…

2026/7/22 19:01:45 阅读更多 →
探索whopping_Voron_mods数据:运动学安装对打印质量的影响分析

探索whopping_Voron_mods数据:运动学安装对打印质量的影响分析

探索whopping_Voron_mods数据:运动学安装对打印质量的影响分析 【免费下载链接】whopping_Voron_mods 项目地址: https://gitcode.com/gh_mirrors/wh/whopping_Voron_mods 在3D打印领域,打印质量的稳定性和一致性一直是爱好者和专业用户追求的核…

2026/7/22 19:01:45 阅读更多 →
PreMiD Activities元数据规范:创建符合标准的高质量状态插件

PreMiD Activities元数据规范:创建符合标准的高质量状态插件

PreMiD Activities元数据规范:创建符合标准的高质量状态插件 【免费下载链接】Presences 🛒 Storage for Activities located at our Activity Library. 项目地址: https://gitcode.com/gh_mirrors/pr/Presences PreMiD Activities元数据规范是开…

2026/7/22 19:01:45 阅读更多 →
把定义问题的权力还给智能体——WAIC2026Sutton演讲有感

把定义问题的权力还给智能体——WAIC2026Sutton演讲有感

——听 Richard Sutton 2026 年上海演讲 2026 年 7 月 19 日,上海世博中心,世界人工智能大会的"思想者论坛"。台上是快七十岁的 Richard Sutton——强化学习的奠基人,2024 年图灵奖得主,《苦涩的教训》的作者。就在演讲…

2026/7/22 19:01:45 阅读更多 →
深入解析C28x DSP eCAP模块:精准捕获与PWM生成实战指南

深入解析C28x DSP eCAP模块:精准捕获与PWM生成实战指南

1. 项目概述与核心价值在电机控制、电源管理和各类需要精确时序测量的嵌入式系统中,如何高效、准确地测量一个脉冲信号的周期和占空比,或者反过来,如何生成一个高精度的PWM波形,往往是工程师面临的核心挑战。如果单纯依赖CPU软件轮…

2026/7/22 19:01:45 阅读更多 →
深入解析C28x ePWM死区、斩波与故障保护模块的设计与应用

深入解析C28x ePWM死区、斩波与故障保护模块的设计与应用

1. 项目概述与ePWM核心价值在电力电子和电机驱动的世界里,PWM(脉冲宽度调制)信号就像是系统的“心跳”,它的精确性和可靠性直接决定了整个能量转换系统的性能与寿命。无论是驱动一台伺服电机精准定位,还是为数据中心服…

2026/7/22 19:00:45 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统,尤其是像TI C6000系列这样的高性能DSP开发中,我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动,但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案? 在数字化协作环境中,消息通知系统的重要性不言而喻明。但现实情况是,企业级通知方案往往需要复杂的API对接(如企业微信、钉钉、飞书),个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点",乙方听到的是"少做几页"。甲方说"不要太复杂",乙方理解成"别放图表了"。结果交过去,甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里,是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻