C++ Faiss如何在子集中搜索?求文档过时后的最新实现方案
Faiss中选择性搜索指定ID的正确实现方式
API变更说明
你提到的官方Wiki文档确实已过时,当前Faiss(v1.7.2+版本)中,IVF类索引的搜索参数类已统一命名为IVFSearchParameters(覆盖IVFPQ、IVFFlat等类型),旧的SearchParametersIVFPQ类已被移除,且搜索方法的参数逻辑也已调整。两种ID筛选实现方式
基于内部元素序号的子集搜索
使用idx_to_search参数指定要搜索的索引内部元素序号数组,替代旧文档中的sel字段。示例代码:import faiss import numpy as np # 加载已构建好的IVFPQ索引 index = faiss.read_index("ivfpq_index.index") # 构造查询向量 query = np.random.rand(1, 128).astype('float32') # 定义要搜索的内部元素序号(例如只搜索前1000个元素) subset_indices = np.arange(1000, dtype='int64') # 执行带筛选的搜索 D, I = index.search(query, k=5, idx_to_search=subset_indices)基于用户自定义外部ID的过滤
如果需要按插入时指定的外部ID进行包含/排除筛选,使用faiss.IDSelector系列类:- 包含指定ID:用
faiss.IDSelectorArray传入允许的ID数组 - 排除指定ID:用
faiss.IDSelectorNot包裹faiss.IDSelectorArray
示例代码:
# 定义允许搜索的外部ID列表 allowed_ids = np.array([100, 200, 300], dtype='int64') selector = faiss.IDSelectorArray(allowed_ids.size, allowed_ids.data_ptr()) # 或者定义要排除的外部ID列表 # excluded_ids = np.array([500, 600], dtype='int64') # selector = faiss.IDSelectorNot(faiss.IDSelectorArray(excluded_ids.size, excluded_ids.data_ptr())) # 执行带筛选的搜索 D, I = index.search(query, k=5, selector=selector)- 包含指定ID:用
关键注意点
idx_to_search基于索引内部的元素排列序号,IDSelector基于用户自定义的外部ID,使用时需明确区分- 需确保使用Faiss v1.7.2及以上版本,上述参数才会被支持
内容的提问来源于stack exchange,提问作者Christopher K
相关产品推荐
相关产品推荐

