在Redis Stack中检索已知的单个索引项向量相似度得分

y1aodyip  于 2023-08-02  发布在  Redis
关注(0)|答案(1)|浏览(118)

假设我有两个索引,其模式如下。

SCHEMA = [
  TextField("id"),
  VectorField("embedding", "FLAT", {"TYPE": "FLOAT32", "DIM": 768, "DISTANCE_METRIC": "COSINE"}),
]

字符串
每个索引中有两个已知ID。是否可以从Redis中检索这两个对象之间的向量相似性得分?下面是一些python代码示例,说明文档如何近似描述查询。

query = ???
query_vector = redis.hget(key="embedding", name="products:23")
results = redis.ft("services").search(query, query_params={"vector": query_vector})

cedebl8k

cedebl8k1#

如果你知道你想得到哪两个文件之间的距离,我能想到的最好的方法是
1.获取其中一个文档的嵌入。
1.执行一个混合查询,只对第二个文档进行预过滤
要实现第二步,您可以尝试为每个文档(如文档名本身)设置一些具有唯一值的字段(例如标记或数字),并在执行KNN查询之前查找它。
也可以尝试使用INKEYS查询参数将搜索限制为仅搜索第二个文档。在文档中:
INKEYS {num} {attribute} ...将结果限制为列表中指定的给定键集。第一个参数必须是列表的长度,并且大于零。除非所有键都不存在,否则将忽略不存在的键。
最后,redisearch中的混合查询使用启发式来决定以何种方式执行查询。如果您确定预过滤器通过了单个文档,则可以为查询指定策略,而不是使用启发式方法来确保它将使用AD-HOC BROUT FORCE,这将获取通过过滤器的文档并直接将其与查询进行比较,而不是将查询乘以整个数据集的一般平面方式(如您的示例中的FLAT索引)。启发式算法可能会自动选择这种方式,但您可以通过向查询添加HYBRID_POLICY参数来强制执行ad-hoc:

<filter here> =>[KNN 1 @emmbedding $BLOB HYBRID_POLICY ADHOC_BF]

字符串
最后一点:你可能想考虑,在你只寻找两个向量之间的距离的情况下,简单地HGET两个嵌入,并使用bumpy或任何其他库在本地执行乘法。
希望有帮助!

相关问题