如何将double数组保存到PostgreSql数据库中的Vector字段 返回

SqlSugar 处理完成
16 1009

我准备将词嵌入数据保存到PostgreSql数据库中,数据库插件使用PgVector,字段的类型为vector。

实体类定义如下:

    public class SentenceVector : BaseEntity

    {

        /// <summary>

        /// 语句Id

        /// </summary>

        [SugarColumn(ColumnName = "sentence_id", IsPrimaryKey = true, IsIdentity = false)]

        public long SentenceId { get; set; }


        /// <summary>

        /// 语句内容

        /// </summary>

        [SugarColumn(ColumnName = "sentence", IsNullable = false, Length = 200)]

        public string Sentence {  get; set; }


        /// <summary>

        /// 语句向量

        /// </summary>

        [SugarColumn(ColumnName = "vector", IsNullable = false, IsJson = true, ColumnDataType = "vector")]

        public double[] Vector {  get; set; }

    }

使用SqlSugar保存代码为:

var insertedCount = SugarDbContext.Insertable(sentenceVector).ExecuteCommand();

运行后报的错误为:

42804: column "vector" is of type vector but expression is of type json

数据库中的vector列定义为vector类型。

请问如何解决这个问题?

谢谢!

热忱回答16

  • fate sta fate sta VIP0
    2023/11/13

    看sqlsugar文档:自定义类型

    0 回复
  • fate sta fate sta VIP0
    2023/11/13

    或者IsArray=true试试,这个不是JSON

    0 回复
  • @fate sta:使用IsArray=true,并且double[]改为float[]就可以成功写入数据库了。

    非常感谢!

    0 回复
  • 一个新的问题,当我使用上述修改后的实体类定义去读取已经写入的Vector字段时,报了下面的错误:

    The field 'vector' has type 'public.vector', which is currently unknown to Npgsql. You can retrieve it as a string by marking it as unknown, please see the FAQ.

    只能按提示将vector映射为字符串类型吗,如何做才能将读取结果直接映射为float[]类型?

    如果按映射字符串的方式,ChatGPT给出了以下的示例代码:

    [Column(TypeName = "public.vector")]

    [NpgsqlTypeMapping("public.vector", NpgsqlDbType.Unknown)]

    public string Vector { get; set; }

    可是在SqlSugar可以实现类似的类型映射功能吗?

    谢谢!

    0 回复
  • fate sta fate sta VIP0
    2023/11/13

    -

    0 回复
  • fate sta fate sta VIP0
    2023/11/13

    你可以用ADO.NET写一个能用的试试

    0 回复
  • fate sta fate sta VIP0
    2023/11/13

    具体要ADO.NET能支持

    0 回复
  • fate sta fate sta VIP0
    2023/11/13

    NpgsqlConnection.GlobalTypeMapper.MapUnknownType("public.vector", NpgsqlDbType.Unknown);

    0 回复
  • fate sta fate sta VIP0
    2023/11/13

    好像是这样用的

    0 回复
  • fate sta fate sta VIP0
    2023/11/13

    -

    0 回复
  • fate sta fate sta VIP0
    2023/11/13

       [SugarColumn(ColumnName = "text []", IsNullable = false, Array= true)]

        public string[] Vector {  get; set; }

    用原生数组类型不行吗

    0 回复
  • 我找到了PgVector的C#官方支持文档,应该可以实现我的需求了,网址如下:

    https://github.com/pgvector/pgvector-dotnet

    供参考。

    感谢支持,希望SqlSugar越做越好!

    0 回复
  • fate sta fate sta VIP0
    2023/11/13

    这个支持的

    var dataSourceBuilder =new NpgsqlDataSourceBuilder(connString); 

    dataSourceBuilder.UseVector(); 

    await using var dataSource = dataSourceBuilder.Build(); 

    var conn = dataSource.OpenConnection();

    db.Ado.Connection=conn ;

    db.Queryable<T>().ToList();

    如果还报错需要用自定义类型

    0 回复
  • fate sta fate sta VIP0
    2023/11/13

    看一下自定义类型怎么用的

    0 回复
  • @fate sta:我试试,感谢!

    0 回复
  • @fate sta:按照你的提示确实可以读取数据库向量字段了,属性的定义应该改为:

    public Vector Vector { get; set; }

    其中的Vector类型定义来自第三方包:PgVector.Dapper(在nuget管理界面搜索PgVector,应该还可以使用其它包的选项,没有测试)。

    下面是Vector定义:

        public class Vector

        {

            private float[] vec;


            public Vector(float[] v)

            {

                vec = v;

            }


            public Vector(string s)

            {

                vec = Array.ConvertAll(s.Substring(1, s.Length - 2).Split(","), (string v) => float.Parse(v));

            }


            public override string ToString()

            {

                return "[" + string.Join(",", vec) + "]";

            }


            public float[] ToArray()

            {

                return vec;

            }

        }

    本质上就是float[]数组。


    感谢提供了非常有价值的帮助!

    0 回复