Vektorsuche in .NET mit PgVector aufbauen, ein Entwicklertipps
Wenn Sie .NET-Anwendungen erstellen, die mit großen Datenmengen, Dokumenten, Produktkatalogen, Kundendaten oder gescannten Dateien umgehen, ist die Suche immer eine Herausforderung. Die Stichwortsuche fehlt der Kontext. Volltextsuche hat ihre Grenzen. Aber die Vektorsuche verändert die Gleichung vollständig.
Wir sind kürzlich auf einen ausgezeichneten Leitfaden von Milan Jovanović gestoßen, einer der respektiertesten Stimmen in der .NET-Community und ein Microsoft MVP, der genau erklärt, wie man Vektorsuche in .NET mit PgVector implementiert, einer PostgreSQL-Erweiterung, die semantische Suchfähigkeiten direkt in Ihre bestehende Datenbank bringt.
Was ist Vektorsuche und wie funktioniert sie?
Traditionelle Suche vergleicht exakte Wörter oder Phrasen. Wenn ein Benutzer nach 'Rechnung überfällig' sucht, wird eine Stichwortsuche nur Dokumente finden, die jene exakten Wörter enthalten. Es wird kein Dokument finden, das 'Zahlung ausstehend' oder 'Saldo fällig' sagt, obwohl sie dasselbe bedeuten.
Vektorsuche funktioniert anders. Anstatt Wörter zu vergleichen, vergleicht sie Bedeutungen.
So funktioniert der Prozess in der Praxis:
Zuerst wird der Text in eine numerische Darstellung umgewandelt, die Einbettung genannt wird, ein hochdimensionales Array von Gleitkommazahlen, das die semantische Bedeutung des Inhalts erfasst. Beispielsweise würden die Sätze 'überfällige Rechnung' und 'Zahlung ausstehend' Einbettungen erzeugen, die im Vektorraum mathematisch nahe beieinander liegen, obwohl sie keine gemeinsamen Wörter haben.
Diese Einbettungen werden von einem maschinellen Lernmodell erzeugt, typischerweise über eine API wie OpenAIs Text-Einbettungsmodelle, und werden zusammen mit Ihren Daten in der Datenbank gespeichert.

Wenn ein Benutzer eine Suchanfrage stellt, wird diese Anfrage ebenfalls mit demselben Modell in eine Einbettung umgewandelt. Die Datenbank berechnet dann die Entfernung zwischen der Abfrageeinbettung und jeder gespeicherten Einbettung und liefert die Ergebnisse, die im Vektorraum am nächsten sind, also semantisch am ähnlichsten und nicht nur nach Stichwörtern abgeglichen.
PgVector ermöglicht dies direkt innerhalb von PostgreSQL, unterstützt effiziente Ähnlichkeitssuchen direkt neben Ihren relationalen Daten, ohne eine dedizierte Vektor-Datenbank zu benötigen.
Datenbankinitialisierung
Bevor Sie Vektoren speichern, aktivieren Sie die PgVector-Erweiterung und richten Sie die Tabelle ein.
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();
Wenn Sie Aspire nicht verwenden, können Sie dasselbe pgvector/pgvector:pg17 Bild über docker-compose ausführen und mit einer regulären Verbindungszeichenfolge darauf verweisen.
Dieser Abschnitt basiert auf dem Originalartikel von Milan Jovanović. Vollständige Code-Beispiele und Implementierungsdetails sind dort verfügbar.
Warum das für Iron Software-Kunden wichtig ist
Viele unserer Kunden verwenden IronPDF, IronOCR und IronBarcode zur Verarbeitung hoher Volumen von Dokumenten; Rechnungen, Berichte, gescannte Aufzeichnungen, Versandetiketten.
Ein praktischer Arbeitsablauf, der Iron Software-Bibliotheken mit PgVector kombiniert, könnte folgendermaßen aussehen:
Extract– Verwenden Sie IronOCR, um Text aus gescannten PDFs oder Bildern zu extrahierenEmbed– Senden Sie extrahierten Text an ein Einbettungsmodell, um Vektordarstellungen zu generierenStore– Speichern Sie die Einbettungen zusammen mit den Dokumentmetadaten in PostgreSQL unter Verwendung von PgvectorSearch– Abfragen nach Bedeutung, um die semantisch relevantesten Dokumente anstelle von exakten Schlüsselwortübereinstimmungen zurückzugeben
Das Ergebnis ist ein intelligenteres Dokumentensuchsystem, das komplett in Ihrem bestehenden .NET- und PostgreSQL-Stack gebaut ist, ohne zusätzliche Infrastruktur.
Was Milans Anleitung abdeckt
Milans Artikel führt durch die vollständige C#-Implementierung: Einrichten der PgVector-Erweiterung in PostgreSQL, Konfigurieren von Entity Framework Core mit Npgsql, Erstellen von Einbettungen, Erstellen von Vektorindizes für die Leistung und Ausführen von Ähnlichkeitsabfragen. Es ist praxisnah, produktionsorientiert und sofort anwendbar für jeden .NET-Entwickler.
Das Entwicklerteam von Iron Software teilt regelmäßig .NET-Ressourcen, Tutorials und technisches Wissen mit unserer Community.
Dokumentenabläufe in .NET erstellen? Iron Suite hat alles, was Sie brauchen.