suchen
HeimWeb-Frontendjs-TutorialPostgreSQL-Volltextsuche, Rangfolge nach Position

PostgreSQL Full Text Search Rank by Position

Kürzlich bin ich auf ein Problem mit der Volltextsuche gestoßen. Ich verwende diese Funktion in meiner Sucheingabe, wobei das Backend während der Eingabe Hinweise auf mögliche Übereinstimmungen sendet. Die Backend-Datenbank ist PostgreSQL. Ich brauchte eine Rangfolge der Hinweise nach der Position des gesuchten Begriffs im Text.

Wenn Sie also nach dem Titel „Star Wars“ suchen, erhalten Sie zuerst den Beitrag „Star Wars“ statt „Wie Star Wars 7–9 die Welt von Star Wars veränderte (eine unterhaltsame Dokumentation über Star Wars)“, was möglicherweise der Fall war höherer Rang, da der Begriff dreimal vorkommt.

Volltextsuche in PostgreSQL

Eine Volltextsuche in PostgreSQL ist ganz einfach möglich. Es gibt zwei Hauptwerkzeuge, die verwendet werden können:

  • tsvector – stellt ein durchsuchbares Dokument dar.
  • tsquery – stellt die Suchabfrage dar, die für ein Dokument ausgeführt werden soll.

Angenommen, wir möchten nach den Titeln unserer Blogbeiträge suchen. Um sie durchsuchbar zu machen, können wir die folgende Abfrage verwenden:

SELECT 
id, 
title 
FROM blogposts
WHERE to_tsquery('JavaScript') @@ to_tsvector(posts.title);

In diesem Fall konvertieren wir die Beitragstitel bei jeder Suche dynamisch in einen TS-Vektor. Allerdings dauert diese Transformation einige Zeit. Ein besserer Ansatz besteht darin, diese Transformation vorab in der Datenbank durchzuführen und sie zur schnelleren Suche auch als Index für die Titel zu speichern.

Lasst uns eine neue Spalte mit Titelvektoren erstellen und auch diese neue Spalte indizieren:

ALTER TABLE blogposts ADD COLUMN search_vector tsvector;
UPDATE blogposts SET search_vector = (to_tsvector(posts.title));
CREATE INDEX titles_fts_idx ON blogposts USING gin(search_vector);

Versuchen Sie nun, nach dem Begriff „JavaScript“ zu suchen

SELECT 
id, 
title
FROM blogposts
WHERE to_tsquery('JavaScript') @@ search_vector;

Sie können auch Indizes aus ts-Vektoren direkt in der Titelspalte erstellen, wie folgt:

CREATE INDEX titles_fts_idx ON blogposts USING GIN (to_tsvector(posts.title));

und verwenden Sie die Suche wie folgt:

SELECT 
id, 
title
FROM blogposts
WHERE to_tsquery('JavaScript') @@ posts.title;

Jetzt wird die Volltextsuche rasend schnell sein und in Millisekunden abgeschlossen sein.

Rangfolge der Ergebnisse

PostgreSQL bietet die ts_rank-Funktion, mit der Sie Suchergebnisse bewerten und sie basierend auf ihrem Ranking ordnen können. PostgreSQL unterstützt die folgenden Ranking-Optionen:

  • 0 (Standard) ignoriert die Dokumentlänge
  • 1 teilt den Rang durch 1, den Logarithmus der Dokumentlänge
  • 2 dividiert den Rang durch die Dokumentlänge
  • 4 dividiert den Rang durch den mittleren harmonischen Abstand zwischen Extents (dies wird nur von ts_rank_cd implementiert)
  • 8 dividiert den Rang durch die Anzahl der eindeutigen Wörter im Dokument
  • 16 teilt den Rang durch 1, den Logarithmus der Anzahl eindeutiger Wörter im Dokument
  • 32 teilt den Rang durch sich selbst 1

Sie können den ts_rank wie folgt verwenden:

SELECT
    ...
ts_rank(search_vector, to_tsquery('JavaScript'), 0) as rank_title
    ...
ORDER BY rank_title DESC NULLS LAST

