Postgres 何时不再适合全文搜索?
概述了 Postgres 全文搜索在九个方面不如专注于搜索的数据库。

全文搜索是指将部分或全部文本查询与数据库中存储的文档进行匹配。与传统的数据库查询相比,即使在部分匹配的情况下,全文搜索也能提供结果。它允许为用户构建更灵活的搜索界面,从而使他们能够更快地找到准确的结果。
从简单的应用内搜索到浏览庞大的电子商务目录,全文搜索用例数不胜数。它非常常见,以至于 Postgres 和其他关系数据库都包含用于全文搜索的专用 API。不幸的是,Postgres 在多个方面不如专注于搜索的数据库。
1. 复杂的设置
为了提供相关的结果,全文搜索应容忍错别字,允许同义词,并允许部分匹配。此外,结果排名需要高度可定制,以适应企业的特定需求。在 Postgres 上配置全文搜索需要付出 全面的配置 成本,并且通常需要在使用托管云服务时无法使用的扩展。
创建数据库索引、编写查询和排名算法很快就会超出领域知识,并需要搜索、索引和语言学方面的专业知识。当围绕旨在应对 Postgres 全文搜索限制的混合搭配扩展的约束工作时,性能优化变得更加困难。
相反,专注于搜索的数据库开箱即用地提供了 最先进的功能,例如拼写容错、前缀搜索、模糊匹配、同义词和可自定义的排名。
2. 分面搜索
分面搜索 允许用户按广泛的类别优化搜索结果。它通常用于电子商务应用程序。例如,服装店可以实施按品牌、尺寸或评分范围等分面进行筛选。
电子商务网站上的分面搜索(查看演示)
对于单个分面,实现筛选已经足够棘手。但是分面可以呈现多种形式:类别标签、价格范围或最低评分。为所有类型实现筛选非常具有挑战性。无论如何,最棘手的查询是聚合结果以构建分面计数。这在大型数据集上变得非常消耗资源。
使用 Postgres 实现分面搜索的复杂性随着分面数量的增加呈指数级增长。仅分面搜索就成为了像 Elasticsearch 或 Meilisearch 这样的搜索引擎的强大卖点,它们配备了优化的、一流的 API 来处理分面筛选和计数。
3. 拼写容错
默认情况下,Postgres 全文搜索无法处理拼写错误。用户通常安装 pg_trgm
扩展来解决此限制。(同样,此解决方案并非始终在托管 Postgres 中可用。)此扩展程序引入了新的运算符,用于比较字符串之间的相似性以及搜索优化的 GIN 和 GIST 索引。
新索引允许对全文搜索进行更多配置,但选择 GIN 和 GIST 索引并非总是那么简单。此外,新运算符不考虑单词邻近度、空格分隔符或单词大小。特别是,这使得使用 Postgres 很难实现真正的模糊匹配。
理想情况下,专注于搜索的数据库应允许为单字与多字查询配置不同的规则。Meilisearch 就是这种情况,它允许完全禁用特定字段的拼写错误。这使用户能够通过唯一的标识符(如书籍的国际标准书号 (ISBN))进行搜索。
ISBN 字段禁用了拼写容错(查看演示)
4. 语言支持
使用拉丁字母的语言与阿拉伯语或中文等其他语言之间的语言特性差异很大。截至 Postgres 15,全文搜索词典不适用于简体和繁体中文、韩语和日语等。这意味着针对不同的语言需要采用特定的实现方式。
要查看 Postgres 全文搜索支持的语言列表,您可以在 Postgres 中运行 `\dFd` 命令。
语言支持约束在 Amazon RDS 等托管环境中得到放大,在这些环境中,用户无法访问文件系统。这种受限的访问权限阻止他们实施自定义词典、词干提取器、同义词等。
Meilisearch 为中文、日语、韩语、希伯来语以及更多使用空格分隔单词的所有语言提供了 优化的语言支持。
由于其充满活力的开源社区,Meilisearch 受益于母语人士对 改进特定语言功能 的贡献
5. 支付后端代价
Postgres 是一个旨在与服务器端语言通信的数据库。在构建面向公众的客户端应用程序时,这意味着在数据库之上构建 API 以与客户端通信。除了额外的开发时间外,创建此类代理还会带来更多问题。
首先是延迟问题:向 API 发出请求,该 API 在返回结果之前查询数据库,必然需要一些时间。这不会影响专用搜索引擎,因为它们配备了旨在向最终用户交付数据的公共 API。
现在是第二个问题:安全性。搜索引擎 API 从一开始就为公共消费而设计。并且安全性已内置于该用例中。默认情况下,API 密钥限制搜索请求,而 租户令牌启用多租户 等高级功能。
使用租户令牌来限制对文档的访问(查看演示)
6. 扩展限制
希望将所有数据保存在单个数据库中是有正当理由的。但是将搜索相关数据放在主数据库中会带来巨大的技术后果。在大型数据集上,Postgres 的全文搜索查询变得成本高昂,尤其是在对结果进行排名和计算分面计数时。
单体数据库通常成为需要扩展的应用程序的瓶颈。当您可以避免不必要的搜索相关成本时,请不要将其添加到此资源中。当构建具有高流量的用户面向应用程序时,这些成本只会成倍增加。
与关系数据库不同,像 Meilisearch 这样的全文搜索引擎使用倒排索引,这种数据结构创建信息冗余以允许更快的信息检索。它旨在执行搜索操作,并且在大型数据集上自然会优于关系数据库。并且,当搜索使用量激增时,只需要扩展单个服务。
7. 相关性
正如我们前面提到的,相关的搜索需要拼写容错、自定义排名和同义词。在现代应用程序中,用户期望结果在每次击键时更新,这需要 前缀搜索。但是 Postgres 全文搜索 ts_rank
函数仅允许属性权重。当使用 pg_trgm
扩展时,开发人员只能根据相似性实现自己的排序。
在专注于搜索的数据库中,结果排名、属性优先级、匹配的单词数和查询的精确性是首要概念。它们与允许显式微调搜索行为的高级 API 相匹配。这使得非技术业务利益相关者更容易理解这些概念。这是 Bookshop 选择 Meilisearch 为其电子商务搜索的关键原因。
8. 错失 InstantSearch 库
在搜索体验方面,网站和应用程序通常实现相同的用户界面模式:文本搜索栏、分面复选框列表、范围滑块、排序菜单、页面导航等。开源 InstantSearch 库以 JavaScript、iOS 和 Android SDK 中提供的 Widget 形式实现了所有这些功能。
当上市时间至关重要时,很难拒绝如此美妙的事物。在 Algolia 的支持下,InstantSearch 库得到了广泛采用,并且一些搜索引擎数据库配备了 与 InstantSearch 兼容的 API。阅读我们的 Nuxt 电子商务搜索指南,了解 如何使用 Vue 实现 InstantSearch WidgetCallout> 喜欢 React?阅读我们关于 将 InstantSearch 与 React 结合使用 的教程/Callout>
9. 有限的云支持
在云时代,外包服务器的配置、维护和扩展是一种常见的策略。团队可以专注于为用户交付价值,而不是管理服务器。Postgres 与其他数据库一样,在各种云产品中以托管服务的形式提供。不幸的是,托管服务通常会受到限制。
就 Postgres 而言,实施最先进的全文搜索需要安装扩展。此外,微调语言词典和更多配置需要访问文件系统。不幸的是,这意味着许多功能在云环境中不可用。
为了实现基础设施的委托,搜索引擎通常配备 专用云服务。这些定制平台不会妥协,并允许使用全套搜索功能。此外,客户可以从根据其搜索用例量身定制的优质 SLA、支持和其他企业服务中受益。
Postgres 是一个出色而灵活的数据库,允许实施许多自定义的一体化解决方案。它的全文搜索功能可能足以满足基本搜索,但在涉及具有相关性考虑的实时搜索时,它就显得不足了。这些限制在大型数据集上变得更糟。这是很自然的,因为 Postgres 是一个数据库,而不是搜索引擎。
Meilisearch 是一款开源搜索引擎,旨在构建快速且相关的搜索体验。它旨在为最终用户提供最先进的体验,同时提供简单直观的开发者体验。您可以 在本地运行 Meilisearch 或 在 Meilisearch Cloud 上免费创建帐户 来尝试一下。
详细了解 Meilisearch 可以为您的业务带来什么
要了解更多关于 Meilisearch 的信息,您可以加入 Discord 上的社区 或订阅 新闻通讯。您可以通过查看 路线图 和参与 产品讨论 来了解更多关于该产品的信息。