我在用Java将JavaVector类型Map到我的Cassandra表(Astra DB)时遇到了麻烦。其思想是通过具有向量搜索的ANN查询以返回电影推荐。
下面是我的表定义:
CREATE TABLE movies (
movie_id INT PRIMARY KEY,
title TEXT,
release_date DATE,
movie_vector vector<float,7>);
它Map到类:
public class Movie {
private int movieId;
private String title;
private LocalDate releaseDate;
private CqlVector<Float> vector;
- (完整的getters和setters)*
它的属性绑定到一个带有以下CQL的准备语句:
private final static String strCQLINSERT = "INSERT INTO movies "
+ "(movie_id,title,release_date,movie_vector) "
+ "VALUES (?,?,?,?)";
然后使用JavaVector API从float
数组定义一个vector,然后尝试将其Map到类中。
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中的方法newInstance
不适用于参数FloatVector
我还尝试使用CqlVector类型的newInstance
方法,但似乎也不起作用。如何将fltVector
Map到我的表,以便可以重新配置数据?
1条答案
按热度按时间5vf7fwbs1#
因此,在Java和Cassandra中,使用向量数据类型都是一个真正的新事物。实际上,到目前为止,
CqlVector
类型仅在Astra DB中有效,JavaFloatVector
类型与之不匹配。也就是说,有几种方法可以示例化新的
CqlVector
对象。newInstance
方法接受向量的List<Float>
或String表示。字符串表示可能很坚韧正确,所以走List<Float>
路线可能是最简单的路径:使用从
newInstance(vectorListFloat)
示例化的cqlVector
对象,现在应该可以工作了: