Как сортируются результаты векторного поиска Cassandra?
У меня есть таблица фильмов в 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 ответ
Учитывая значения по умолчанию и индекс, показанные выше, результаты, возвращаемые в результате поиска векторов CQL, сортируются по сходству косинусов их векторов относительно исходного вектора. В этом можно убедиться с помощью функции CQL, которая принимает столбец типа
Для приведенного выше запроса это будет работать следующим образом:
SELECT title,
similarity_cosine(movie_vector, [37, 4, 8, 13, 42.1497, 8.1, 6778]) AS similarity
FROM movies
ORDER BY movie_vector ANN OF [37, 4, 8, 13, 42.1497, 8.1, 6778]
LIMIT 6;
title | similarity | movie_vector
-------------------------+------------+-------------------------------------
Star Wars | 1 | [37, 4, 8, 13, 42.1497, 8.1, 6778]
The Empire Strikes Back | 0.999998 | [37, 4, 8, 13, 19.47096, 8.2, 5998]
Return of the Jedi | 0.999996 | [37, 4, 8, 13, 14.58609, 7.9, 4763]
The Lion King | 0.999995 | [49, 1, 3, 7, 21.60576, 8, 5520]
Pocahontas | 0.999995 | [10, 1, 3, 4, 13.28007, 6.7, 1509]
Batman | 0.999992 | [18, 5, 8, 0, 19.10673, 7, 2145]
(6 rows)
Как показано выше, вектор для фильма «Звездные войны» совпадает на 100%. Это имеет смысл, поскольку это был вектор (
Остальные строки упорядочены по результату их
Это немного многословно, но все же полезно, чтобы показать, как сортируются результаты векторного поиска.