加入Iron Academy
如果您正在建構處理大量資料、文件、產品目錄、客戶記錄或掃描文件的.NET應用程式,搜尋總是個挑戰。 關鍵字搜索缺少上下文。 全文搜索有其限制。 但向量搜索完全改變了這個等式。
我們最近發現了一篇由.NET社區中最受尊敬的聲音之一的Milan Jovanović撰寫的優秀指南,他也是一位Microsoft MVP,詳細介紹了如何使用PgVector在.NET中實現向量搜索,這是將語義搜索功能直接帶入您現有資料庫的PostgreSQL擴充套件。
什麼是向量搜索,它如何運作?
傳統搜尋匹配精確的字詞或短語。 如果使用者搜索"逾期發票",關鍵字搜索將僅找到包含那些確切字詞的文件。 它不會顯示"付款待處理"或"餘額到期"的文件,即使它們的意思是一樣的。
向量搜索運作不同。 它不匹配字詞,而是匹配意義。
以下是管道實際如何運作的描述:
首先,文字被轉換為一種數值表示,稱為嵌入,即一個高維度的浮點數陣列,捕捉內容的語義意義。 例如,句子"逾期發票"和"付款待處理"將產生在向量空間中數學上彼此接近的嵌入,儘管它們沒有共有的字詞。
這些嵌入由機器學習模型生成,通常通過類似OpenAI的文字嵌入模型API生成,並與您的資料一起儲存在資料庫中。

當使用者執行搜索查詢時,該查詢也將使用相同的模型轉換為嵌入。 然後,資料庫計算查詢嵌入與每個儲存的嵌入之間的距離,返回在向量空間中最接近的結果,這意味著語義上最相似的,而不僅僅是關鍵字匹配的。
PgVector直接在PostgreSQL內部啟用此功能,支持與您的關聯資料緊密相鄰的高效相似性搜索,無需專用向量資料庫。
初始化資料庫
在儲存向量之前,啟用PgVector擴充套件並設置表格。
var builder = DistributedApplication.CreateBuilder(args);
var ollama = builder.AddOllama("ollama")
.WithLifetime(ContainerLifetime.Persistent)
.WithDataVolume()
.WithGPUSupport();
var embeddingModel = ollama.AddModel("qwen3-embedding:0.6b");
var postgres = builder.AddPostgres("postgres", port: 6432)
.WithLifetime(ContainerLifetime.Persistent)
.WithDataVolume()
.WithImage("pgvector/pgvector", "pg17")
.AddDatabase("articles");
builder.AddProject<Projects.PgVector_Articles>("pgvector-articles")
.WithReference(embeddingModel)
.WithReference(postgres)
.WaitFor(embeddingModel)
.WaitFor(postgres);
builder.Build().Run();
var builder = DistributedApplication.CreateBuilder(args);
var ollama = builder.AddOllama("ollama")
.WithLifetime(ContainerLifetime.Persistent)
.WithDataVolume()
.WithGPUSupport();
var embeddingModel = ollama.AddModel("qwen3-embedding:0.6b");
var postgres = builder.AddPostgres("postgres", port: 6432)
.WithLifetime(ContainerLifetime.Persistent)
.WithDataVolume()
.WithImage("pgvector/pgvector", "pg17")
.AddDatabase("articles");
builder.AddProject<Projects.PgVector_Articles>("pgvector-articles")
.WithReference(embeddingModel)
.WithReference(postgres)
.WaitFor(embeddingModel)
.WaitFor(postgres);
builder.Build().Run();如果您不使用Aspire,您可以通過docker-compose並使用常規的連接字串指向它。
本節基於Milan Jovanović的原始文章。 完整程式碼範例和實作細節可在那裡獲得。
為什麼這對Iron Software的客戶很重要
我們的許多客戶使用IronPDF、IronOCR和IronBarcode處理大量文件; 帳單、報告、掃描記錄、運輸標籤。
結合Iron Software程式庫與PgVector的實際工作流程可能如下:
Extract– 使用IronOCR從掃描的PDF或圖像中提取文字Embed– 將提取的文字發送到嵌入模型以生成向量表示Store– 使用Pgvector將嵌入與文件元資料一起保存在PostgreSQL中Search– 根據意義查詢,返回語義上最相關的文件,而不是精確的關鍵字匹配
結果是一個更智能的文件搜索系統,完全內建於您現有的.NET和PostgreSQL堆疊中,無需額外的基礎設施。
Milan的指南涵蓋了什麼
Milan的文章介紹了完整的C#實作:在PostgreSQL中設置PgVector擴充套件,配置Entity Framework Core與Npgsql,生成嵌入,為性能建立向量索引以及運行相似性查詢。 它是實戰導向的,立即適用於任何.NET開發者。
Iron Software的開發團隊定期與我們的社區分享.NET資源、教程和工程見解。
在.NET中構建文件工作流程? Iron Suite擁有一切您所需的。
