This is a viewer only at the moment see the article on how this works.
To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk
This is a preview from the server running through my markdig pipeline
Befestigen der Site-Suche nach : PostgreSQL Volltextsuche nach ( und wo es bricht)
Wednesday, 14 January 2026
Die Suche ist eines der Merkmale, die jeder unterschätzt .. . .. Es sieht trivial aus, bis echte Benutzer beginnen, reale Abfragen einzugeben . konzeptuell Recht, aber textlich falsch, wenn die Suche in diesen Fällen fehlschlägt, denken die Benutzer nicht, dass die Website kaputt ist.
Es ist auch irgendwie, dass die ' quälte diese Website seit es ' s inception-. OpenSearch, , haben auf PostgreSQL Volltextsuche mit ihm gearbeitet ' , Phantasie Vektor-Sache aber war nie wirklich glücklich damit ,. , Nicht dass es stark verwendet ' , fast niemand tut hier , ) , aber es verwanzt mich asn vor allem jetzt I'-m Gebäude ein Suchwerkzeug in klarRAG Ich dachte, ich sollte es FINALLY beheben. Ob es IST oder nicht, ist eine andere Angelegenheit.
Dieser Artikel ist ,,''t über den Bau einer Suchmaschine von scratch" ,MSC1 , es ist .''s über die Fixierung der scharfen Kanten des PostgreSQL voll , -" Textsuche in einem realen Produktionssystem , . , I''ll gehen durch die spezifischen Ausfälle Ich traf ,," warum sie passierte , und die pragmatischen Korrekturen erforderlich, um Suche verhalten sich wie Benutzer bereits erwarten , dass ,- , einschließlich Akronym-Handling ?," technische Begriff Parsing , , Phrase search ,, Ausschlusse .
Aufbauend auf früheren ArbeitenDieser Artikel erweitert die semantische Suchimplementierung die hybride Suche mit reziproken Rank Fusion hinzugefügt -( RRF ,). , Das frühere Artikel deckte die Stiftung , - , die PostgreSQL voll kombinieren , - , Textsuche mit Qdrant Vektor suchen ,. , Dieser Artikel behebt die Randfälle, dass die Implementierung verpasst : , Akronyme, die nicht passen , , technische Begriffe mit speziellen Zeichen , und natürliche Abfragen, dass Postgre SQL ,' , Parser bricht . ,
Die semantische Suchinfrastruktur dient den dualen Zwecken, es macht die Website, ' user,- und stellt die Retrieval-Ebene für die Rechtsanwalt GPT RAG-System Schreibassistenten, die neue Beiträge mit Hilfe der Website entwirft.''s vorhandene Inhalte als Wissensbasis. Für tiefere Tauchgänge in die zugrunde liegende Technologie siehe Aufbau eines Rechtsbeistands GPT-", Teil auf Einbettungen und Vektorsuche
Die Probleme
Leere Ergebnisse angezeigt Zufällige Artikel
Wenn eine Suche ergab keine Ergebnisse Das System zeigte zufällige alte Artikel anstelle von hilfreichen Vorschläge Dies verletzt das Prinzip der am wenigsten Überraschung Benutzer erwartet entweder relevante Ergebnisse oder ein klares Spiel gefunden " found message with recent posts as proposes.. , Dies machte es so aussehen, als hätte die Suche funktioniert.
Die LösungVerändert BlogSearchService.HybridSearchWithPagingAsync() um zu erkennen, wenn die Suche Null Ergebnisse zurückgibt und wieder auf aktuelle Beiträge nach Datum absteigend angezeigt wird. NoMatchFound Flagge bis BasePagingModel so kann die Benutzeroberfläche eine entsprechende Nachricht wie -" , keine Übereinstimmung gefunden anzeigen - . , Bedeuteten Sie eines dieser ,?" ,
// No match found - return recent posts as suggestions
if (noMatchFound)
{
Log.Logger.Information("No search results for '{Query}', returning recent posts as suggestions", query);
return await GetRecentPostsAsSuggestions(targetLanguage, startDate, endDate, page, pageSize);
}
Akronyme wie z.B. ", DiSE, ", Weren, MKK3, Matching
PostgreSQL-'-Standard Englische Textsuche Konfiguration technisch Indexe Akronyme ., , aber Normalisierung und Beaming machen short ,, , Fall ?- signifikante Begriffe unzuverlässig in der Praxis Wenn Sie nach suchen , " , DiSE , ", , wird es unterlegt zu ," , liese , und dann das englische Wörterbuch kann es wegwerfen oder zuweisen niedriges Gewicht , was Full-- , Textsuche zu verfehlen Artikel, die eindeutig enthalten , die ," ,DiSE .SK12 , im Titel und Inhalt .
Die LösungAkronym-Erkennung hinzugefügt - (.terms Zeichen mit Großbuchstaben -). und Fall--.unsensitive Substring-Fallback mit PostgreSQL.'. ILIKEDiese Ergänzungen voll ,-'text Suche anstatt es zu ersetzen , ('see Leistung Überlegungen unten, warum dies akzeptabel ist , um ):'
// Detect if query looks like an acronym or short term
var isAcronymLike = query.Length <= 6 && query.Any(char.IsUpper);
// Add substring search for acronyms
searchQuery = searchQuery.Where(x =>
EF.Functions.ILike(x.Title, $"%{acronym}%")
|| EF.Functions.ILike(x.PlainTextContent, $"%{acronym}%"));
Technical Terms with Special Characters Broke Search
Die Suche nach dem genauen Begriff würde bedeuten, dass die Suche nach der exakten Bezeichnung "'t work" .
Die LösungE-Mail-Adresse: http:europa.eu.int SearchQueryParser das allgemeine technische Begriffe erkennt und sie mit durchsuchbaren Versionen ersetzt
private static readonly Dictionary<string, string> TechnicalTerms = new(StringComparer.OrdinalIgnoreCase)
{
["asp.net"] = "aspnet",
["c#"] = "csharp",
[".net"] = "dotnet",
["f#"] = "fsharp",
["node.js"] = "nodejs",
// ... more terms
};
Fragen wie z.B. ", ASPA.NET und Alpine, ", nicht bearbeitet
PostgreSQL behandelt " und " als Stop-Wort und entfernt es von Suchanfragen . in Kombination mit der Sonderzeichenausgabe , eine natürliche Abfrage wie "ASP ,. ,NET und Alpine , " , würde im Wesentlichen zu einer Suche nach nur . werden.
Die LösungImplementiert einen Google-Abfrageparser im --Stil, der intelligent mit Stoppwörtern umgeht und erweiterte Suchoperatoren unterstützt.
Die Lösungen
Google-Dienstleister für die Suche nach Stil
Ich habe eine SearchQueryParser Klasse, die Abfragen mit Unterstützung für –: liest
- Zitate:
"exact match"Suche nach dem genauen Satz - Ausgeschlossene Begriffe:
-unwantedAusgenommen Ergebnisse, die diesen Begriff enthalten - Wildcards:
ASP*--Matches für "-ASP-",-Aspnete für ",-"-AsPNetCore-",- usw. - Technische Bedingungen,: , automatisch handhabt , " , ASPA. , NET", , " , C , #", , usw.
Der Parser verwendet ein kompiliertes Regex-Muster, um die Abfrage zu markieren.
[GeneratedRegex(@"""([^""]+)""|(-)?(\S+)", RegexOptions.Compiled)]
private static partial Regex QueryTokenRegex();
public ParsedQuery Parse(string query)
{
var matches = QueryTokenRegex().Matches(processedQuery);
foreach (Match match in matches)
{
// Quoted phrase
if (match.Groups[1].Success)
{
var phrase = match.Groups[1].Value.Trim();
result.Phrases.Add(phrase);
continue;
}
// Excluded term (starts with -)
if (match.Groups[2].Success)
{
var term = match.Groups[3].Value.Trim();
result.ExcludeTerms.Add(term.ToLowerInvariant());
continue;
}
// Regular term or wildcard
var token = match.Groups[3].Value.Trim();
if (token.Contains('*'))
{
result.WildcardTerms.Add(token.Replace("*", ""));
}
else if (!StopWords.Contains(token))
{
result.IncludeTerms.Add(token.ToLowerInvariant());
}
}
}
Gebäude PostgreSQL tsquery
Der Parser gibt strukturierte Daten aus, die dann in PostgreSQL-'umwandelt werden. to_tsquery weil wir -'- strukturierte Syntax erzeugen - nicht websearch_to_tsquery weil wir uns bereits geparste Operatoren selbst geben und uns mehr Kontrolle darüber verschaffen, wie Begriffe kombiniert werden
public string BuildTsQuery(ParsedQuery parsed)
{
var queryParts = new List<string>();
// Add include terms with AND
foreach (var term in parsed.IncludeTerms)
{
queryParts.Add(term);
}
// Add wildcard terms with :* suffix
foreach (var term in parsed.WildcardTerms)
{
queryParts.Add($"{term}:*");
}
return queryParts.Count > 0 ? string.Join(" & ", queryParts) : string.Empty;
}
Warum nicht einfach benutzen
websearch_to_tsquery? Da es nach wie vor unter technischen Begriffen fehlschlägt, bietet es keine Haken für Hybrid-Ranking oder Fallbacks, indem wir uns selbst analysieren, können wir mit diesen Kantenfällen umgehen, bevor sie PostgreSQL.. erreichen.
Erweiterte BuildSearchQuery
Das BuildSearchQuery Methode wurde komplett neu geschrieben, um die geparste Abfragestruktur zu verwenden. baseQuery Filtern Sie bereits nach Sprache, Datumsbereich und Sichtbarkeit.,. Wir fügen search-.spezifische Bedingungen an der Spitze hinzu.
private IOrderedQueryable<BlogPostEntity> BuildSearchQuery(
string query,
string language,
DateTime? startDate,
DateTime? endDate,
string order)
{
var parsed = _queryParser.Parse(query);
IQueryable<BlogPostEntity> searchQuery = baseQuery;
// Handle phrases (exact substring matching)
foreach (var phrase in parsed.Phrases)
{
searchQuery = searchQuery.Where(x =>
EF.Functions.ILike(x.Title, $"%{phrase}%")
|| EF.Functions.ILike(x.PlainTextContent, $"%{phrase}%")
|| x.Categories.Any(c => EF.Functions.ILike(c.Name, $"%{phrase}%")));
}
// Build tsquery for include terms and wildcards
var tsQuery = _queryParser.BuildTsQuery(parsed);
// Apply full-text search if we have terms
if (!string.IsNullOrWhiteSpace(tsQuery))
{
searchQuery = searchQuery.Where(x =>
x.SearchVector.Matches(EF.Functions.ToTsQuery("english", tsQuery))
|| x.Categories.Any(c =>
EF.Functions.ToTsVector("english", c.Name)
.Matches(EF.Functions.ToTsQuery("english", tsQuery))));
}
// Handle acronyms with case-insensitive substring search
// This supplements full-text search (additive OR), not replaces it
var acronymTerms = parsed.IncludeTerms
.Concat(parsed.WildcardTerms)
.Where(t => _queryParser.IsAcronymLike(t))
.ToList();
foreach (var acronym in acronymTerms)
{
searchQuery = searchQuery.Where(x =>
EF.Functions.ILike(x.Title, $"%{acronym}%")
|| EF.Functions.ILike(x.PlainTextContent, $"%{acronym}%"));
}
// Handle excluded terms (must NOT contain these)
foreach (var excludeTerm in parsed.ExcludeTerms)
{
searchQuery = searchQuery.Where(x =>
!EF.Functions.ILike(x.Title, $"%{excludeTerm}%")
&& !EF.Functions.ILike(x.PlainTextContent, $"%{excludeTerm}%")
&& !x.Categories.Any(c => EF.Functions.ILike(c.Name, $"%{excludeTerm}%")));
}
return orderedQuery;
}
Suchbeispiele
Hier sind einige Beispiele für die verbesserte Suchfunktionalität.
Grundlegende Suche
DiSE
Jetzt passend zu Artikeln mit Titel oder Inhalt.(case
Technische Bedingungen
ASP.NET
Findet Artikel über ASP ,. ,NET , ( , die automatisch in " , aspnet , " , für Voll-- , Textsuche , ) , umgewandelt werden
Phrase Suche
"semantic search"
Findet exakte Phrase ""semantische Suche "" in Artikeln
Ausgeschlossene Begriffe
ASP.NET -Core
Nicht enthalten sind Waren der Tarifnr.
Wildcards
ASP*
Streichhölzer aus "ASP-",ASPNET-",ASPNetCore-MSC6 usw.
Komplexe Abfrage
"full text search" PostgreSQL -MySQL
Findet Artikel mit exaktem Satz.". Volltextsuche.MSC2. UND Erwähnungen von PostgreSQL.,. aber OHNE Artikel, die MySQl erwähnen.
Vor und nach dem Beispiel
Abfrage: ASP.NET and Alpine
Vorher (, gebrochen, ):,
- ," , ASP-. , NET , " , aufgeteilt in , " , ASP-" , -+ ,-MSC6 , –"
- " und " als Stoppwort entfernt
- Ergebnis: :-Nur sucht nach "-Alpine
Nach (-fixiert):
- ,", ASP-.,NET, ", umgewandelt in ", Aspnet, MSC4,
- Intelligent als Teil der Benutzerabfrage-Intent erhalten
- Üblicherweise gesucht
- Ergebnis: :-Fundiert Artikel über sowohl ASP-.-NET und Alpine
Integration des RRF-Ranking
Die Suche integriert sich mit Reciprocal Rank Fusion, wie in der frühere semantische Suche ArtikelHier wird RRF verwendet für RangfolgeEs kombiniert bereits die Ergebnisse von BM.25, vollwertige - Textsuche und vektorsemantische Suche
// Fuse using RRF with category/freshness boosts
var fusedDtos = _ranker.FuseResults(bm25Results, vectorResults, query);
Der RRF-Algorithmus verwendet 1/(k+rank) wo die Ergebnisse aus mehreren Quellen kombiniert werden, dann gelten Boosts für die
- Kategorie-Match: +2.0
- Titelspiel: +1.0
- FrischeExponentieller Zerfall über das Jahr der 1, max.
Für die komplette RRF-Implementierung und wie hybride Suche funktioniert, siehe Semantische Suche in AktionFür tiefere Tauchgänge in Einbettungen und Vektor-Ähnlichkeit, siehe Aufbau eines Rechtsbeistands GPT-", TeilDie gleiche Infrastruktur ermöglicht sowohl die Suche des Benutzers als auch den RAG-Retrieval für das Schreiben von AI--.
Technische Architektur
Abhängigkeitsinjektion
Die neuen Komponenten sind als Dienstleistungen registriert
services.AddSingleton<SearchQueryParser>();
services.AddSingleton<SearchRanker>();
services.AddScoped<BlogSearchService>();
SearchQueryParser und SearchRanker sind Singletons, weil sie stateless sind, ,, Thread, -,safe, MSC3 und über Anfragen wiederverwendet werden können. BlogSearchService ist scoped, weil es auf den Datenbankkontext zugreift.
Abfragefluss
- Benutzer Eingabe der Suchanfrage Suchcontroller
- Abfrageparsierung SearchQueryParser zerlegt sich in strukturierte Komponenten
- Semantische Suche, falls aktiviert Qdrant-Vektordatenbank mit ONNX-Einbettungen
- PostgreSQL Full---Textsuche Immer verfügbar Schlüsselwort-Matching auf der Grundlage von M→
- RRF Fusion Verbindet beide Ergebnissätze mit der Kategorie
- Keine Ergebnisse Gibt aktuelle Beiträge als Vorschläge zurück
Dieselbe semantische Suchkomponente wird auch von der Rechtsanwalt GPT System zum Abrufen relevanter vergangener Blog-Posts für AI---unterstütztes Schreiben. Teil für Details über die Aufnahme Pipeline
Datenbankschema
Suche stützt sich auf eine vorberechnete SearchVector Spalte in der BlogPosts Tabelle ,:'
ALTER TABLE mostlylucid."BlogPosts"
ADD COLUMN "SearchVector" tsvector
GENERATED ALWAYS AS (
to_tsvector('english',
coalesce("Title", '') || ' ' ||
coalesce("PlainTextContent", '')
)
) STORED;
CREATE INDEX idx_blog_posts_search_vector
ON mostlylucid."BlogPosts"
USING GIN ("SearchVector");
Der GIN-Index bietet eine schnelle Volltextsuche über große Textkorpus
Leistungsbeurteilungen
Warum ILIKE für Akronyme?
Während ILIKE (-case---unempfindlich LIKE-MSC2- ist langsamer als Volltextsuche ,-'-s, die für Akronyme notwendig ist, weil -:-
- Volltextsuche normalisiert die Terme der / und bricht kurze Großbuchstaben
- Akronyme sind typischerweise kurze Zeichen, die den Leistungseffekt begrenzen.
- Die Bedingung wird nur hinzugefügt, wenn nötig.
Dieser Ansatz würde nicht auf willkürliche Substring-Suche über Millionen von Zeilen zu skalieren.
PostgreSQL Cover Density Rankingts_rank_cd)
PostgreSQL bietet zwei Ranking-Funktionen für die volle --Textsuche an
ts_rankGrundbegriff Frequenz Wie oft werden Begriffe angezeigt?ts_rank_cdCover-Dichte-Ranking - Wie nahe Begriffe zusammen erscheinen - )
Wir benutzen ts_rank_cd weil es BM-25--ähnliche Relevanz durch Berücksichtigung des Begriffs Nähe
// Order by cover density ranking - rewards term proximity
orderedQuery = searchQuery.OrderByDescending(x =>
x.SearchVector.RankCoverDensity(EF.Functions.ToTsQuery("english", tsQuery)));
Warum? ts_rank_cd ist überlegen.
| , Metrisch | ts_rank |
ts_rank_cd |
|---|---|---|
| Algorithmus Bedeckungsdichte Bestrahlungsdichte | ||
| Mehrsprachige Suchanfragen Belohnte Begriffe, die zusammen erscheinen | ||
| Beispiel: :-Dockercontainer Artikel mit ".Docker".50. mal punktet hoch | . Artikel mit Containern von ".". zusammen Punkte höher | . |
| Leistung Schnelles, Marges langsameres und immer noch nutzendes GIN-Index | ||
| Verhalten Einfache Zählung von BM-25 |
Das ist ein schnelle Win-Optimierung Bessere Relevanz Ranking mit Null-Anwendung.- level computation... Alle Rangfolge geschieht in PostgreSQL unter Verwendung des vorhandenen GIN Index auf SearchVector.
Literaturhinweise
Zusätzliche Leistungsoptimierungen
Über die Fixierung der Suchfunktionalitäten hinaus Mehrere wichtige Optimierungen verbessern die Leistung
Sprachen-Caching
Verfügbare Sprachen ändern sich selten, wurden aber bei jeder Suchanfrage abgefragt.
private static readonly TimeSpan LanguageCacheDuration = TimeSpan.FromHours(1);
private static List<string>? _cachedLanguages;
private static DateTime _languageCacheExpiry = DateTime.MinValue;
private static readonly SemaphoreSlim _cacheLock = new(1, 1);
AuswirkungenBeseitigt die Datenbankabfrage pro Suchanfrage
Ausgefeilte ILIKE-Abfragen
Ursprünglich verwendeter Code foreach Schleifen, die mehrere WHERE-Klauseln erzeugen... Jetzt in einzelne Ausdrücke gestapelt...
// BEFORE: Multiple WHERE clauses
foreach (var acronym in acronymTerms)
{
searchQuery = searchQuery.Where(x =>
EF.Functions.ILike(x.Title, $"%{acronym}%"));
}
// AFTER: Single batched WHERE
if (acronymTerms.Count > 0)
{
searchQuery = searchQuery.Where(x =>
acronymTerms.Any(acronym =>
EF.Functions.ILike(x.Title, $"%{acronym}%")));
}
Auswirkungen:-Reiniger SQL-,-Reinker schneller für Multi---term-Abfragen
Covering Index für häufige Anfragen
Teilindex mit INCLUDE-Spalten für häufige Zugriffsmuster hinzugefügt
CREATE INDEX idx_blog_posts_search_covering
ON mostlylucid."BlogPosts" ("LanguageId", "IsHidden", "ScheduledPublishDate")
INCLUDE ("Id", "Slug", "Title", "PublishedDate")
WHERE "IsHidden" = false;
AuswirkungenErmöglicht Nur Scans Mehr erfahren PostgreSQL doesns - ' Kein Zugriff auf den Tisch-Hape - , - Reduzierung von I/.O durch 20-30% für häufige Abfragen
Unnötig entfernt Beinhaltet
EF Core-'-s Include() lädt vollständige Navigation Entities ,. , entfernt, wo nur Navigationseigenschaften verwendet in WO Klauseln , : ,
// BEFORE: Loads full LanguageEntity into memory
.Include(x => x.LanguageEntity)
.Where(x => x.LanguageEntity.Name == "en")
// AFTER: EF translates navigation property without loading entity
.Where(x => x.LanguageEntity.Name == "en")
AuswirkungenWeniger Daten aus der Datenbank übertragen
Literaturhinweise
Abfrage-Optimierungsstrategie
Suche baut WO Klauseln schrittweise mit EF Core®'s Ausdruck Baumzusammensetzung:
IQueryable<BlogPostEntity> searchQuery = baseQuery;
// Each filter added conditionally - PostgreSQL optimizes the final query
if (parsed.Phrases.Count > 0) { searchQuery = searchQuery.Where(...); }
if (!string.IsNullOrWhiteSpace(tsQuery)) { searchQuery = searchQuery.Where(...); }
if (acronymTerms.Count > 0) { searchQuery = searchQuery.Where(...); }
Dies erzeugt eine einzelne optimierte SQL-Abfrage anstatt mehrere Rundfahrten ,. , PostgreSQL , ' s Query Planer kann Statistiken und Indexe effektiv verwenden, wenn es die komplette WHERE Klausel sieht
Leistungsübersicht
Kumulative Wirkung aller Optimierungen
Optimierung des Latency Impact-Effekts der DB-Lastwirkung von | |-------------|----------------|----------------| Sprach-Caching - Minimale Abfrage-Anfrage-Anfragen-Anfrage Entferne auch (), um | und -5-10% einzuschließen Weniger Datenübertragung BATCH ILIKE |BATCH -5-10%BATSCH |A Cleaner SQL Nur Scans von | Weitere Informationen: http:europa.eu.int/comm/eurostat.html |-Cache-Fixierung (-Routenparams)-|-N-/-A Verhindert veraltete Daten
Erwartete Gesamtverbesserung: Schnellere Suche mit deutlich reduzierter Datenbanklast
Gelernte Lehren
**Don.'.t davon aus, dass die Volltextsuche alles behandelt.**Kantenfälle wie Akronyme und Sonderzeichen benötigen besondere Handhabung.
Mehrere Ansätze kombinierenVollständige Textsuche -(BM„25)" semantische Suche („Vektoren )„ Substring-Fallbacks" bieten eine bessere Abdeckung als jede einzelne Methode.
Google gestaltete NutzererwartungenDie Unterstützung zitierter Phrasen, Ausschlüsse und Platzhalter macht die Suche natürlich, weil Benutzer bereits mit diesen Operatoren vertraut sind.
Hilfreiche Rückschläge bietenWenn die Suche fehlschlägt, wird nichts angezeigt...... und es wird deutlich, dass kein Treffer gefunden wurde.......
Nicht gehacktEin korrekter Abfrageparser ist sauberer und wartungsfähiger als eine Reihe von String-Manipulationen.
Leverage PostgreSQL-''s built-'in RankingVerwendung
ts_rank_cdstattts_rankfür BM-25--ähnliche Relevanz..-Dichtungsranking betrachtet den Begriff Nähe... einen schnellen Gewinn, der die Ergebnisqualität mit Nullanwendung verbessert...--Levelcode...Profil vor der OptimierungDie offensichtlichen Engpässe der "... ..( .-FTS parsing . .) . waren' nicht das wirkliche Problem .,. . - Sprachsuchups . , . exzessive enthält .MS K8 und fehlende Indizes hatten größere Auswirkungen als erwartet .
Batch-DatenbankoperationenMehrsprachig
foreachSchleifen, die getrennt erzeugen WO Klauseln suboptimal SQL®.-Verwendung generierenAny()oderAll()um in einzelne Ausdrücke zu chargen
Künftige Verbesserungen
Mögliche Verbesserungen für die Zukunft – von Bedenken kategorisiert
Verbesserungen bei der Retrievalbehandlung:
- Fuzzy matchingLenshtein-Abstand für Typotoleranz
- Synonyme ErweiterungWeitere Informationen: http:europa.eu.int/comm/eurostat.html
Parsing-Erweiterungen:
- Kategoriefilterung:
category:ASP.NETBetreiber - Datumsbereich:
after:2025-01-01Betreiber
Rangfolge der Veredelungen:
- Hervorhebung der ErgebnisseAusgeglichene Teile des Textes in Ergebnissen anzeigen
- Klicken Sie durch die VerfolgungLernen Sie vom Benutzerverhalten, um das Ranking zu verbessern
Beobachtungsfähigkeit:
- SuchanalyseVerfolgen Sie populäre Abfragen und fehlgeschlagene Suchanfragen, um Lücken zu identifizieren
Schlußfolgerung
Hochbau-Fertigungssuche erfordert die Fixierung von Kantenfällen und Optimierung der Leistung: . Dieser Artikel umfasste sowohl die Befestigung von PostgreSQL als auch Text-Suchkantengehäusen.(acronyms,. Fachbegriffe, ,. Google--.Style-Betreiber und Implementierung wichtiger Leistungsoptimierungen.MSC9. Batching, ,. ts_rank_cd).
Die Umsetzung erreicht Schnellere Suche bei gleichzeitiger Reduzierung der Datenbanklast durch – :
- Deckdichte-Ranking
ts_rank_cdFür eine bessere Relevanz - Sprache caching eliminiert wiederholte Abfragen
- Batched ILIKE-Ausdrücke für Cleaner SQL
- Abdeckung von Indexen, die nur Scans ermöglichen
- Entfernt unnötige EF Core enthält
Die Schlüssel-Insights... kein einzelner Ansatz behandelt alle Fälle... .... PostgreSQL FTS zeichnet sich durch Keyword Matching aus...,... semantische Suche bearbeitet konzeptionelle Abfragen... und gezielte Fallbacks fangen Randfälle... .... Die saubere Parsingschicht verbindet es mit Bedienern und technischen Begriffen, bevor sie die Suchmaschinen erreichen.....
Die semantische Suchinfrastruktur dient dualen Zwecken.
- Benutzer-Suche nach -Kombination von Keyword und semantischem Matching für bessere Ergebnisse
- RAG-RückgewinnungMacht die Rechtsanwalt GPT Schreibassistent
Verwandte Artikel
- Semantische Suche in Aktion Grundlagenforschung zur Hybridsuche mit RRF
- Aufbau eines Rechtsbeistands GPT-", Teil Einbetten von Vektordatenbanken
- Aufbau eines Rechtsbeistands GPT-", Teil Einspeisungs-Pipeline
Offizielle Dokumentation
Alle verfügbaren Code in der Blog' s GitHub Repository.