C++ Faiss -如何在子集中搜索

dz6r00yl  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(306)

根据faiss wiki页面(链接),您应该能够使用SearchParameters在搜索中选择性地包括或排除id。现在那里的信息有点奇怪,因为字段“sel”根本不存在。名称也发生了变化,因此“SearchParametersIVFPQ”变成了“IVFPQSearchParameters”,旧名称不再可用。此外,搜索方法甚至不接受SearchParameters,尽管根据wiki它应该接受。
我试图用Visual Studio的Intellisense找到一个解决方案。但这并不成功……
所以文档似乎已经过时了。。有谁知道今天是怎么运作的吗?

dkqlctbz

dkqlctbz1#

这也让我发疯了!我在下面放了一个小的工作示例。TLDR:选择器必须是faiss.SearchParametersIVF的参数
让我们从创建一个简单的索引开始,并搜索整个索引:

  1. import numpy as np
  2. import faiss
  3. # Set random seed for reproducibility
  4. np.random.seed(0)
  5. # Create a set of 5 small binary vectors
  6. vectors = np.array([[1, 0, 1],
  7. [0, 1, 0],
  8. [1, 1, 0],
  9. [0, 0, 1],
  10. [1, 0, 0]])
  11. # Initialize an index with the Hamming distance measure
  12. index = faiss.IndexFlatL2(vectors.shape[1])
  13. # Add vectors to the index
  14. index.add(vectors)
  15. # Perform a similarity search
  16. query_vector = np.array([[1, 1, 0]], dtype=np.uint8)
  17. k = 3 # Number of nearest neighbors to retrieve
  18. distances, indices = index.search(query_vector, k)
  19. print(indices)

运行此命令时的输出是[[2 1 4]]。最接近的向量在这些指数处。现在让我们过滤掉索引4,看看会发生什么。这是通过创建选择器,然后将其添加到faiss.SearchParametersIVF中来完成的。

  1. filter_ids = [0, 1, 2, 3]
  2. id_selector = faiss.IDSelectorArray(filter_ids)
  3. filtered_distances, filtered_indices = index.search(query_vector, k, params=faiss.SearchParametersIVF(sel=id_selector))
  4. print(filtered_indices)

这输出[[2 1 0]]所以我们从搜索中删除了第四个索引!

展开查看全部

相关问题