ParadeDB快速入门指南:全文检索与向量搜索实战

ParadeDB快速入门指南:全文检索与向量搜索实战

paradedb PostgreSQL for Search paradedb 项目地址: https://gitcode.com/gh_mirrors/pa/paradedb

什么是ParadeDB

ParadeDB是一个基于PostgreSQL的搜索引擎,它提供了强大的全文检索和向量相似度搜索功能。与传统数据库不同,ParadeDB通过BM25算法实现高效的文本搜索,同时支持向量相似度计算,特别适合需要处理复杂搜索场景的应用。

环境准备

在开始之前,请确保你已经安装了PostgreSQL并能够使用psql命令行工具连接数据库。ParadeDB作为PostgreSQL的扩展运行,因此需要先完成相应的安装配置。

单表全文检索实战

1. 创建测试数据

ParadeDB提供了一个便捷的函数来创建包含模拟数据的测试表:

CALL paradedb.create_bm25_test_table(
  schema_name => 'public',
  table_name => 'mock_items'
);

这个表包含了各种类型的数据,包括文本描述、评分、类别等字段,非常适合用来测试搜索功能。

2. 创建BM25索引

BM25是搜索引擎中广泛使用的排名算法,ParadeDB通过创建BM25索引来实现高效搜索:

CREATE INDEX search_idx ON mock_items
USING bm25 (id, description, category, rating, in_stock, created_at, metadata, weight_range)
WITH (key_field='id');

关键点说明

  • key_field是必选参数,指定作为行唯一标识的列
  • 索引可以包含多种PostgreSQL数据类型
  • 索引创建后会自动维护,无需手动更新

3. 执行基础搜索

使用@@@操作符进行全文检索:

SELECT description, rating, category
FROM mock_items
WHERE description @@@ 'shoes' OR category @@@ 'footwear' AND rating @@@ '>2'
LIMIT 5;

这个查询会返回描述中包含"shoes"或类别为"footwear"且评分大于2的前5条记录。

4. 相关性排序

搜索结果默认不按相关性排序,如果需要按相关性排序,可以使用paradedb.score函数:

SELECT description, rating, category, paradedb.score(id)
FROM mock_items
WHERE description @@@ 'shoes' OR category @@@ 'footwear' AND rating @@@ '>2'
ORDER BY score DESC, description
LIMIT 5;

5. 高级搜索功能

ParadeDB支持短语搜索和模糊匹配:

SELECT description, rating, category
FROM mock_items
WHERE description @@@ '"white shoes"~1'
LIMIT 5;

~1表示允许在"white"和"shoes"之间有一个单词的间隔。

多表联合搜索实战

在实际应用中,数据通常分布在多个表中。ParadeDB支持跨表的全文检索:

1. 创建关联表

CALL paradedb.create_bm25_test_table(
  schema_name => 'public',
  table_name => 'orders',
  table_type => 'Orders'
);

ALTER TABLE orders
ADD CONSTRAINT foreign_key_product_id
FOREIGN KEY (product_id)
REFERENCES mock_items(id);

2. 创建订单表索引

CREATE INDEX orders_idx ON orders
USING bm25 (order_id, customer_name)
WITH (key_field='order_id');

3. 执行联合搜索

SELECT o.order_id, o.customer_name, m.description
FROM orders o
JOIN mock_items m ON o.product_id = m.id
WHERE o.customer_name @@@ 'Johnson' AND m.description @@@ 'shoes'
ORDER BY order_id
LIMIT 5;

这个查询会找出客户名为"Johnson"且购买商品描述中包含"shoes"的订单。

向量相似度搜索实战

除了文本搜索,ParadeDB还支持向量相似度搜索,适用于推荐系统、图像搜索等场景。

1. 添加向量列

ALTER TABLE mock_items ADD COLUMN embedding vector(3);

UPDATE mock_items m
SET embedding = ('[' ||
    ((m.id + 1) % 10 + 1)::integer || ',' ||
    ((m.id + 2) % 10 + 1)::integer || ',' ||
    ((m.id + 3) % 10 + 1)::integer || ']')::vector;

2. 创建HNSW索引

HNSW(Hierarchical Navigable Small World)是一种高效的近似最近邻搜索算法:

CREATE INDEX on mock_items
USING hnsw (embedding vector_cosine_ops);

3. 执行向量搜索

SELECT description, category, rating, embedding
FROM mock_items
ORDER BY embedding <=> '[1,2,3]', description
LIMIT 3;

<=>操作符计算余弦相似度,结果按相似度排序返回最接近的3条记录。

性能优化建议

  1. 索引设计:合理选择包含在BM25索引中的列,避免包含不用于搜索的列
  2. 向量维度:根据实际需求选择合适的向量维度,不是越高越好
  3. 查询优化:结合条件过滤减少搜索范围
  4. 资源分配:为向量搜索分配足够的内存资源

常见问题解答

Q: BM25索引和普通PostgreSQL索引有什么区别? A: BM25索引专门为全文搜索优化,支持相关性评分和复杂的文本查询,而普通索引更适合精确匹配和范围查询。

Q: 向量搜索一定要创建HNSW索引吗? A: 不是必须的,但对于大数据集,HNSW索引可以显著提高查询性能。小数据集可以不使用索引直接搜索。

Q: 如何更新BM25索引? A: BM25索引会自动更新,当表中的数据发生变化时,索引会自动维护,无需手动操作。

通过本指南,你应该已经掌握了ParadeDB的核心功能。在实际应用中,可以根据具体需求组合使用这些功能,构建强大的搜索体验。

paradedb PostgreSQL for Search paradedb 项目地址: https://gitcode.com/gh_mirrors/pa/paradedb

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尤贝升Sherman

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值