Link Search Menu Expand Document Documentation Menu

筛选数据

为了优化向量搜索结果,您可以使用以下方法之一过滤向量搜索:

  • 高效 k-最近邻 (k-NN) 过滤:此方法在向量搜索期间应用过滤,而不是在向量搜索之前或之后应用,这确保返回 k 个结果(如果总共有至少 k 个结果)。此方法受以下引擎支持:
    • 带有分层可导航小世界 (HNSW) 算法的 Lucene 引擎(OpenSearch 2.4 及更高版本)
    • 带有 HNSW 算法(OpenSearch 2.9 及更高版本)或 IVF 算法(OpenSearch 2.10 及更高版本)的 Faiss 引擎
  • 后过滤:由于它在向量搜索之后执行,因此对于限制性过滤器,此方法可能返回的结果远少于 k 个。您可以使用以下两种过滤策略:
    • 布尔后过滤器:此方法运行近似最近邻 (ANN) 搜索,然后将过滤器应用于结果。两个查询部分独立执行,然后根据查询中提供的查询运算符(shouldmust 等)组合结果。
    • post_filter 参数:此方法在完整数据集上运行 ANN 搜索,然后将过滤器应用于 k-NN 结果。
  • 评分脚本过滤器:此方法涉及预过滤文档集,然后在过滤后的子集上运行精确 k-NN 搜索。当过滤后的子集很大时,它可能具有高延迟且无法扩展。

下表总结了上述过滤用例。

过滤器 应用过滤器的时间 搜索类型 支持的引擎和方法 filter 子句放置位置
高效 k-NN 过滤 搜索期间(预过滤和后过滤的混合) 近似 - lucene (hnsw)
- faiss (hnsw, ivf)
k-NN 查询子句内部。
布尔过滤器 搜索后(后过滤) 近似 - lucene
- faiss
- nmslib(已弃用)
k-NN 查询子句外部。必须是叶子子句。
post_filter 参数 搜索后(后过滤) 近似 - lucene
- faiss
- nmslib(已弃用)
k-NN 查询子句外部。
评分脚本过滤器 搜索前(预过滤) 精确 不适用 脚本评分查询子句内部。

过滤搜索优化

根据您的数据集和用例,您可能更关注最大化召回率或最小化延迟。下表提供了各种 k-NN 搜索配置和用于优化更高召回率或更低延迟的过滤方法的指南。表格的前三列提供了几个示例 k-NN 搜索配置。搜索配置包括:

  • 索引中的文档数量,其中一个 OpenSearch 文档对应一个 k-NN 向量。
  • 过滤后结果中剩余的文档百分比。此值取决于您在查询中提供的过滤器的限制性。表格中最严格的过滤器返回索引中 2.5% 的文档,而最不严格的过滤器返回 80% 的文档。
  • 所需返回结果的数量 (k)。

一旦您估算了索引中的文档数量、过滤器的限制性以及所需最近邻的数量,请使用下表选择一种优化召回率或延迟的过滤方法。

索引中的文档数量 过滤器返回的文档百分比 k 用于更高召回率的过滤方法 用于更低延迟的过滤方法
10M 2.5 100 高效 k-NN 过滤/评分脚本 评分脚本
10M 38 100 高效 k-NN 过滤 高效 k-NN 过滤
10M 80 100 高效 k-NN 过滤 高效 k-NN 过滤
1M 2.5 100 高效 k-NN 过滤/评分脚本 评分脚本
1M 38 100 高效 k-NN 过滤 高效 k-NN 过滤
1M 80 100 高效 k-NN 过滤 高效 k-NN 过滤

相关文章

剩余 350 字符

有问题?

想贡献?