通过为最近邻(Nearest Neighbor)查询创建带有WHERE
子句的索引,限制查询范围,从而提升高维数据查询效率。
精确索引
支持基于以下精确索引类型,通过WHERE
子句提供快速且精确的最近邻搜索。
(默认)B-tree
Hash
GiST
SP-GiST
GIN
BRIN
对于多列数据,您还可选择多列索引。此类索引适用于匹配行数占总行数比例较低的场景。
近似索引
除非匹配行数占总行数比例较低,否则建议使用近似索引。近似索引扫描后执行过滤操作,例如,当条件匹配10%行且使用HNSW索引(默认hnsw.ef_search=40
),平均只匹配4行,如需获取多行结果可按需增大hnsw.ef_search
值。
但使用近似索引执行带有过滤条件的查询可能会返回较少结果。对此0.8.0版本新增迭代索引扫描,可自动扫描更多索引内容,直到找到足够的结果(或者达到hnsw.max_scan_tuples
或ivfflat.max_probes
的限制)。
插件版本确认
确认插件版本。
SELECT * FROM pg_extension WHERE extname = 'vector';
查看返回结果中
extversion
字段,返回结果如下:oid | extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition -------+---------+----------+--------------+----------------+------------+-----------+-------------- 17941 | vector | 17865 | 2200 | t | 0.8.0 | | (1 row)
(可选)如不满足0.8.0版本要求,可通过以下语句升级。
ALTER EXTENSION vector UPDATE TO '0.8.0';
迭代索引扫描
迭代索引扫描支持以下两种排序方式:
strict_order
:严格模式,确保结果按照与查询点的距离精确排序。relaxed_order
:宽松模式,允许结果在距离排序上略有偏差,但提供更好的召回率。此外,还可以通过物化CTE获取严格排序结果。
示例
启用迭代索引扫描。
设置为严格模式。
-- HNSW索引 SET hnsw.iterative_scan = strict_order; -- IVFFlat索引 SET ivfflat.iterative_scan = strict_order;
设置为宽松模式。
-- HNSW索引 SET hnsw.iterative_scan = relaxed_order; -- IVFFlat索引 SET ivfflat.iterative_scan = relaxed_order;
宽松模式时使用物化CTE获取严格排序结果。
启用迭代索引扫描,并设置为宽松模式。
使用物化CTE获取严格排序结果。
WITH relaxed_results AS MATERIALIZED ( SELECT id, embedding <-> '[1,2,3]' AS distance FROM items WHERE id = 1 ORDER BY distance LIMIT 5 ) SELECT * FROM relaxed_results ORDER BY distance;
对于按距离过滤的查询,在使用物化CTE时建议将距离过滤条件放在外部,其他过滤条件应放置在CTE内部,以获得最佳性能。
WITH nearest_results AS MATERIALIZED ( SELECT id, embedding <-> '[1,2,3]' AS distance FROM items ORDER BY distance LIMIT 5 ) SELECT * FROM nearest_results WHERE distance < 5 ORDER BY distance;
迭代索引扫描参数
由于扫描近似索引的较大部分成本较高,因此可以设置相关参数控制扫描结束时机。
索引类型 | 参数 | 描述 |
HNSW |
| 指定HNSW索引中允许的最大扫描元组数量,默认为20,000。 |
| 执行HNSW算法时,允许的内存乘数,默认为1。与 如果增加 | |
IVFFlat |
| 在IVFFlat索引中进行查询时,允许探测的最大探针数量。如果该值小于 |