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 FLOAT
      default: 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

posted on 2025-10-13 08:00  荣锋亮  阅读(7)  评论(0)    收藏  举报

导航