筛选

通过为最近邻(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_tuplesivfflat.max_probes的限制)。

插件版本确认

  1. 确认插件版本。

    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)
  2. (可选)如不满足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获取严格排序结果。

    1. 启用迭代索引扫描,并设置为宽松模式

    2. 使用物化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.max_scan_tuples

指定HNSW索引中允许的最大扫描元组数量,默认为20,000。

hnsw.scan_mem_multiplier

执行HNSW算法时,允许的内存乘数,默认为1。与hnsw.max_scan_tuples配合确定在扫描候选项时的内存使用量。

如果增加hnsw.max_scan_tuples未能提高召回率,可以尝试增加此值。

IVFFlat

ivfflat.max_probes

IVFFlat索引中进行查询时,允许探测的最大探针数量。如果该值小于ivfflat.probes,则使用ivfflat.probes值。