添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

我准备将词嵌入数据保存到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类型。

请问如何解决这个问题?

谢谢!

一个新的问题,当我使用上述修改后的实体类定义去读取已经写入的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可以实现类似的类型映射功能吗?

谢谢!

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

public string[] Vector {  get; set; }

用原生数组类型不行吗

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

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

供参考。

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

这个支持的

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();

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

@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[]数组。


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