如何将double数组保存到PostgreSql数据库中的Vector字段 返回
我准备将词嵌入数据保存到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 VIP02023/11/13
看sqlsugar文档:自定义类型
0 回复 -
fate sta VIP02023/11/13
或者IsArray=true试试,这个不是JSON
0 回复 -
细雨牧童笛 VIP02023/11/13
@fate sta:使用IsArray=true,并且double[]改为float[]就可以成功写入数据库了。
非常感谢!
0 回复 -
细雨牧童笛 VIP02023/11/13
一个新的问题,当我使用上述修改后的实体类定义去读取已经写入的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 VIP02023/11/13
-
0 回复 -
fate sta VIP02023/11/13
你可以用ADO.NET写一个能用的试试
0 回复 -
fate sta VIP02023/11/13
具体要ADO.NET能支持
0 回复 -
fate sta VIP02023/11/13
NpgsqlConnection.GlobalTypeMapper.MapUnknownType("public.vector", NpgsqlDbType.Unknown);
0 回复 -
fate sta VIP02023/11/13
好像是这样用的
0 回复 -
fate sta VIP02023/11/13
-
0 回复 -
fate sta VIP02023/11/13
[SugarColumn(ColumnName = "text []", IsNullable = false, Array= true)]
public string[] Vector { get; set; }
用原生数组类型不行吗
0 回复 -
细雨牧童笛 VIP02023/11/13
我找到了PgVector的C#官方支持文档,应该可以实现我的需求了,网址如下:
https://github.com/pgvector/pgvector-dotnet
供参考。
感谢支持,希望SqlSugar越做越好!
0 回复 -
fate sta VIP02023/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 VIP02023/11/13
看一下自定义类型怎么用的
0 回复 -
细雨牧童笛 VIP02023/11/13
@fate sta:我试试,感谢!
0 回复 -
细雨牧童笛 VIP02023/11/13
@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 回复