ParadeDB快速入门指南:全文检索与向量搜索实战
paradedb PostgreSQL for Search 项目地址: 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条记录。
性能优化建议
- 索引设计:合理选择包含在BM25索引中的列,避免包含不用于搜索的列
- 向量维度:根据实际需求选择合适的向量维度,不是越高越好
- 查询优化:结合条件过滤减少搜索范围
- 资源分配:为向量搜索分配足够的内存资源
常见问题解答
Q: BM25索引和普通PostgreSQL索引有什么区别? A: BM25索引专门为全文搜索优化,支持相关性评分和复杂的文本查询,而普通索引更适合精确匹配和范围查询。
Q: 向量搜索一定要创建HNSW索引吗? A: 不是必须的,但对于大数据集,HNSW索引可以显著提高查询性能。小数据集可以不使用索引直接搜索。
Q: 如何更新BM25索引? A: BM25索引会自动更新,当表中的数据发生变化时,索引会自动维护,无需手动操作。
通过本指南,你应该已经掌握了ParadeDB的核心功能。在实际应用中,可以根据具体需求组合使用这些功能,构建强大的搜索体验。
paradedb PostgreSQL for Search 项目地址: https://gitcode.com/gh_mirrors/pa/paradedb
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考