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