You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ Faiss如何在子集中搜索?求文档过时后的最新实现方案

Faiss中选择性搜索指定ID的正确实现方式
  • API变更说明
    你提到的官方Wiki文档确实已过时,当前Faiss(v1.7.2+版本)中,IVF类索引的搜索参数类已统一命名为IVFSearchParameters(覆盖IVFPQ、IVFFlat等类型),旧的SearchParametersIVFPQ类已被移除,且搜索方法的参数逻辑也已调整。

  • 两种ID筛选实现方式

    1. 基于内部元素序号的子集搜索
      使用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)
      
    2. 基于用户自定义外部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)
      
  • 关键注意点

    • idx_to_search基于索引内部的元素排列序号,IDSelector基于用户自定义的外部ID,使用时需明确区分
    • 需确保使用Faiss v1.7.2及以上版本,上述参数才会被支持

内容的提问来源于stack exchange,提问作者Christopher K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 13:01:42