← 返回蜂巢洞察

在PostgreSQL中构建混合搜索引擎:BM25算法与向量检索技术的结合应用

大多数应用程序的搜索功能都不得不在两种方案之间做出取舍:要么使用简单的文本过滤机制,要么像Elasticsearch那样搭建独立的搜索系统,并配置复杂的同步流程。 在freeCodeCamp.org的YouTube频道上,我制作了一门新的视频课程,演示了如何在PostgreSQL中构建一套完整的、适用于生产环境的搜索系统。通过将词汇匹配技术与高维向量嵌入技术结合到同一个数据库中,我们既可以消除对外部服务的依赖,又能确保搜索索引满足ACID规范的要求。 搜索查询通常需要两种不同的检索方式: "Apollo 13" 这样的精确查询需要关键词与数据内容进行精准匹配,而这种处理方式正是关键词引擎的强项

大多数应用程序的搜索功能都不得不在两种方案之间做出取舍:要么使用简单的文本过滤机制,要么像Elasticsearch那样搭建独立的搜索系统,并配置复杂的同步流程。

在freeCodeCamp.org的YouTube频道上,我制作了一门新的视频课程,演示了如何在PostgreSQL中构建一套完整的、适用于生产环境的搜索系统。通过将词汇匹配技术与高维向量嵌入技术结合到同一个数据库中,我们既可以消除对外部服务的依赖,又能确保搜索索引满足ACID规范的要求。

搜索查询通常需要两种不同的检索方式:"Apollo 13"这样的精确查询需要关键词与数据内容进行精准匹配,而这种处理方式正是关键词引擎的强项;而"能够自我发光的动物"这类概念性查询则不需要明确提及“生物发光”这一具体概念,这时语义向量搜索技术就能发挥出其优势。混合搜索机制会同时运用这两种检索方法,并通过SQL中的互惠排名融合算法将搜索结果整合成一份有序列表。

在这门课程中,我利用24万篇简单英文维基百科文章作为数据源,构建了一个完整的全栈搜索系统。课程内容涵盖了如何配置pg_textsearch扩展以实现基于语料库的BM25排序算法、如何使用pgvector和pgvectorscale存储384维的句子向量信息,以及如何通过EXPLAIN (ANALYZE, BUFFERS)命令分析查询执行过程。后端开发部分则使用了Python、FastAPI和Psycopg数据库,实现了匹配结果的高亮显示功能以及单次事务内的文档写入操作。

请在freeCodeCamp.org观看这门关于PostgreSQL混合搜索技术的课程(时长1小时)。

相关文章

技术实践

在关于开源软件的欧盟讨论会上,与会专家表示,要实现技术主权,就必须具备相应的选择能力、专业技能以及得到必要的支持。

欧洲各组织可以通过开发可靠的替代方案并掌握必要的技术技能来增强自身的技术主权,而不是完全避免使用全球性的供应商。在OSS欧盟举办的小组讨论中,人们强调了了解云计算及硬件系统中的各种依赖关系的重要性,并指出,在软件选择方面必须做出实际可行的决策,才能真正实现有效的操作主权。 作者:Olimpiu Pop

阅读全文
技术实践

对象关系映射框架为何仍会允许SQL注入攻击的发生(以及如何弥补这些安全漏洞)

许多开发人员认为,一旦使用了对象关系映射工具,SQL注入问题就不再存在了。但实际上,这个问题并没有消失,只是转移到了其他地方。 像Sequelize、Prisma、TypeORM和Knex这样的对象关系映射工具会自动为你生成参数化的查询语句,这一功能确实非常实用。但问题往往出现在那些超出了这些工具安全处理范围的代码部分——比如那些无法被对象关系映射工具的查询构建器清晰表达的原始SQL语句、动态排序字段,或者那些被不加思考就直接使用的辅助函数。 恰恰就是这些地方,会成为攻击者首先关注的目标。而且由于应用程序的其他部分看起来都受到了保护,开发者很容易忽视这些问题。 本文将重点讨论四种这类常见的安全

阅读全文
技术实践

TimescaleDB课程——用于处理时间序列数据的PostgreSQL

对于现代开发者而言,高效地管理庞大且快速增长的数据集是一项至关重要的能力。无论你是负责跟踪API请求日志、监控物联网设备的遥测数据,还是为人工智能应用构建仪表盘,如果不对时间序列数据进行优化处理,那么这些操作很快就会导致标准的PostgreSQL查询速度变得极慢。我们刚刚在freeCodeCamp.org的YouTube频道上发布了一门新课程,这门课程将帮助你全面了解TimescaleDB。 通过这门课程,你将获得实际使用TimescaleDB的经验,学习如何将PostgreSQL升级为经过优化的时间序列数据库。你还将学会优化查询速度、大幅减少存储空间占用,并确保你的仪表盘在处理大量数据时仍能

阅读全文
技术实践

如何让你的编程工具在浏览器中检测其运行效果

我受够了让编程机器人告诉我“前端工作已经完成”,但实际上根本没有人真正打开过前端界面来测试这些更改。 你们应该都见过这样的情景:机器人修改了一些代码,运行了格式化工具、类型检查工具和测试程序,所有结果都是正常的,然后它就会显示“已实现并验证通过”之类的信息。 但究竟是怎么验证的呢?通过测试确实能说明代码没有问题,但这并不等同于真正打开应用程序来使用那些刚刚被修改过的功能。 我遇到过很多这样的情况:代码本身没有问题,测试也通过了,但用户界面仍然存在一些明显的问题——比如某个控件与其他元素重叠了,某个选中的状态在数据存储中是存在的,但在屏幕上却没有高亮显示,某些操作在某种路径下可以正常执行,在另一

阅读全文