Postgres不适合用于全文搜索的几种场景

💡 原文中文,约3100字,阅读约需8分钟。
📝

内容提要

Postgres全文搜索在九个领域存在不足,如错字容忍度、分面搜索、语言支持等。Postgres需要复杂的配置和扩展,而以搜索为中心的数据库具有更先进的功能。Postgres在大规模数据集上的性能较差,不适合实时搜索和复杂搜索需求。全文搜索引擎更适合处理大规模文本数据、实时搜索、分布式搜索等需求。总体而言,Postgres适用于一般性的全文搜索场景,但在特殊需求下使用全文搜索引擎更合适。

🔎

延伸解读

错字容忍与模糊匹配的局限

Postgres 默认无法处理拼写错误,需安装 pg_trgm 扩展,但该扩展在托管环境中可能不可用。即使安装,其操作符也不考虑单词邻近度、空格分隔符或单词大小,难以实现真正的模糊匹配。以搜索为中心的数据库则开箱即用地支持错字容忍、前缀搜索和模糊匹配,并能针对单词查询和多词查询配置不同规则,甚至允许对特定字段禁用错字。

分面搜索的实现复杂度

分面搜索允许用户按品牌、价格范围等类别细化结果,在电商中常见。在 Postgres 中,为每个面实施过滤已很麻烦,而聚合结果以建立面计数在大型数据集上极其耗费资源。随着面数量增加,实现复杂度呈指数增长。Elasticsearch 等搜索引擎则内置优化的一流 API,能高效处理面过滤和计数,这是其一大卖点。

多语言支持的不足

从 Postgres 15 开始,简体中文、繁体中文、韩文和日文等语言无法使用全文检索词典,需要针对不同语言采用特定实现。在 Amazon RDS 等托管环境中,用户无法访问文件系统,因而无法实施自定义字典、词干和同义词,语言支持限制更为严重。对于需要处理多语言文本的应用,专门的全文搜索引擎通常更具优势。

扩展性与相关性排序的挑战

Postgres 对大型数据集进行全文搜索查询成本很高,尤其在排序和计算面计数时,单体数据库容易成为瓶颈。全文搜索引擎使用倒排索引,专为搜索设计,在大数据集上表现更优,且搜索量激增时只需扩展一项服务。相关性方面,Postgres 的 ts_rank 仅支持属性加权,使用 pg_trgm 时需自行实现排序,而搜索引擎将结果排序、属性优先级等作为一流概念,便于微调。

❓

Q&A

Postgres 全文搜索在哪些场景下不适合使用?

Postgres 全文搜索在九个领域存在不足,包括:错字容忍度、分面搜索、语言支持、增加后台成本、扩展限制、相关性等。具体不适合的场景有:大规模文本数据、实时搜索需求、复杂的搜索需求、分布式搜索、实时推荐系统、大规模并发写入、多语言全文搜索、高度定制的搜索需求、大规模文档存储。

为什么 Postgres 的全文搜索对拼写错误的容忍度差?

默认情况下,Postgres 全文搜索无法处理拼写错误。用户通常会安装 pg_trgm 扩展来绕过这一限制,但该扩展主要引入新的操作符用于比较字符串相似性,以及搜索优化的 GIN 和 GIST 索引。然而,新运算符不考虑单词邻近度、空格分隔符或单词大小,这使得 Postgres 难以实现真正的模糊匹配。此外,在托管的 Postgres 中不一定能安装此扩展。

Postgres 实现分面搜索有哪些困难?

分面搜索允许用户按类别细化搜索结果,但 Postgres 中实施分面搜索非常复杂。对于单个面来说,实施过滤已经够麻烦,而面可以有多种形式(类别标签、价格范围、最低评级等),针对所有类型实施过滤极具挑战。最难的查询是聚合结果以建立面计数,在大型数据集上耗费大量资源。使用 Postgres 实施分面搜索的复杂性随着分面数量的增加而呈指数增长。

Postgres 对多语言全文搜索的支持如何?

Postgres 对多语言支持有限。从 Postgres 15 开始,简体中文、繁体中文、韩文和日文等语言都无法使用全文检索词典,这意味着需要针对不同语言采用特定的实现方法。在 Amazon RDS 等托管环境中,语言支持限制更为严重,因为用户无法访问文件系统,从而无法实施自定义字典、词干、同义词等。

使用 Postgres 进行全文搜索有哪些性能问题?

使用 Postgres 对大型数据集进行全文搜索查询成本很高,尤其是在对结果进行排序和计算面计数时。单体数据库往往会成为需要扩展的应用程序的瓶颈。在构建面向用户的高流量应用程序时,这些成本只会成倍增加。与全文搜索引擎使用的倒排索引不同,Postgres 的全文搜索性能在大规模数据集上较差,不适合实时搜索和复杂搜索需求。

Postgres 全文搜索在相关性排序方面有什么不足?

相关搜索需要错字容忍度、自定义排名和同义词。在现代应用中,用户希望每次按键都能更新结果,这需要前缀搜索。但 Postgres 全文搜索的 ts_rank 函数只允许属性加权。在使用 pg_trgm 扩展时,开发人员只能自己根据相似度实现排序。而以搜索为重点的数据库将结果排序、属性优先级、匹配字数和查询精确度等概念作为一流概念,并提供高级 API 进行微调。

🏷️

标签

➡️

继续阅读