redis NoSQL数据库用于在向量空间中搜索

neskvpey  于 2023-11-16  发布在  Redis
关注(0)|答案(4)|浏览(127)

我对NoSQL DBS(如Cassandra,Mongo,Redis等)完全陌生,我想创建这种类型的结构:

{
  "item_id": "ABC1",
  "x1": 0.55,
  "x2": -0.29,
  ...
  "x100": 0.17
}

字符串
基本上,我有数百万个项目,每个项目有100个浮点数。我的主要任务是搜索给定浮点数向量附近的项目(在100维的向量空间中),并获得例如前k个项目或距离小于d的所有项目。
有没有特别适合这种任务的NoSQL数据库?
谢谢你的提示,帕特里克

e7arh2l6

e7arh2l61#

据我所知,目前还没有现成的数据库支持非(2| 3)D空间索引,但你可以在应用层中实现自己的索引。
一般来说,你希望有一个高效的N维最近邻搜索算法,如下所示:

  • 时间复杂度为O(log N)
  • Geohash

但这两个都是相当棘手的正确实施。

zynd9foi

zynd9foi2#

我相信没有一个提到的数据库会给你给予你所需要的,特别是你拥有的数据量,我建议使用Solr,我有类似的情况和Solr是最好的解决方案。

yduiuuwa

yduiuuwa3#

Elasticsearch为多达2048个特征的向量提供了开箱即用的余弦相似度函数(使用“密集向量”数据类型)。我现在正在使用它,它适用于具有数十万个向量的数据集。

uhry853o

uhry853o4#

2023更新的问题:Cassandra现在是一个很好的替代这个需要.它被创建来处理大量的数据.你可以尝试它与DataStax Astra.只需创建一个免费的帐户,并运行它.
创建DB后,您可以像这样创建表:

CREATE TABLE IF NOT EXISTS my_table (
    id UUID,
    embedding vector<float, 100>,
    PRIMARY KEY (id)
)

字符串
然后,你需要创建一个索引:

CREATE CUSTOM INDEX IF NOT EXISTS IX_my_table 
    ON my_table(embedding) USING 'org.apache.cassandra.index.sai.StorageAttachedIndex' 
WITH OPTIONS = { 
     'similarity_function': 'dot_product'
     };


您可以选择其他指标:余弦,欧几里德或点积。
然后,在加载数据后,您可以使用以下命令进行查询:

SELECT id, similarity_dot_product(embedding,:my_vector) AS similarity
FROM my_table
ORDER BY embedding ANN OF :my_vector
LIMIT 10


其中:my_vector是一个100维的向量,我们希望从中找到10个最相似的对象。

相关问题