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

piwo6bdm  于 2023-10-18  发布在  Cassandra
关注(0)|答案(1)|浏览(179)

我在用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方法,但似乎也不起作用。如何将fltVectorMap到我的表,以便可以重新配置数据?

5vf7fwbs

5vf7fwbs1#

因此,在Java和Cassandra中,使用向量数据类型都是一个真正的新事物。实际上,到目前为止,CqlVector类型仅在Astra DB中有效,Java FloatVector类型与之不匹配。
也就是说,有几种方法可以示例化新的CqlVector对象。newInstance方法接受向量的List<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);

使用从newInstance(vectorListFloat)示例化的cqlVector对象,现在应该可以工作了:

movie.setVector(cqlVector);

相关问题