Auf dieser Seite wird beschrieben, wie Sie die Abfrageoptimierung im Rahmen einer Volltextsuche verwenden.
Um die Wahrscheinlichkeit zu erhöhen, dass relevante Ergebnisse gefunden werden, bietet Spanner erweiterte Funktionen, mit denen die Suchanfrage um verwandte Begriffe, Synonyme und Rechtschreibkorrekturen erweitert wird. Spanner bietet die folgenden Optionen zur Optimierung von Abfragen:
Erweiterte Abfrage
Wenn Sie die erweiterte Abfrage verwenden möchten, legen Sie enhance_query=>true in der Funktion SEARCH fest. Spanner erweitert Suchanfragen dann automatisch, indem verwandte Begriffe und Synonyme einbezogen, Wortstämme angewendet und Rechtschreibfehler korrigiert werden. Wenn Sie beispielsweise die erweiterte Abfrage verwenden, entspricht die Suchanfrage hotl cal dem Album Hotel California.
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE SEARCH(AlbumTitle_Tokens, 'hotl cal', enhance_query=>true)
PostgreSQL
SELECT albumid
FROM albums
WHERE spanner.search(albumtitle_tokens, 'hotl cal', enhance_query=>true)
enhance_query ist eine Option für die Abfragezeit, die sich nicht auf die Tokenisierung auswirkt.
Sie können denselben Suchindex mit oder ohne enhance_query verwenden.
Google arbeitet kontinuierlich an der Verbesserung der Algorithmen zur Optimierung von Anfragen. Daher kann eine Abfrage mit enhance_query => true im Laufe der Zeit zu leicht unterschiedlichen Ergebnissen führen.
Wenn enhance_query verwendet wird, kann sich die Latenz aufgrund des Mehraufwands für die Erweiterung der Suchanfrage und die Ausführung der resultierenden größeren Anfrage erhöhen.
Benutzerdefinierte Wörterbücher
Sie können benutzerdefinierte Wörterbücher für die Spanner-Volltextsuche verwenden, um Synonyme für Begriffe in Ihrem Dataset zu definieren. Das ist nützlich, um Synonyme, Akronyme, gleichwertige Begriffe und andere Wortvariationen zu erfassen und so die Abfrage von Suchergebnissen zu verbessern.
Benutzerdefinierte Wörterbuchtabelle erstellen
Ein benutzerdefiniertes Wörterbuch ist eine vom Nutzer erstellte Tabelle mit Schlüssel/Wert-Paaren aus Begriffen und ihren Synonymen. Fügen Sie zum Erstellen einer solchen die Option fulltext_dictionary_table = true in die Anweisung CREATE TABLE ein. Die Tabelle muss zwei Spalten enthalten:
Key: Eine Stringspalte, die nicht null sein darf, für den Begriff, der mit Synonymen erweitert werden soll.Value: Eine Spalte mit einem nicht leeren Array von Strings für ein Array von Synonymen für den Schlüssel.
Die Tabelle darf keine anderen Spalten als Key und Value enthalten.
Wenn ein Suchbegriff mit einem Key im Wörterbuch übereinstimmt, wird die Suche so erweitert, dass sie alle entsprechenden Synonyme in Value sowie den Schlüsselbegriff selbst umfasst.
Im folgenden Beispiel wird eine benutzerdefinierte Wörterbuchtabellen mit dem Namen MyCustomDictionary erstellt. Außerdem müssen Sie beim Erstellen dieser Tabelle die Tabellenoption fulltext_dictionary_table=true festlegen.
GoogleSQL
CREATE TABLE MyCustomDictionary (
Key STRING(MAX) NOT NULL,
Value ARRAY<STRING(MAX)> NOT NULL,
) PRIMARY KEY(Key),
OPTIONS (fulltext_dictionary_table = true);
PostgreSQL
CREATE TABLE mycustomdictionary (
key character varying NOT NULL,
value character varying [] NOT NULL,
PRIMARY KEY(key)
) WITH ( type = 'fulltext_dictionary')
Nachdem Sie die Tabelle erstellt haben, fügen Sie Ihre Synonyme ein:
GoogleSQL
INSERT INTO MyCustomDictionary (Key, Value) VALUES
('album', ['vinyl', 'cassette']),
('edm', ['electronic dance music']);
PostgreSQL
INSERT INTO mycustomdictionary (key, value) VALUES
('album', ARRAY['vinyl', 'cassette']),
('edm', ARRAY['electronic dance music']);
Beachten Sie beim Ausfüllen der Tabelle Folgendes:
- Schlüssel müssen einzelne Wörter sein.
- Werte können einzelne Wörter oder Wortgruppen sein. Wenn ein Wert mehrere Wörter enthält, wird er bei der Suchanfragenerweiterung als Wortgruppe behandelt.
- Alle Schlüssel und Werte sollten in Kleinbuchstaben geschrieben werden. So wird sichergestellt, dass sie mit Such-Tokens übereinstimmen, die vom Standard-Tokenizer in Kleinbuchstaben umgewandelt werden.
Die Sucherweiterung erfolgt nur, wenn ein Suchbegriff mit einem Key übereinstimmt. Wenn ein Suchbegriff mit einem Synonym in Value, aber nicht mit einem Key übereinstimmt, wird die Suche nicht erweitert. Wenn Sie eine bidirektionale Zuordnung benötigen, damit beispielsweise bei der Suche nach vinyl oder cassette auch album gefunden wird, müssen Sie auch umgekehrte Zuordnungen in die Dictionary-Tabelle einfügen. Im folgenden Beispiel wird gezeigt, wie bidirektionale Zuordnungen für album, vinyl und cassette eingefügt werden:
GoogleSQL
INSERT INTO MyCustomDictionary (Key, Value)
-- 1. Insert album -> vinyl, cassette
SELECT 'album', ['vinyl', 'cassette']
UNION ALL
-- 2. Insert vinyl -> album and cassette -> album
SELECT syn, ['album']
FROM UNNEST(['vinyl', 'cassette']) AS syn;
PostgreSQL
INSERT INTO mycustomdictionary (key, value)
-- 1. Insert album -> vinyl, cassette
SELECT 'album', ARRAY['vinyl', 'cassette']
UNION ALL
-- 2. Insert vinyl -> album and cassette -> album
SELECT syn, ARRAY['album']
FROM unnest(ARRAY['vinyl', 'cassette']) AS syn;
Benutzerdefiniertes Wörterbuch in Suchanfragen verwenden
Wenn Sie ein benutzerdefiniertes Wörterbuch verwenden möchten, geben Sie den Namen der Wörterbuchtabelle im Argument dictionary der Funktion SEARCH an.
Wenn ein Suchbegriff ein Schlüssel im Wörterbuch ist, wird mit
SEARCHauch nach den zugehörigen Werten gesucht. Der Begriffalbumentspricht Nachrichten, dievinylodercassetteenthalten.GoogleSQL
SELECT MessageId, Body FROM Messages WHERE SEARCH(Body_Tokens, 'album', dictionary=>'MyCustomDictionary');PostgreSQL
SELECT messageid, body FROM messages WHERE spanner.search(body_tokens, 'album', dictionary=>'mycustomdictionary');Wenn ein Wörterbuchwert mehrere Wörter enthält, z. B.
electronic dance musicfür den Schlüsseledm, wird er als Wortgruppensuche behandelt. Das bedeutet, dass die Begriffe nebeneinander und in der angegebenen Reihenfolge erscheinen müssen, damit sie als Übereinstimmung gelten. Die folgende Abfrage gibt beispielsweise Ergebnisse zurück, die genau die Wortgruppe „electronic dance music“ enthalten, aber nicht mit „dance electronic music“ übereinstimmen. Das ist vor allem nützlich, um Akronyme zu erweitern, und kann so verwendet werden:GoogleSQL
SELECT MessageId, Body FROM Messages WHERE SEARCH(Body_Tokens, 'edm', dictionary=>'MyCustomDictionary');PostgreSQL
SELECT messageid, body FROM messages WHERE spanner.search(body_tokens, 'edm', dictionary=>'mycustomdictionary');
Veralterung der Wörterbuchsuche
Standardmäßig werden benutzerdefinierte Wörterbucheinträge mit einer maximalen Veralterung von 15 Sekunden gelesen. Dadurch wird der Overhead des Lesevorgangs reduziert, da das Lesen von Daten mit einer gewissen Veralterung effizienter ist als das Lesen der aktuellsten Daten. Daher kann es bis zu 15 Sekunden dauern, bis Änderungen an Wörterbucheinträgen in Suchanfragen berücksichtigt werden. Sie können dieses Verhalten auf folgende Arten überschreiben:
- Mit der Tabellenoption
fulltext_dictionary_staleness - Verwenden Sie den Abfragehinweis
fulltext_dictionary_stalenessfür eine detailliertere Steuerung.
Der Abfragehinweis hat Vorrang vor der Tabellenoption, wenn beide verwendet werden.
fulltext_dictionary_staleness-Tabellenoption
Sie können die Option fulltext_dictionary_staleness für die Dictionary-Tabelle festlegen. Für alle Abfragen, die diese Dictionary-Tabelle verwenden, wird dieser Aktualitätswert verwendet, sofern er nicht durch den Abfragehinweis überschrieben wird.
GoogleSQL
Im folgenden Beispiel wird gezeigt, wie Sie eine Tabelle mit der Option fulltext_dictionary_staleness CREATE:
CREATE TABLE MyCustomDictionary (
Key STRING(MAX) NOT NULL,
Value ARRAY<STRING(MAX)> NOT NULL,
) PRIMARY KEY(Key),
OPTIONS (
fulltext_dictionary_table = true,
fulltext_dictionary_staleness = '5s'
);
Im folgenden Beispiel sehen Sie, wie Sie die ALTER-Tabelle ändern oder die Option fulltext_dictionary_staleness festlegen:
ALTER TABLE MyCustomDictionary SET OPTIONS (
fulltext_dictionary_staleness = '60s'
);
PostgreSQL
Im folgenden Beispiel wird gezeigt, wie Sie eine Tabelle mit der Option fulltext_dictionary_staleness CREATE:
-- Create with 5s staleness
CREATE TABLE mycustomdictionary (
key character varying NOT NULL,
value character varying[] NOT NULL,
PRIMARY KEY(key)
) WITH (
type = 'fulltext_dictionary',
fulltext_dictionary_staleness = '5s'
);
Die PostgreSQL-Schnittstelle unterstützt die ALTER-Tabelle nicht, um die Option fulltext_dictionary_staleness zu ändern oder festzulegen.
fulltext_dictionary_staleness Suchhinweis
Für eine detailliertere Steuerung können Sie mit dem Abfragehinweis fulltext_dictionary_staleness eine andere Aktualität für eine einzelne Abfrage angeben. Dieser Hinweis überschreibt die Einstellung auf Tabellenebene.
Im folgenden Beispiel wird ein Hinweis verwendet, um Wörterbuchtabellensuchen ohne Veralterung durchzuführen. So wird sichergestellt, dass die aktuellsten Wörterbucheinträge gelesen werden. Dieser Ansatz kann die Abfragelatenz erhöhen, da das Lesen der aktuellen Daten weniger effizient ist als das Zulassen einer gewissen Veralterung.
GoogleSQL
@{fulltext_dictionary_staleness="0s"}
SELECT MessageId, Body
FROM Messages
WHERE SEARCH(Body_Tokens, 'Bill', dictionary=>'MyCustomDictionary');
PostgreSQL
/*@ fulltext_dictionary_staleness='0s' */
SELECT messageid, body
FROM messages
WHERE spanner.search(body_tokens, 'Bill', dictionary=>'mycustomdictionary');
Bekannte Einschränkungen bei benutzerdefinierten Wörterbuchtabelle
- Die Verwendung von Spanner-Import und ‑Export mit benutzerdefinierten Dictionary-Tabellen wird nur eingeschränkt unterstützt.
- Benutzerdefinierte Dictionary-Tabellen müssen im Standardschema erstellt werden und können nicht in benannten Schemas erstellt werden.
- Für benutzerdefinierte Wörterbuchtabellen wird nur der Standarddialekt für SEARCH-Abfragen unterstützt.
Benutzerdefinierte Wörterbücher mit erweiterter Abfrage kombinieren
Sie können Synonyme aus benutzerdefinierten Wörterbüchern mit enhanced query kombinieren, indem Sie sowohl dictionary als auch enhance_query=>true in der Funktion SEARCH festlegen. Bei der Erweiterung von Suchanfragen können häufig verwendete Synonyme oder Rechtschreibkorrekturen hinzugefügt werden. Mit benutzerdefinierten Wörterbüchern lassen sich eigene Erweiterungen definieren. Wenn enhance_query beispielsweise album um record erweitert und MyCustomDictionary album ['vinyl', 'cassette'] zuordnet, werden mit der folgenden Abfrage Nachrichten mit album, record, vinyl oder cassette abgeglichen:
GoogleSQL
SELECT MessageId, Body
FROM Messages
WHERE SEARCH(Body_Tokens, 'album', enhance_query=>true, dictionary=>'MyCustomDictionary');
PostgreSQL
SELECT messageid, body
FROM messages
WHERE spanner.search(body_tokens, 'album', enhance_query=>true, dictionary=>'mycustomdictionary');
Wenn beide Erweiterungen aktiviert sind, werden sie unabhängig voneinander auf die ursprünglichen Suchbegriffe angewendet. Begriffe, die von einer Erweiterung generiert werden, werden nicht als Eingabe für die andere verwendet.
Nächste Schritte
- Weitere Informationen zum Finden von ungefähren Übereinstimmungen mit der unscharfen Suche
- Informationen zum Ranking von Suchergebnissen