ScaNN 索引参考文档
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
本页面提供了 ScaNN 索引的参考资料。
调参参数
以下索引参数和数据库标志可搭配使用,以便找到检索率和 QPS 之间的适当平衡点。
调优参数 |
说明 |
选项类型 |
max_num_levels |
K-means 聚类树的中心点层级数上限。
- 两级树索引:默认情况下,对于两级树(1 个重心级别 + 底部叶级别),设置为
1 。 - 三层树索引:默认设置为
2 ,适用于三层树(2 个重心层级 + 底部叶级) - 如果矢量行数超过 1 亿行,请将此值设置为
2 。 - 如果矢量行数少于 1,000 万行,请将此值设为
1 。 - 如果向量行数介于 1,000 万到 1 亿行之间,请将其设置为
1 或 2 ,以针对索引构建时间(设置为 2)或搜索召回率(设置为 1)进行优化。
|
索引创建 (可选) |
num_leaves |
要应用于此索引的分区数。创建索引时应用到的分区数量会影响索引性能。通过为固定数量的向量增加分区,您可以创建更精细的索引,从而提高召回率和查询性能。不过,代价是索引创建时间会延长。
由于三级树的构建速度比二级树快,因此您可以在创建三级树索引时增加 num_leaves_value ,以便获得更好的性能。
- 两级索引:将此值设置为介于
1 和 1048576 之间的任意值。
如需构建一个可平衡快速索引构建和良好搜索性能的索引,请使用 sqrt(ROWS) 作为起点,其中 ROWS 是向量行数。每个分区包含的矢量数量由
ROWS/sqrt(ROWS) = sqrt(ROWS) 计算得出。
由于可以在矢量行数少于 1,000 万的数据集上创建两级树索引,因此每个分区将包含的矢量数量少于 (sqrt(10M) ),即 3200 个矢量。为了获得最佳的矢量搜索质量,建议尽可能减少每个分区中的矢量数量。建议的分区大小为每个分区约 100 个矢量,因此请将 num_leaves 设置为 ROWS/100 。如果您有 1,000 万个向量,则将 num_leaves 设置为 10 万。 - 三级索引:将此值设置为介于
1 和 1048576 之间的任意值。
如果您不确定如何选择确切值,请使用 power(ROWS, 2/3) 作为起点,其中 ROWS 是矢量行数。每个分区包含的矢量数量由
ROWS/power(ROWS, 2/3) = power(ROWS, 1/3) 计算得出。
由于三级树索引可在矢量行数超过 1 亿的数据集上创建,因此每个分区将包含超过 (power(100M, 1/3) ) 个矢量,即 465 个矢量。为了获得最佳的矢量搜索质量,建议尽可能减少每个分区中的矢量数量。建议的分区大小为每个分区约 100 个矢量,因此请将 num_leaves 设置为 ROWS/100 。如果您有 1 亿个向量,则应将 num_leaves 设置为 100 万。
|
索引创建 (必需) |
quantizer |
您要为 K 均值树使用的量化器类型。默认值设为 SQ8 ,可在最大限度地减少召回率损失(通常低于 1-2%)的情况下提供更好的查询性能。
如果需要召回率达到 99% 或更高,请将其设为 FLAT 。 |
索引创建 (可选) |
scann.enable_pca |
启用主成分分析 (PCA),这是一种降维技术,用于尽可能自动缩减嵌入的大小。此选项默认处于启用状态。
如果您发现回想能力下降,请将其设为 false 。 |
索引创建 (可选) |
scann.num_leaves_to_search |
此数据库标志用于控制要搜索的叶或分区的绝对数量,以便您在召回率和 QPS 之间进行权衡。默认值为 num_leaves 中设置的值的 1%。
值越高,召回率越高,但 QPS 越低。同样,值越低,召回率越低,但 QPS 越高。 |
查询运行时 (可选) |
scann.pre_reordering_num_neighbors |
设置数据库标志后,该标志会指定在初始搜索确定一组候选项后,重新排序阶段要考虑的候选邻居数量。将此参数设置为高于您希望查询返回的邻居数量的值。
值越高,召回率越高,但 QPS 越低。将此值设置为 0 可停用重新排序。如果在创建索引期间未启用 PCA,则默认值为 0 。否则,默认值为 50 x K ,其中 K 是查询中指定的 LIMIT。 |
查询运行时 (可选) |
scann.num_search_threads |
多线程搜索的搜索器线程数。这有助于在对延迟敏感的应用中为 ScaNN ANN 搜索使用多个线程,从而缩短单个查询的延迟时间。如果数据库已达到 CPU 限制,此设置不会缩短单个查询的延迟时间。默认值为 2 。 |
查询运行时 (可选) |
后续步骤
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-01-24。
[[["易于理解","easyToUnderstand","thumb-up"],["解决了我的问题","solvedMyProblem","thumb-up"],["其他","otherUp","thumb-up"]],[["很难理解","hardToUnderstand","thumb-down"],["信息或示例代码不正确","incorrectInformationOrSampleCode","thumb-down"],["没有我需要的信息/示例","missingTheInformationSamplesINeed","thumb-down"],["翻译问题","translationIssue","thumb-down"],["其他","otherDown","thumb-down"]],["最后更新时间 (UTC):2025-01-24。"],[],[]]