我在将 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>);
映射到类:
public class Movie {
private int movieId;
private String title;
private LocalDate releaseDate;
private CqlVector<Float> vector;
(包含 getter 和 setter)
并且它的属性通过以下 CQL 绑定到准备好的语句:
private final static String strCQLINSERT = "INSERT INTO movies "
+ "(movie_id,title,release_date,movie_vector) "
+ "VALUES (?,?,?,?)";
然后,我使用 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);
在我的 Movie 类上设置
vector
属性(类型为 CqlVector
)时,出现此错误:
CqlVector 类型中的方法
不适用于参数 FloatVectornewInstance
我也尝试过使用 CqlVector 类型的
newInstance
方法,但这似乎也不起作用。如何将 fltVector
映射到我的表以便我可以插入数据?
因此,在 Java 和 Cassandra 中,使用向量数据类型都是一件非常新鲜的事情。事实上,截至目前,
CqlVector
类型仅在Astra DB中有效,Java FloatVector
类型与它不匹配。
话虽这么说,有几种方法可以实例化新的
CqlVector
对象。 newInstance
方法接受向量的 List<Float>
或字符串表示形式。字符串表示可能很难正确,因此采用 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);
使用从
cqlVector
实例化的 newInstance(vectorListFloat)
对象,现在应该可以工作了:
movie.setVector(cqlVector);