Как сортируются результаты векторного поиска 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%. Это имеет смысл, поскольку это был вектор (), используемый в запросе.

Остальные строки упорядочены по результату их, что основано на близости ихк исходному вектору. Строки, наиболее близкие к исходному вектору, находятся вверху набора результатов, а векторы, находящиеся дальше, отображаются внизу.

Это немного многословно, но все же полезно, чтобы показать, как сортируются результаты векторного поиска.

Другие вопросы по тегам