我正在尝试为最近邻搜索应用程序设计一个好的设计。这有点类似于这个问题:
Saving and incrementally updating nearest-neighbor model in R
在我的情况下,这将是在Python中,但主要的一点是,当新数据出现时,必须更新模型/索引。我现在正在玩scikit-learn neighbors module,但我不相信它是合适的。
申请的目标:
用户进入查询,然后将显示现有数据集中的n(可能将固定为5)最近邻居。对于这一步骤,来自sklearn的搜索结构会有所帮助,但是在添加新记录时必须重新生成。这也是每次查询发生1次的第一次,因此在2-3秒内可能有点“慢”。 “即刻”。
然后,用户可以单击其中一个记录,并查看记录最近邻居等等。这意味着我们现在位于现有的数据集中,NN可以预先计算并以redis形式存储(现在有200,000条记录,但可以扩展到10或100万条)。浏览时应该非常快。
但是在这里我将面临同样的问题,即如何更新预先计算的数据而不必对距离矩阵进行完全重新计算,特别是因为新记录很少(例如每周100个)。
是否存在可更新的NN搜索的工具,方法或算法?
编辑4月3日:
如许多地方所示,KDTree或BallTree并不适合高维数据。我已经意识到,对于具有200k记录和512维度的小数据集的概念验证,蛮力并没有太慢,大约550ms对750ms。
然而,对于数百万以上的大数据集,问题仍未得到解决。我看过datasketch LSH Forest,但在我的情况下,这似乎不够准确或我使用它错了。将就此问一个单独的问题。
答案 0 :(得分:2)
您可以尝试支持添加和近实时矢量搜索的 Milvus。
这是 Milvus 的 benchmarks。
答案 1 :(得分:1)
你应该研究FAISS及其IVFPQ方法 你可以做的是为每个更新创建多个索引,并将它们与旧的更新
答案 2 :(得分:0)
nmslib 支持添加新向量。 Elasticsearch 使用它作为其 Similarity Search Engine 的一部分,它是 very fast。
一个警告:
<块引用>虽然 HNSW 算法允许增量添加点,但它禁止删除和修改索引点。