Es gibt jedoch keine integrierte Ranking-Option basierend auf der Position des Suchbegriffs innerhalb der Zeichenfolge (d. h. Titelspalte).

POSITION zur Rettung

Glücklicherweise gibt es in PostgreSQL die POSITION-Funktion. Die PostgreSQL-Funktion POSITION wird verwendet, um die Position eines Teilstrings innerhalb eines bestimmten Strings zu finden. In unserem Fall können wir es so verwenden

SELECT 
id, 
title 
FROM blogposts
WHERE to_tsquery('JavaScript') @@ to_tsvector(posts.title);

ts_rank verwendet die Normalisierungszahl 2, da 2 den Rang durch die Dokumentlänge teilt
Die magische Zahl 0,0001 besteht darin, eine Division durch 0 zu vermeiden, da die POSTION-Funktion von 1 und nicht von 0 an zählt und 0 zurückgibt, wenn die Zeichenfolge nicht gefunden wird.

Der endgültige Code könnte so aussehen:

ALTER TABLE blogposts ADD COLUMN search_vector tsvector;
UPDATE blogposts SET search_vector = (to_tsvector(posts.title));
CREATE INDEX titles_fts_idx ON blogposts USING gin(search_vector);

Suche nach weiteren Begriffen

Eine Einschränkung muss erwähnt werden, wenn Sie nach mehreren Begriffen gleichzeitig suchen (wie JavaScript und TypeScript).

Die Argumente für die to_tsquery-Funktion können mit großer Flexibilität verwendet werden, einschließlich logischer Operatoren usw. Die POSITION-Funktion hingegen ist „nur“ ein Teilstring in string.

Beispiel aus der realen Welt

Hier ist mein Beispiel eines realen Endpunkts in der SvelteKit-Webanwendung, die die NPM-Bibliothek von Postgres (SQL) verwendet:

SELECT 
id, 
title
FROM blogposts
WHERE to_tsquery('JavaScript') @@ search_vector;

Hier sind die Links zur jeweiligen Dokumentation:

  • https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-PARSING-DOCUMENTS
  • https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-RANKING
  • https://www.postgresql.org/docs/9.1/functions-string.html

Das obige ist der detaillierte Inhalt vonPostgreSQL-Volltextsuche, Rangfolge nach Position. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
JavaScript -Datentypen: Gibt es einen Unterschied zwischen Browser und NodeJs?JavaScript -Datentypen: Gibt es einen Unterschied zwischen Browser und NodeJs?May 14, 2025 am 12:15 AM

JavaScript -Kerndatentypen sind in Browsern und Knoten.js konsistent, werden jedoch unterschiedlich als die zusätzlichen Typen behandelt. 1) Das globale Objekt ist ein Fenster im Browser und global in node.js. 2) Node.js 'eindeutiges Pufferobjekt, das zur Verarbeitung von Binärdaten verwendet wird. 3) Es gibt auch Unterschiede in der Leistung und Zeitverarbeitung, und der Code muss entsprechend der Umgebung angepasst werden.

JavaScript -Kommentare: Eine Anleitung zur Verwendung // und / * * /JavaScript -Kommentare: Eine Anleitung zur Verwendung // und / * * /May 13, 2025 pm 03:49 PM

JavaScriptUSESTWOTYPESOFCOMMENMENTEN: Einzelzeilen (//) und Multi-Linie (//). 1) Verwendung // Forquicknotesorsingle-Linexplanationen.2 Verwendung // ForlongerExPlanationsCompomentingingoutblocks-

Python gegen JavaScript: Eine vergleichende Analyse für EntwicklerPython gegen JavaScript: Eine vergleichende Analyse für EntwicklerMay 09, 2025 am 12:22 AM

Der Hauptunterschied zwischen Python und JavaScript sind die Typ -System- und Anwendungsszenarien. 1. Python verwendet dynamische Typen, die für wissenschaftliche Computer- und Datenanalysen geeignet sind. 2. JavaScript nimmt schwache Typen an und wird in Front-End- und Full-Stack-Entwicklung weit verbreitet. Die beiden haben ihre eigenen Vorteile bei der asynchronen Programmierung und Leistungsoptimierung und sollten bei der Auswahl gemäß den Projektanforderungen entschieden werden.

Python vs. JavaScript: Auswählen des richtigen Tools für den JobPython vs. JavaScript: Auswählen des richtigen Tools für den JobMay 08, 2025 am 12:10 AM

Ob die Auswahl von Python oder JavaScript vom Projekttyp abhängt: 1) Wählen Sie Python für Datenwissenschafts- und Automatisierungsaufgaben aus; 2) Wählen Sie JavaScript für die Entwicklung von Front-End- und Full-Stack-Entwicklung. Python ist für seine leistungsstarke Bibliothek in der Datenverarbeitung und -automatisierung bevorzugt, während JavaScript für seine Vorteile in Bezug auf Webinteraktion und Full-Stack-Entwicklung unverzichtbar ist.

