diff --git a/content/docs-lite/zh/docs/DataVec/DataVec-integrations.md b/content/docs-lite/zh/docs/DataVec/DataVec-integrations.md index d13b3a65a22a9721512e5b88e6632b26731da923..e335af02c804eaec6da4e3060749fbdfbe40c0df 100644 --- a/content/docs-lite/zh/docs/DataVec/DataVec-integrations.md +++ b/content/docs-lite/zh/docs/DataVec/DataVec-integrations.md @@ -20,6 +20,7 @@ openGauss DataVec提供多种第三方组件的集成教程,并通过多语言 - [Java](integrationJava.md) - [Node.js](integrationJavaScript.md) - [Go](integrationGo.md) +- [C#](integrationCsharp.md) ## 性能测试 - [VectorDBBench](openGauss-VectorDBBench.md) diff --git a/content/docs-lite/zh/docs/DataVec/integrationCsharp.md b/content/docs-lite/zh/docs/DataVec/integrationCsharp.md new file mode 100644 index 0000000000000000000000000000000000000000..cba9464a9742dd2fe4fd7b9811ea3fb9b375a7d7 --- /dev/null +++ b/content/docs-lite/zh/docs/DataVec/integrationCsharp.md @@ -0,0 +1,153 @@ +# C# SDK对接向量数据库 +本文介绍如何使用C#语言调用openGauss向量数据库。 + +## 环境要求 +- 使用`donet --versin`查看是否安装.NET开发工具,若无,则需安装donet-sdk +- 安装相关库 + ``` + dotnet add package Pgvector + dotnet add package Npgsql + ``` + +## 基本操作 +### 1.连接数据库 +```C# +public NpgsqlConnection Connect(string connStr) +{ + var dataSourceBuilder = new NpgsqlDataSourceBuilder(connStr); + dataSourceBuilder.UseVector(); + await using var dataSource = dataSourceBuilder.Build(); + var conn = dataSource.OpenConnection(); + conn.ReloadTypes(); + return conn; +} +``` +### 2.创建表 +```C# +public async Task CreateTableAsync(NpgsqlConnection conn) +{ + const string create = "CREATE TABLE items (id serial PRIMARY KEY, embedding vector(3))"; + await using var cmd = new NpgsqlCommand(create, conn); + await cmd.ExecuteNonQueryAsync(); +} +``` + +### 3.创建索引 +```C# +public async Task CreateIndexAsync(NpgsqlConnection conn) +{ + const string createIndex = "CREATE INDEX ON items USING hnsw (embedding vector_l2_ops)"; + await using var cmd = new NpgsqlCommand(createIndex, conn); + await cmd.ExecuteNonQueryAsync(); +} +``` + +### 4.插入/删除/更新数据 +- 批量插入 +```C# +public async Task InsertDataAsync(NpgsqlConnection conn, Vector vector) +{ + const string insert = "INSERT INTO items (embedding) VALUES ($1)"; + await using var cmd = new NpgsqlCommand(insert, conn); + cmd.Parameters.AddWithValue(vector); + await cmd.ExecuteNonQueryAsync(); +} +``` + +- 删除 +```C# +public async Task DeleteDataAsync(NpgsqlConnection conn, int id) +{ + const string delete = "DELETE FROM items WHERE id = $1"; + await using var cmd = new NpgsqlCommand(delete, conn); + cmd.Parameters.AddWithValue(id); + await cmd.ExecuteNonQueryAsync(); +} +``` + +- 更新 +```C# +public async Task UpdateDataAsync(NpgsqlConnection conn, Vector vector, int id) +{ + const string update = "UPDATE items SET embedding = $1 WHERE id = $2"; + await using var cmd = new NpgsqlCommand(update, conn); + cmd.Parameters.AddWithValue(vector).DataTypeName = "vector"; + cmd.Parameters.AddWithValue(id); + await cmd.ExecuteNonQueryAsync(); +} +``` + +### 5.查询 +```C# +public async Task> QueryAsync(NpgsqlConnection conn, Vector vector, int limit) +{ + const string query = "SELECT * FROM items ORDER BY embedding <-> $1 LIMIT @limit" + cmd = new NpgsqlCommand(query, conn); + cmd.Parameters.AddWithValue(vector).DataTypeName = "vector"; + cmd.Parameters.AddWithValue(limit); + + var results = new System.Collections.Generic.List<(int, Vector)>(); + await using var reader = await cmd.ExecuteReaderAsync(); + while (await reader.ReadAsync()) + { + var id = reader.GetInt32(0); + var embedding = (Vector)reader.GetValue(1); + results.Add((id, embedding)); + } + return results; +} +``` + +### 6.删除表 + +```C# +public async Task DropTableAsync(NpgsqlConnection conn) +{ + const string drop = "DROP TABLE IF EXISTS items"; + await using var cmd = new NpgsqlCommand(drop, conn) + await cmd.ExecuteNonQueryAsync(); +} +``` + +### 7.关闭连接 +```C# +public async Task CloseConnectionAsync(NpgsqlConnection conn) +{ + if(conn != null) + { + await conn.CloseAsync(); + await conn.DisposeAsync(); + } +} +``` + +## 用例 +```C# +using System; +using Pgvector; +using Npgsql; +namespace Demo +{ + public class Program + { + public static async Task Main(string[] args) + { + var connstr = "Host=localhost;Database=Yourdb;Port=Yourport;Username=Yourname;Password=YourPassword"; + var dbHandler = new Program(); + var conn = await dbHandler.Connect(connstr); + + await dbHandler.CreateTableAsync(conn); + + await dbHandler.CreateIndexAsync(conn); + + var vectorq = new Vector(new float[] {1, 1, 1}); + await dbHandler.InsertDataAsync(conn, vectorq); + + var results = await dbHandler.QueryAsync(conn, vectorq, 10); + + await dbHandler.CloseConnectionAsync(conn); + } + } +} + +``` diff --git a/content/docs-lite/zh/menu/index.md b/content/docs-lite/zh/menu/index.md index e34246d792350d36af2d65af9527bea2d81540b8..30d7851c4451c9cea6a134cd5b5436cdc03e4f08 100644 --- a/content/docs-lite/zh/menu/index.md +++ b/content/docs-lite/zh/menu/index.md @@ -641,6 +641,7 @@ headless: true - [Java SDK]({{< relref "./docs/DataVec/integrationJava.md" >}}) - [Node.js SDK]({{< relref "./docs/DataVec/integrationJavaScript.md" >}}) - [Go SDK]({{< relref "./docs/DataVec/integrationGo.md" >}}) + - [C# SDK]({{< relref "./docs/DataVec/integrationCsharp.md" >}}) - 性能测试 - [VectorDBBench]({{< relref "./docs/DataVec/openGauss-VectorDBBench.md" >}}) - [AnnBenchmark]({{< relref "./docs/DataVec/testtool_annbenchmark.md" >}}) diff --git a/content/zh/docs/DataVec/DataVec-integrations.md b/content/zh/docs/DataVec/DataVec-integrations.md index 09f592a254985b79beed78382a801b692b43290c..280cff798ebb92857e60a866a6abaeaf5a20bd5e 100644 --- a/content/zh/docs/DataVec/DataVec-integrations.md +++ b/content/zh/docs/DataVec/DataVec-integrations.md @@ -20,6 +20,7 @@ openGauss DataVec提供多种第三方组件的集成教程,并通过多语言 - [Java](integrationJava.md) - [Node.js](integrationJavaScript.md) - [Go](integrationGo.md) +- [C#](integrationCsharp.md) ## 性能测试 - [VectorDBBench](openGauss-VectorDBBench.md) diff --git a/content/zh/docs/DataVec/integrationCsharp.md b/content/zh/docs/DataVec/integrationCsharp.md new file mode 100644 index 0000000000000000000000000000000000000000..cba9464a9742dd2fe4fd7b9811ea3fb9b375a7d7 --- /dev/null +++ b/content/zh/docs/DataVec/integrationCsharp.md @@ -0,0 +1,153 @@ +# C# SDK对接向量数据库 +本文介绍如何使用C#语言调用openGauss向量数据库。 + +## 环境要求 +- 使用`donet --versin`查看是否安装.NET开发工具,若无,则需安装donet-sdk +- 安装相关库 + ``` + dotnet add package Pgvector + dotnet add package Npgsql + ``` + +## 基本操作 +### 1.连接数据库 +```C# +public NpgsqlConnection Connect(string connStr) +{ + var dataSourceBuilder = new NpgsqlDataSourceBuilder(connStr); + dataSourceBuilder.UseVector(); + await using var dataSource = dataSourceBuilder.Build(); + var conn = dataSource.OpenConnection(); + conn.ReloadTypes(); + return conn; +} +``` +### 2.创建表 +```C# +public async Task CreateTableAsync(NpgsqlConnection conn) +{ + const string create = "CREATE TABLE items (id serial PRIMARY KEY, embedding vector(3))"; + await using var cmd = new NpgsqlCommand(create, conn); + await cmd.ExecuteNonQueryAsync(); +} +``` + +### 3.创建索引 +```C# +public async Task CreateIndexAsync(NpgsqlConnection conn) +{ + const string createIndex = "CREATE INDEX ON items USING hnsw (embedding vector_l2_ops)"; + await using var cmd = new NpgsqlCommand(createIndex, conn); + await cmd.ExecuteNonQueryAsync(); +} +``` + +### 4.插入/删除/更新数据 +- 批量插入 +```C# +public async Task InsertDataAsync(NpgsqlConnection conn, Vector vector) +{ + const string insert = "INSERT INTO items (embedding) VALUES ($1)"; + await using var cmd = new NpgsqlCommand(insert, conn); + cmd.Parameters.AddWithValue(vector); + await cmd.ExecuteNonQueryAsync(); +} +``` + +- 删除 +```C# +public async Task DeleteDataAsync(NpgsqlConnection conn, int id) +{ + const string delete = "DELETE FROM items WHERE id = $1"; + await using var cmd = new NpgsqlCommand(delete, conn); + cmd.Parameters.AddWithValue(id); + await cmd.ExecuteNonQueryAsync(); +} +``` + +- 更新 +```C# +public async Task UpdateDataAsync(NpgsqlConnection conn, Vector vector, int id) +{ + const string update = "UPDATE items SET embedding = $1 WHERE id = $2"; + await using var cmd = new NpgsqlCommand(update, conn); + cmd.Parameters.AddWithValue(vector).DataTypeName = "vector"; + cmd.Parameters.AddWithValue(id); + await cmd.ExecuteNonQueryAsync(); +} +``` + +### 5.查询 +```C# +public async Task> QueryAsync(NpgsqlConnection conn, Vector vector, int limit) +{ + const string query = "SELECT * FROM items ORDER BY embedding <-> $1 LIMIT @limit" + cmd = new NpgsqlCommand(query, conn); + cmd.Parameters.AddWithValue(vector).DataTypeName = "vector"; + cmd.Parameters.AddWithValue(limit); + + var results = new System.Collections.Generic.List<(int, Vector)>(); + await using var reader = await cmd.ExecuteReaderAsync(); + while (await reader.ReadAsync()) + { + var id = reader.GetInt32(0); + var embedding = (Vector)reader.GetValue(1); + results.Add((id, embedding)); + } + return results; +} +``` + +### 6.删除表 + +```C# +public async Task DropTableAsync(NpgsqlConnection conn) +{ + const string drop = "DROP TABLE IF EXISTS items"; + await using var cmd = new NpgsqlCommand(drop, conn) + await cmd.ExecuteNonQueryAsync(); +} +``` + +### 7.关闭连接 +```C# +public async Task CloseConnectionAsync(NpgsqlConnection conn) +{ + if(conn != null) + { + await conn.CloseAsync(); + await conn.DisposeAsync(); + } +} +``` + +## 用例 +```C# +using System; +using Pgvector; +using Npgsql; +namespace Demo +{ + public class Program + { + public static async Task Main(string[] args) + { + var connstr = "Host=localhost;Database=Yourdb;Port=Yourport;Username=Yourname;Password=YourPassword"; + var dbHandler = new Program(); + var conn = await dbHandler.Connect(connstr); + + await dbHandler.CreateTableAsync(conn); + + await dbHandler.CreateIndexAsync(conn); + + var vectorq = new Vector(new float[] {1, 1, 1}); + await dbHandler.InsertDataAsync(conn, vectorq); + + var results = await dbHandler.QueryAsync(conn, vectorq, 10); + + await dbHandler.CloseConnectionAsync(conn); + } + } +} + +``` diff --git a/content/zh/menu/index.md b/content/zh/menu/index.md index 13cad166ef2867bccd9abe25b9784d7752f7eb85..435ee7ed7f51919758dc5914d5436f1b1507239a 100644 --- a/content/zh/menu/index.md +++ b/content/zh/menu/index.md @@ -926,6 +926,7 @@ headless: true - [Java SDK]({{< relref "./docs/DataVec/integrationJava.md" >}}) - [Node.js SDK]({{< relref "./docs/DataVec/integrationJavaScript.md" >}}) - [Go SDK]({{< relref "./docs/DataVec/integrationGo.md" >}}) + - [C# SDK]({{< relref "./docs/DataVec/integrationCsharp.md" >}}) - 性能测试 - [VectorDBBench]({{< relref "./docs/DataVec/openGauss-VectorDBBench.md" >}}) - [AnnBenchmark]({{< relref "./docs/DataVec/testtool_annbenchmark.md" >}})