Mit RUM-Indexen in AlloyDB for PostgreSQL können Sie Volltextsuchanfragen beschleunigen, indem Sie Positions- und Attributinformationen zusammen mit Lexemen im Index speichern.
Sie können die Erweiterung rum aktivieren, um RUM-Indexe zu erstellen und die Relevanzbewertung, die Suche nach Wortgruppen und die zeitstempelbasierte Sortierung zu optimieren.
Hinweis
Zum Erstellen der RUM-Erweiterung benötigen Sie die alloydbsuperuser Datenbankrolle.
Die IAM-Rolle „AlloyDB Admin“ (roles/alloydb.admin)
bietet uneingeschränkte Kontrolle über AlloyDB
Ressourcen, gewährt aber nicht die Datenbankrolle alloydbsuperuser. Zum Erstellen der Erweiterung muss ein Administrator Ihnen die Datenbankrolle alloydbsuperuser explizit gewähren.
Weitere Informationen zum Gewähren von Rollen finden Sie unter IAM-Nutzer oder Dienstkonto zu einem Cluster hinzufügen.
RUM-Erweiterung erstellen
Sie müssen die RUM-Erweiterung einmal pro Datenbank erstellen.
- Stellen Sie mit
psqloder einem anderen Client eine Verbindung zu Ihrer AlloyDB-Datenbank her. Weitere Informationen finden Sie unter Verbindung zu einer Cluster instanz herstellen. Führen Sie den folgenden SQL-Befehl aus, um die Erweiterung zu erstellen:
CREATE EXTENSION IF NOT EXISTS rum;
RUM-Index erstellen
Um Volltextsuchanfragen zu optimieren, erstellen Sie einen RUM-Index für Ihre Daten. RUM bietet mehrere Operatorklassen für verschiedene Anwendungsfälle.
Arten von RUM-Operatorklassen
In der folgenden Tabelle sind die verschiedenen RUM-Operatorklassen und ihre primären Anwendungsfälle zusammengefasst.
| Operatorklasse | Hauptanwendungsfall | Beschränkungen |
|---|---|---|
rum_tsvector_ops |
Standardmäßige Volltextsuche mit Ranking und Suche nach Wortgruppen. | – |
rum_tsvector_hash_ops |
Kleinerer Index und schnellere Updates für die Volltextsuche. | Unterstützt keine Präfixsuche. |
rum_tsvector_addon_ops |
Volltextsuche, sortiert nach einer anderen Spalte. | – |
rum_anyarray_ops |
Suche in Array-Spalten. | – |
rum_<TYPE>_ops |
Indexieren von Skalartypen für distanzbasierte Abfragen. | – |
rum_tsvector_hash_addon_ops |
Hashbasierte Volltextsuche, sortiert nach einer anderen Spalte. | Unterstützt keine Präfixübereinstimmung. |
rum_tsquery_ops |
Indexieren gespeicherter tsquery-Werte für die umgekehrte Suche. |
– |
rum_anyarray_addon_ops |
Arraysuche, sortiert nach einer anderen Spalte. | – |
Index für die einfache Volltextsuche
Verwenden Sie die Operatorklasse rum_tsvector_ops für die Text Search, die schnelle Ranking- und Wortgruppensuchfunktionen erfordert. Diese Operatorklasse speichert die Position jedes Lexems im Index. Im folgenden Beispiel wird eine Tabelle namens documents mit einer Spalte content erstellt.
Erstellen Sie eine Tabelle namens
documents:CREATE TABLE documents ( id SERIAL PRIMARY KEY, title TEXT NOT NULL, content TEXT NOT NULL, published_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() );Füllen Sie die Tabelle
documentsmit Beispieldaten:INSERT INTO documents (title, content) VALUES ('Title', 'This search engine is working as intended');Fügen Sie Ihrer Tabelle eine generierte
tsvector-Spalte hinzu. In dieser Spalte wird automatisch der verarbeitete Text gespeichert und die Abfrageleistung verbessert:ALTER TABLE documents ADD COLUMN search_vector tsvector GENERATED ALWAYS AS (to_tsvector('english', content)) STORED;Erstellen Sie den RUM-Index für die neue Spalte
search_vector:CREATE INDEX idx_docs_rum ON documents USING rum (search_vector rum_tsvector_ops);Fragen Sie die Tabelle mit dem Index ab. Der
<=>Operator berechnet den Relevanz wert oder die Distanz zwischen dem Dokument und der Abfrage direkt aus dem Index, wodurch eine schnelle Sortierung möglich ist:SELECT title, content FROM documents WHERE search_vector @@ to_tsquery('english', 'search <-> engine') ORDER BY search_vector <=> to_tsquery('english', 'search <-> engine');Füllen Sie die Tabelle
documentsmit weiteren Daten:INSERT INTO documents (title, content) VALUES ('Title1', 'English is my primary language.'); INSERT INTO documents (title, content) VALUES ('Title2', 'Google has a great engineering culture');Führen Sie eine Präfixsuchanfrage aus. Dadurch werden Dokumente mit Wörtern gefunden, die mit
engbeginnen , z. B.engineeroderenglish:SELECT title, content FROM documents WHERE search_vector @@ to_tsquery('english', 'eng:*');
Index für optimierte Hashsuche
Verwenden Sie die Operatorklasse rum_tsvector_hash_ops, um die Indexgröße zu reduzieren und die Aktualisierungsgeschwindigkeit zu verbessern. In dieser Klasse wird ein Hash jedes Lexems anstelle des vollständigen Lexems gespeichert. Dieser Ansatz führt zu einem kleineren Index, unterstützt aber keine Präfixsuche. Im folgenden Beispiel wird davon ausgegangen, dass Sie eine Tabelle namens documents mit einer Spalte search_vector haben.
Erstellen Sie den RUM-Index mit der Hash-Operatorklasse:
CREATE INDEX idx_docs_rum_hash ON documents USING rum (search_vector rum_tsvector_hash_ops);Füllen Sie die Tabelle
documentsmit weiteren Daten:INSERT INTO documents (title, content) VALUES ('Title3', 'That person was driving incredibly fast, however the routing was not very efficient');Führen Sie eine Standardabfrage aus:
SELECT * FROM documents WHERE search_vector @@ to_tsquery('english', 'fast & efficient');
Index für nach Zeitstempel sortierte Suche
Verwenden Sie die Operatorklasse rum_tsvector_addon_ops, um Abfragen zu optimieren, die nach Text filtern und nach einem anderen Feld sortieren, z. B. einem Zeitstempel. Bei diesem Muster wird der Wert des zusätzlichen Felds direkt im Index gespeichert, wodurch eine langsame Sortieroperation nach der Suche vermieden wird. Im folgenden Beispiel wird davon ausgegangen, dass Sie eine Tabelle namens documents mit einer Spalte search_vector und einer Spalte published_at haben.
Erstellen Sie einen Index, der den Zeitstempel
published_atenthält:CREATE INDEX idx_docs_rum_timestamp ON documents USING rum (search_vector rum_tsvector_addon_ops, published_at) WITH (attach = 'published_at', to = 'search_vector');Führen Sie eine Abfrage aus, die Dokumente mit dem Wort
enginefindet und sie nach Erscheinungsdatum sortiert. Der Index verarbeitet sowohl die Suche als auch die Sortierung effizient:SELECT title, published_at FROM documents WHERE search_vector @@ to_tsquery('english', 'engine') ORDER BY published_at DESC;
Index für die Arraysuche
Verwenden Sie die Operatorklasse rum_anyarray_ops, um Array-Spalten zu indexieren, z. B. eine Liste von Tags. So können Sie effizient nach Arrays suchen, die sich überschneiden (&&), andere Arrays enthalten
(@>) oder von anderen Arrays enthalten werden (<@). Im folgenden Beispiel wird der Tabelle documents eine Spalte tags hinzugefügt.
Fügen Sie eine Spalte
tagshinzu und füllen Sie sie mit Daten:ALTER TABLE documents ADD COLUMN tags TEXT[]; INSERT INTO documents (title, content, tags) VALUES ( 'Title4', 'Sample Text', ARRAY['ai', 'ml'] );Erstellen Sie den RUM-Index für eine
TEXT[]-Spalte namenstags:CREATE INDEX idx_tags_rum ON documents USING rum (tags rum_anyarray_ops);Führen Sie eine Abfrage aus, um Dokumente zu finden, die entweder
aiodermlin ihren Tags haben:SELECT * FROM documents WHERE tags && '{"ai", "ml"}';
Index für Skalartypen
Verwenden Sie die Operatorklassen rum_<TYPE>_ops, um Spalten mit kontinuierlichen
Werten zu indexieren, z. B. Ganzzahlen, Zeitstempel oder Gleitkommazahlen. Mit diesen Operator
klassen können Sie den <=> Operator verwenden, um die Distanz
zwischen Werten effizient zu berechnen. Im folgenden Beispiel wird davon ausgegangen, dass Sie eine Tabelle namens documents haben.
Fügen Sie der Tabelle
documentseine allgemeine Ganzzahlspalte hinzu, z. B.rating:ALTER TABLE documents ADD COLUMN rating INT; UPDATE documents SET rating = floor(random() * 5 + 1);Erstellen Sie einen RUM-Index für die Spalte
rating:CREATE INDEX idx_rating_rum ON documents USING rum (rating rum_int4_ops);Führen Sie eine Abfrage aus, um Dokumente mit einer
ratingzu finden, die dem Wert 5 am nächsten kommt:SELECT title, rating FROM documents ORDER BY rating <=> 5;
Index für optimierte Hashsuche, sortiert nach Zeitstempel
Verwenden Sie die Operatorklasse rum_tsvector_hash_addon_ops, um die Vorteile eines Hash-Index mit den Sortierfunktionen eines Add-on-Index zu kombinieren. In dieser Klasse wird ein Hash jedes Lexems zusammen mit dem Wert einer zusätzlichen Spalte gespeichert. Diese Konfiguration unterstützt eine effiziente Sortierung nach der zusätzlichen Spalte, aber keine Präfixübereinstimmung. Im folgenden Beispiel wird davon ausgegangen, dass Sie eine Tabelle namens documents mit einer Spalte search_vector und einer Zeitstempelspalte published_at haben.
Erstellen Sie einen RUM-Index, der die Hash-Operatorklasse verwendet und den Zeitstempel
published_atenthält:CREATE INDEX idx_docs_rum_hash_timestamp ON documents USING rum (search_vector rum_tsvector_hash_addon_ops, published_at) WITH (attach = 'published_at', to = 'search_vector');Führen Sie eine Abfrage aus, die Dokumente mit
enginefindet und sie nach Erscheinungsdatum sortiert:SELECT title, published_at FROM documents WHERE search_vector @@ to_tsquery('english', 'engine') ORDER BY published_at DESC;
Index für gespeicherte Abfragen
Verwenden Sie die Operatorklasse rum_tsquery_ops, um tsquery-Werte zu indexieren. So können Sie eine „umgekehrte Suche“ durchführen und ermitteln, welche gespeicherten Abfragen mit einem bestimmten Eingabedokument übereinstimmen. Im folgenden Beispiel wird eine Tabelle namens queries erstellt.
Erstellen Sie eine Tabelle zum Speichern von Abfragen:
CREATE TABLE queries ( query_text tsquery ); INSERT INTO queries (query_text) VALUES (plainto_tsquery('AlloyDB is fast!'));Erstellen Sie einen RUM-Index für die Spalte
query_text:CREATE INDEX idx_queries_rum ON queries USING rum (query_text rum_tsquery_ops);Führen Sie eine Abfrage aus, um gespeicherte Abfragen zu finden, die mit einem Dokument übereinstimmen:
SELECT * FROM queries WHERE to_tsvector('english', 'AlloyDB is fast') @@ query_text;
Index für die Arraysuche, sortiert nach Zeitstempel
Verwenden Sie die Operatorklasse rum_anyarray_addon_ops, um Array-Spalten zusammen mit einer zusätzlichen Spalte für die Sortierung zu indexieren. Im folgenden Beispiel wird davon ausgegangen, dass Sie eine Tabelle namens documents mit einer Spalte tags und einer Zeitstempelspalte published_at haben.
Erstellen Sie einen RUM-Index für die Spalte
tags, der den Zeitstempelpublished_atenthält:CREATE INDEX idx_tags_rum_timestamp ON documents USING rum (tags rum_anyarray_addon_ops, published_at) WITH (attach = 'published_at', to = 'tags');Führen Sie eine Abfrage aus, um Dokumente mit dem Tag
aizu finden, sortiert nach Erscheinungsdatum:SELECT title, published_at FROM documents WHERE tags @> '{"ai"}' ORDER BY published_at DESC;
Nächste Schritte
- Erfahren Sie mehr über Volltextsuche.
- Hybride Vektorähnlichkeits suche ausführen