Python und JavaScript: Verständnis der Stärken der einzelnenPython und JavaScript: Verständnis der Stärken der einzelnenMay 06, 2025 am 12:15 AM

Python und JavaScript haben jeweils ihre eigenen Vorteile, und die Wahl hängt von den Projektbedürfnissen und persönlichen Vorlieben ab. 1. Python ist leicht zu erlernen, mit prägnanter Syntax, die für Datenwissenschaft und Back-End-Entwicklung geeignet ist, aber eine langsame Ausführungsgeschwindigkeit hat. 2. JavaScript ist überall in der Front-End-Entwicklung und verfügt über starke asynchrone Programmierfunktionen. Node.js macht es für die Entwicklung der Vollstapel geeignet, die Syntax kann jedoch komplex und fehleranfällig sein.

JavaScripts Kern: Ist es auf C oder C aufgebaut?JavaScripts Kern: Ist es auf C oder C aufgebaut?May 05, 2025 am 12:07 AM

JavaScriptisnotbuiltoncorc; Es ist angehört, dass sich JavaScriptWasdedeSthatrunsonGineoFtencninc.

JavaScript-Anwendungen: Von Front-End bis Back-EndJavaScript-Anwendungen: Von Front-End bis Back-EndMay 04, 2025 am 12:12 AM

JavaScript kann für die Entwicklung von Front-End- und Back-End-Entwicklung verwendet werden. Das Front-End verbessert die Benutzererfahrung durch DOM-Operationen, und die Back-End-Serveraufgaben über node.js. 1. Beispiel für Front-End: Ändern Sie den Inhalt des Webseitentextes. 2. Backend Beispiel: Erstellen Sie einen Node.js -Server.

Python vs. JavaScript: Welche Sprache sollten Sie lernen?Python vs. JavaScript: Welche Sprache sollten Sie lernen?May 03, 2025 am 12:10 AM

Die Auswahl von Python oder JavaScript sollte auf Karriereentwicklung, Lernkurve und Ökosystem beruhen: 1) Karriereentwicklung: Python ist für die Entwicklung von Datenwissenschaften und Back-End-Entwicklung geeignet, während JavaScript für die Entwicklung von Front-End- und Full-Stack-Entwicklung geeignet ist. 2) Lernkurve: Die Python -Syntax ist prägnant und für Anfänger geeignet; Die JavaScript -Syntax ist flexibel. 3) Ökosystem: Python hat reichhaltige wissenschaftliche Computerbibliotheken und JavaScript hat ein leistungsstarkes Front-End-Framework.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Nordhold: Fusionssystem, erklärt
4 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
Mandragora: Flüstern des Hexenbaum
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

SublimeText3 Englische Version

SublimeText3 Englische Version

Empfohlen: Win-Version, unterstützt Code-Eingabeaufforderungen!

EditPlus chinesische Crack-Version

EditPlus chinesische Crack-Version

Geringe Größe, Syntaxhervorhebung, unterstützt keine Code-Eingabeaufforderungsfunktion

VSCode Windows 64-Bit-Download

VSCode Windows 64-Bit-Download

Ein kostenloser und leistungsstarker IDE-Editor von Microsoft

Dreamweaver Mac

Dreamweaver Mac

Visuelle Webentwicklungstools

Herunterladen der Mac-Version des Atom-Editors

Herunterladen der Mac-Version des Atom-Editors

Der beliebteste Open-Source-Editor