rqlite java sdk 对于sqlite-vec 支持的bug
sqlite-vec 查询返回的distance 是real 类型的,但是rqlite java sdk 对于类型了check,如果没在代码里边的会直接提示异常
解决方法
实际上real 与包含精度的float 类型是类似的,解决方法就比较简单了,配置兼容就可以了
参考示例代码
具体需改的地方比较多,可以参考完整pr 代码
public static int getJdbcType(String rqliteType) {if (rqliteType == null) {throw new IllegalArgumentException("type cannot be null");}var parts = rqliteType.trim().toUpperCase().split("[(),]");var rqType = parts[0];switch (rqType) {case RQ_INTEGER: return INTEGER;case RQ_NUMERIC: return NUMERIC;case RQ_BOOLEAN: return BOOLEAN;case RQ_TINYINT: return TINYINT;case RQ_SMALLINT: return SMALLINT;case RQ_BIGINT: return BIGINT;case RQ_FLOAT: return FLOAT;case RQ_DOUBLE: return DOUBLE;case RQ_TEXT:case RQ_VARCHAR: return VARCHAR;case RQ_DATE: return DATE;case RQ_TIME: return TIME;case RQ_TIMESTAMP: return TIMESTAMP;case RQ_DATALINK: return DATALINK;case RQ_CLOB: return CLOB;case RQ_NCLOB: return NCLOB;case RQ_NVARCHAR: return NVARCHAR;case RQ_BLOB: return BLOB;case RQ_NULL: return NULL;case RQ_REAL: return FLOAT; // RQLite uses REAL as an alias for FLOATdefault: return -1;}}
说明
以上是一个示例,参考jdbc 操作代码
package com.dalong;
import java.sql.*;
import java.util.Arrays;
import java.util.UUID;public class App {public static void main(String[] args) {var url = "jdbc:sqlite:http://localhost:8080";var vector = new int[] {1,2,4};System.out.println("vector to " + Arrays.toString(vector));try (Connection conn = DriverManager.getConnection(url)) {var stmt = conn.createStatement();var ps = conn.prepareStatement("insert into dalongrong_vec (id, vector, user_id, type, version) values (?,?,?,?,?)");ps.setString(1, UUID.randomUUID().toString());ps.setString(2, Arrays.toString(vector));ps.setString(3, "user123");ps.setString(4, "text");ps.setString(5, "v1");int result = ps.executeUpdate();System.out.println("Insert result: " + result);var psv2 = conn.prepareStatement("select id, user_id,vector, vec_distance_cosine(vector,?) distance from dalongrong_vec where vector match ? and type = ? and version = ? and k = 10 order by distance");psv2.setString(1, Arrays.toString(vector));psv2.setString(2, Arrays.toString(vector));psv2.setString(3, "text");psv2.setString(4, "v1");var rs = psv2.executeQuery();while (rs.next()) {System.out.println("ID: " + rs.getString("id") + ", vector: " + rs.getString("vector") +"vector: " + rs.getString("user_id") + ", distance:"+ rs.getFloat("distance"));}} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}}
}
参考资料
https://github.com/rqlite/rqlite-jdbc
https://github.com/rqlite/rqlite-jdbc/pull/1
