大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构!
在应用程序中实现搜索功能时,您需要选择合适的文本搜索方法。本指南比较了 PostgreSQL 的内置搜索引擎tsvector
、pg_search
扩展程序和外部搜索引擎,以帮助您选择最符合需求的选项。
内置 PostgreSQL tsvector
用于文本搜索
tsvector
PostgreSQL 包含使用数据类型和搜索表达式的原生全文搜索功能tsquery
。tsvector
数据类型是一种专用的数据结构,PostgreSQL 使用它来以针对搜索优化的形式表示文档。
此内置功能可满足基本搜索需求,无需任何额外扩展。它非常适合小型应用程序或不需要高级搜索功能的情况。
使用示例tsvector
要使用tsvector
,您需要创建一个包含一列的表来存储搜索向量。然后,您可以将文本转换为该tsvector
格式,并创建索引以实现高效搜索。这样,即使数据集不断增长,查询也能运行得更快。
CREATE TABLE articles (
id SERIAL PRIMARY KEY,
title TEXT,
content TEXT,
search_vector tsvector
);
-- Update the search vector
UPDATE articles
SET search_vector = to_tsvector('english', title || ' ' || content);
-- Create an index on the search vector
CREATE INDEX idx_search_vector ON articles USING GIN (search_vector);
-- Query using tsquery
SELECT id, title
FROM articles
WHERE search_vector @@ to_tsquery('english', 'database & performance');
Enter fullscreen mode Exit fullscreen mode
此示例演示如何:
- 创建一个表,其中包含一个用于存储搜索向量的列
tsvector
使用to_tsvector
函数将文本转换为格式- 创建 GIN 索引以加快搜索速度
- 搜索包含“数据库”和“性能”的文章
虽然tsvector
它能满足基本的搜索需求,但在相关性排名、拼写错误处理和复杂搜索模式方面存在局限性。它适用于不需要高级功能的中小型数据集。
优点tsvector
- 简单:不需要任何扩展,只需要原生 PostgreSQL 功能。
- 与 Postgres 集成:在同一个数据库内无缝工作,避免了对额外服务的需求。
- 低开销:由于
tsvector
它是 Postgres 的一部分,因此不需要单独的系统来维护。
缺点tsvector
- 有限的相关性排名:它不会根据相关性自动对搜索结果进行排名。
- 不容忍拼写错误:需要完全匹配,因此如果用户拼错了搜索词,则不会返回相关结果。
- 复杂查询:无法立即处理模糊匹配或短语接近度等更复杂的查询。
扩展tsvector
pg_search
该pg_search
扩展基于 PostgreSQL 的搜索功能,通过 BM25 算法添加了更好的相关性排名、用于处理拼写错误的模糊匹配以及更灵活的搜索选项。
此扩展对于需要更复杂的搜索功能而不需要单独的搜索引擎的应用程序特别有用。
通过pg_search
,您可以获得以下功能:
- 相关性排名:BM25 算法根据搜索结果与查询的相关性自动对其进行排名。
- 模糊匹配:它允许输入错误,这意味着即使用户犯了小错误,搜索也会返回相关结果。
- 短语搜索:您可以搜索精确的短语或相近的单词,这在内容繁多的应用程序中特别有用。
- 灵活的查询:
pg_search
支持更复杂的搜索表达式,如部分词匹配、词干提取和停用词过滤。
pg_search
在 Neon 上 启用
pg_search
目前仅适用于在AWS 区域创建的 Neon 项目。
添加pg_search
到您的 Neon 数据库很简单 - 只需运行此单个 SQL 命令:
CREATE EXTENSION IF NOT EXISTS pg_search;
Enter fullscreen mode Exit fullscreen mode
启用扩展程序只需这些步骤即可。之后,您就可以pg_search
在查询中使用这些功能。设置过程非常简单,无需任何额外的基础架构即可开始使用。
使用示例pg_search
启用扩展后,您可以创建搜索索引并运行更复杂的查询:
-- Create a BM25 index on multiple columns
CREATE INDEX article_search_idx ON articles
USING bm25 (id, title, content)
WITH (key_field='id');
-- Simple keyword search
SELECT title
FROM articles
WHERE title @@@ 'database';
-- Handling typos with fuzzy matching
SELECT title
FROM articles
WHERE id @@@ paradedb.match('title', 'database', distance => 1);
-- Sorting by relevance score
SELECT title, paradedb.score(id) AS relevance
FROM articles
WHERE content @@@ 'performance'
ORDER BY paradedb.score(id) DESC;
Enter fullscreen mode Exit fullscreen mode
此代码演示如何:
- 创建涵盖多个列的 BM25 索引
@@@
使用运算符执行基本关键字搜索- 即使搜索词有拼写错误也能找到结果
- 按相关性对结果进行排序,以便最相关的结果首先显示
为什么在 Neon 上使用pg_search
?
使用pg_search
Neon 可以为您提供:
- 更好的搜索功能:通过排名、拼写错误容忍度和复杂的查询选项,
pg_search
提供比更多的功能tsvector
。 - 完全托管的 PostgreSQL 体验:您无需设置或维护单独的搜索服务。Neon 为您处理一切事务,从扩展到备份。
- 数据一致性:由于搜索索引是 PostgreSQL 数据库的一部分,因此无需担心在不同系统之间同步数据。
- 简单的架构:通过
pg_search
在 Neon 上运行,您可以避免管理外部搜索引擎的复杂性,同时仍然可以获得高级搜索功能。
pg_search
对于需要更高级的搜索功能但又想避免管理单独搜索引擎的复杂性的应用程序来说是一个很好的选择。
外部搜索引擎(例如 Elasticsearch)
像 Elasticsearch 这样的外部搜索引擎为复杂的用例和超大型数据集提供了专门的搜索功能。这些引擎旨在跨多台服务器进行扩展,并处理高性能、低延迟的搜索查询。
虽然这些引擎提供了强大的功能,但它们也有一些缺点:
- 您需要设置和维护额外的基础设施:外部搜索引擎需要管理单独的服务器或云服务,这会增加运营开销。
- 您必须保持数据库和搜索索引同步:确保您的外部搜索引擎与您的 PostgreSQL 数据库保持同步可能会带来复杂性,尤其是在您的数据发生变化时。
- 复杂性增加:管理另一个系统意味着额外的配置、监控和故障排除。
- 更高的运营成本:运行外部搜索引擎会产生额外的成本,包括基础设施和开发人员时间方面。
Elasticsearch 等外部搜索引擎提供了强大的功能,例如:
- 分布式搜索:处理跨多台机器的大规模搜索查询。
- 复杂查询:提供高级查询功能,如聚合、嵌套字段等。
- 实时索引:随着新数据的索引,实时更新搜索结果。
外部搜索引擎的用例
在以下情况下,您可能会选择外部搜索引擎:
- 您拥有极其庞大的数据集(数十亿条记录),需要跨多台服务器进行分布式搜索。
- 您的搜索需求包括PostgreSQL 中没有的专门功能,例如高级分析、地理搜索或机器学习集成。
- 您拥有管理额外基础设施和复杂性的资源。
比较摘要
特征 | tsvector | pg_search 在 Neon 上 | 外部引擎 |
---|---|---|---|
设置 | 内置于 Postgres | 在 Neon 上轻松设置 | 单独安装、配置和维护系统 |
相关性排名 | 基本的 | BM25排名 | 高级排名选项 |
拼写错误容忍度 | 不 | 是的 | 是的 |
查询灵活性 | 有限的 | 好的 | 广泛的 |
缩放 | 受 Postgres 限制 | 由 Neon 管理 | 需要手动缩放 |
成本 | 包含在 Postgres 中 | 包含在 Neon 中 | 额外的基础设施成本 |
维护 | 最小 | 由 Neon 处理 | 需要持续维护 |
您应该选择哪个选项?
面对如此多的选项,该如何选择最适合您应用的方案呢?以下是一些指导原则:
在以下情况下使用内置tsvector
:
- 您有简单的搜索要求
- 您的数据集规模较小到中等
- 您只想使用内置的 PostgreSQL 功能
pg_search
在 Neon 上 使用:
- 您需要更好的搜索相关性和拼写错误容忍度
- 您想避免设置单独的系统
- 您更喜欢托管数据库体验
- 您的搜索需求很重要,但不需要专门的功能
在以下情况下请考虑使用外部搜索引擎:
- 您拥有极其庞大的数据集(数十亿条记录)
- 您的搜索需求包括 PostgreSQL 中没有的专门功能
- 您拥有管理其他基础设施的资源
对于大多数 Web 应用程序、内容网站和电商平台而言,pg_search
Neon 在搜索功能和易用性之间实现了良好的平衡。它扩展了 PostgreSQL 的功能,无需您管理单独的系统或同步数据。
结论
选择搜索策略时,请从最符合您需求的简单选项开始。对于许多应用程序来说,pg_search
Neon 提供了一个很好的折中方案——比原生 PostgreSQL 更强大的搜索功能,且无需单独构建搜索系统。
选择正确的搜索方法可以让您为用户提供良好的搜索功能,同时尽可能保持应用程序架构的简单。
转自:https://mp.weixin.qq.com/s/X2msVQApNrQ6ygTnXmJl5g