欢迎光临
我们一直在努力

Faiss提高搜索查询速度

Faiss提高搜索查询速度

将数据集分成Voronoi cells, 每一个向量都落在其中一个cell中, 搜索时,只需要查询搜索向量所在的cell及附近一些相邻的cell即可
这就是IndexIVFFLat 索引的原理 这种索引需要一个training的过程

IndexIVFFlat也需要另一个索引,量化器,负责将向量分配到特定的cell中。每个cell被中心唯一确定。要确定一个向量属于哪个段,就是看这个向量距离哪个cell中心最近。这就是另一个index的任务,IndexFlatL2

search方法有两个参数:

  • nlist 段的数量
  • nprobe 搜索时要访问的段的数量

search花费的时间大致随nprobe的增长而线性增长 但是由于量化也需要时间 所以这种线性关系额外还会加上某个常量


1
2
3
4
5
6
7
8
9
10
11
12
13
nlist = 100
k = 45
quantizer = faiss.IndexFlatL2(2048)
index = faiss.IndexIVFFlat(quantizer, 2048, nlist, faiss.METRIC_L2) #指明使用L2距离搜索,默认是使用内积
assert not index.is_trained
index.train(xb)
assert index.is_trained
index.add(xb)
D, I = index.search(xq, k)
print I[-5:]
index.nprobe = 10  #默认的nprobe是1
D, I = index.search(xq, k)
print I[-5:]

对47357个spu,每个spu的hashcode为长度2048的向量 执行搜索 单个query耗时1.2~4.7ms,trainning耗时2.47s

默认probe为1理论上搜索最快 但是结果可能不准
调整nprobe参数就是在速度和准确性上做权衡,如果使nprobe=nlist则就等同于强力L2搜索

【本站文章皆为原创,未经允许不得转载】:汤不热吧 » Faiss提高搜索查询速度
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址