我在Cassandra中有一个电影表(托管在Astra DB上),唯一的主键是movie_id
。有几列,但对于我的向量搜索,我真的只关心title
。movie_vector
列上有一个存储附加索引(SAI),它是使用以下CQL创建的:
CREATE CUSTOM INDEX ON movieapp.movies (movie_vector) USING 'StorageAttachedIndex';
当我基于为“星星大战”定义的向量执行CQL向量搜索时,我得到以下结果:
SELECT title FROM movies
ORDER BY movie_vector ANN OF [37, 4, 8, 13, 42.1497, 8.1, 6778]
LIMIT 6;
title | movie_vector
-------------------------+-------------------------------------
Star Wars | [37, 4, 8, 13, 42.1497, 8.1, 6778]
The Empire Strikes Back | [37, 4, 8, 13, 19.47096, 8.2, 5998]
Return of the Jedi | [37, 4, 8, 13, 14.58609, 7.9, 4763]
The Lion King | [49, 1, 3, 7, 21.60576, 8, 5520]
Pocahontas | [10, 1, 3, 4, 13.28007, 6.7, 1509]
Batman | [18, 5, 8, 0, 19.10673, 7, 2145]
(6 rows)
这些结果如何排序?有没有什么方法可以看出这背后的逻辑?
1条答案
按热度按时间ztyzrc3y1#
给定上面显示的默认值和索引,从CQL向量搜索返回的结果将根据其向量的余弦相对于原始向量的相似性进行排序。这可以通过使用CQL
similarity_cosine
函数看到,该函数接受Vector<float, n>
类型的列和向量本身。对于上面的查询,它的工作方式是这样的:
如上所示,电影“星星大战”的矢量是100%匹配的。这是有意义的,因为这是查询中使用的向量(
[37, 4, 8, 13, 42.1497, 8.1, 6778]
)。其余行按其
similarity_cosine
的结果排序,该结果基于其movie_vector
与原始向量的接近度。最接近原始向量的行位于结果集的顶部,而距离较远的向量则显示在底部。这有点冗长,但仍然是一种有用的方式来展示矢量搜索结果是如何排序的。