如何使用 Java 将向量插入 Cassandra?

Aar*_*ron 2 java cassandra nosql datastax-astra vector-search

我在将 Java Vector 类型映射到 Java 中的 Cassandra 表 (Astra DB) 时遇到问题。这个想法是通过带有矢量搜索的 ANN 进行查询以返回电影推荐。

这是我的表定义:

CREATE TABLE movies (
  movie_id INT PRIMARY KEY,
  title TEXT,
  release_date DATE,
  movie_vector vector<float,7>);
Run Code Online (Sandbox Code Playgroud)

哪个映射到类:

public class Movie {
    private int movieId;
    private String title;
    private LocalDate releaseDate;
    private CqlVector<Float> vector;
Run Code Online (Sandbox Code Playgroud)

(完整的 getter 和 setter)

它的属性通过以下 CQL 绑定到准备好的语句:

private final static String strCQLINSERT = "INSERT INTO movies "
        + "(movie_id,title,release_date,movie_vector) "
        + "VALUES (?,?,?,?)";
Run Code Online (Sandbox Code Playgroud)

然后,我使用 Java Vector API 从数组定义一个向量float,然后尝试将其映射到我的类中。

Movie movie = new Movie();
// setting other properties on movie here
// ...
// create vector locally
float[] fltVector = {collectionId,genre1,genre2,genre3,popularity,rating,votes};
FloatVector vector = FloatVector.fromArray(FloatVector.SPECIES_MAX,fltVector,0);
// map vector to class
movie.setVector(vector);
Run Code Online (Sandbox Code Playgroud)

当设置为我的 Movie 类的vector属性(类型为CqlVector)时,我收到此错误:

CqlVector 类型中的方法newInstance不适用于参数 FloatVector

我也尝试过使用 CqlVector 类型的newInstance方法,但这似乎也不起作用。如何将 映射fltVector到我的表以便可以插入数据?

Aar*_*ron 5

因此,使用向量数据类型在 Java 和 Cassandra 中都是一个相对新鲜的事物。事实上,截至目前,该CqlVector类型仅在Astra DB中有效,而JavaFloatVector类型与它不匹配。

话虽这么说,有几种方法可以实例化新CqlVector对象。该newInstance方法接受向量的 aList<Float>或 String 表示形式。字符串表示可能很难正确,因此走这条List<Float>路线可能是最简单的路径:

List<Float> vectorListFloat = new ArrayList<>();

vectorListFloat.add(collectionId);
vectorListFloat.add(genre1);
vectorListFloat.add(genre2);
vectorListFloat.add(genre3);
vectorListFloat.add(popularity);
vectorListFloat.add(voteAverage);
vectorListFloat.add(voteCount);

CqlVector cqlVector = CqlVector.newInstance(vectorListFloat);
Run Code Online (Sandbox Code Playgroud)

通过cqlVector从 实例化对象newInstance(vectorListFloat),现在应该可以工作:

movie.setVector(cqlVector);
Run Code Online (Sandbox Code Playgroud)