Auf dieser Seite werden die Funktion SEARCH
und der erweiterte Abfragemodus beschrieben, mit denen Volltextabfragen in Spanner-Tabellen ausgeführt werden.
Suchindex abfragen
Spanner bietet die Funktion SEARCH
für Suchindexabfragen. Ein Anwendungsfall wäre eine Anwendung, in der Nutzer Text in ein Suchfeld eingeben und die Anwendung die Nutzereingabe direkt an die SEARCH
-Funktion sendet. Die Funktion „SUCHE“ verwendet dann einen Suchindex, um diesen Text zu finden.
Für die Funktion SEARCH
sind zwei Argumente erforderlich:
- Name eines Suchindexes
- Suchanfrage
Die Funktion SEARCH
funktioniert nur, wenn ein Suchindex definiert ist. Die Funktion SEARCH
kann mit beliebigen SQL-Konstrukten wie Filtern, Aggregationen oder Joins kombiniert werden.
Die Funktion SEARCH
kann nicht mit Transaktionsabfragen verwendet werden.
In der folgenden Abfrage wird die Funktion SEARCH
verwendet, um alle Alben zurückzugeben, deren Titel entweder friday
oder monday
enthält:
SELECT AlbumId
FROM Albums
WHERE SEARCH(AlbumTitle_Tokens, 'friday OR monday')
Suchanfrage
Für die Suchanfrage wird standardmäßig die Syntax für unbearbeitete Suchanfragen verwendet. Mit dem Argument dialect
können alternative Syntaxen angegeben werden.
Rquery-Dialekt
Der Standarddialekt ist raw search query. Spanner verwendet eine domainspezifische Sprache (DSL) namens rquery.
Die RQuery-Sprache folgt denselben Regeln wie der Tokenisierer für Nur-Text, wenn die Eingabesuchanfrage in einzelne Begriffe unterteilt wird. Dazu gehört auch die Segmentierung nach asiatischen Sprachen.
Informationen zur Verwendung von rquery finden Sie unter Syntax von rquery.
words dialect
Der Words-Dialekt ist ähnlich wie rquery, aber einfacher. Es werden keine speziellen Operatoren verwendet. Beispielsweise wird OR
als Suchbegriff und nicht als Disjunktionsoperator behandelt. Die doppelten Anführungszeichen werden als Satzzeichen und nicht als Wortgruppe behandelt und ignoriert.
Bei den Wörtern „Dialekt“ wird AND
implizit auf alle Begriffe angewendet und ist beim Abgleich erforderlich. Er folgt denselben Regeln wie der Tokenizer für Nur-Text, wenn die Eingabesuchanfrage in Begriffe unterteilt wird.
Informationen zur Verwendung des Dialekts „words“ finden Sie unter Syntax von „words“.
words_phrase dialect
Beim Dialekt „words_phrase“ werden keine speziellen Operatoren verwendet und alle Begriffe werden als Wortgruppe behandelt. Das bedeutet, dass die Begriffe nebeneinander und in der angegebenen Reihenfolge stehen müssen.
Wie bei „rquery“ werden beim Aufteilen der eingegebenen Suchanfrage in Begriffe dieselben Regeln wie beim Tokenisieren von Nur-Text angewendet.
Informationen zur Verwendung des Dialekts „words_phrase“ finden Sie unter Syntax für Wortgruppen.
Modus für erweiterte Abfragen
Spanner bietet zwei Volltextsuchmodi: eine grundlegende tokenbasierte Suche und einen erweiterten Modus namens enhance_query
. Wenn diese Option aktiviert ist, wird die Suchanfrage um ähnliche Begriffe und Synonyme erweitert. So steigt die Wahrscheinlichkeit, relevante Ergebnisse zu finden.enhance_query
Wenn Sie diese Option aktivieren möchten, legen Sie das optionale Argument enhance_query=>true
in der Funktion SEARCH
fest. Die Suchanfrage hotl cal
stimmt beispielsweise mit dem Album Hotel California
überein.
SELECT AlbumId
FROM Albums
WHERE SEARCH(AlbumTitle_Tokens, 'hotl cal', enhance_query=>true)
Der Modus enhance_query
ist eine Option für die Abfragezeit. Die Tokenisierung ist davon nicht betroffen.
Sie können denselben Suchindex mit oder ohne enhance_query
verwenden.
Google verbessert die Algorithmen für die Abfrageoptimierung kontinuierlich. Daher können Abfragen mit enhance_query == true
im Laufe der Zeit leicht unterschiedliche Ergebnisse liefern.
Wenn der enhance_query
-Modus aktiviert ist, erhöht sich möglicherweise die Anzahl der Begriffe, nach denen die SEARCH
-Funktion sucht. Dies kann die Latenz leicht erhöhen.
Bei der folgenden Abfrage wird beispielsweise eine Zeitüberschreitung von drei Sekunden verwendet und sie schlägt fehl, wenn enhance_query
nicht verfügbar ist:
@{require_enhance_query=true, enhance_query_timeout_ms=3000}
SELECT AlbumId
FROM Albums
WHERE SEARCH(AlbumTitle_Tokens, 'fast car', enhance_query=>true)
Weitere Informationen zur Verwendung der Option enhance_query
finden Sie unter SUCHE-Funktion.
Anforderungen an SQL-Abfragen
Damit ein Suchindex verwendet werden kann, müssen mehrere Bedingungen für eine SQL-Abfrage erfüllt sein. Wenn diese Bedingungen nicht erfüllt sind, wird für die Abfrage entweder ein alternativer Abfrageplan verwendet oder sie schlägt fehl, wenn kein alternativer Plan vorhanden ist.
Abfragen müssen die folgenden Bedingungen erfüllen:
Für die Funktionen
SEARCH
undSEARCH_SUBSTRING
ist ein Suchindex erforderlich. Spanner unterstützt diese Funktionen nicht in Abfragen an die Basistabelle oder sekundäre Indexe.Bei partitionierten Indexen müssen alle Partitionsspalten in der
WHERE
-Klausel der Abfrage durch eine Gleichheitsbedingung gebunden sein.Wenn ein Suchindex beispielsweise als
PARTITION BY x, y
definiert ist, muss die Abfrage in derWHERE
-Klausel vonx = <parameter or constant> AND y = <parameter or constant>
eine Konjunktion enthalten. Dieser Suchindex wird von der Abfrageoptimierung nicht berücksichtigt, wenn eine solche Bedingung fehlt.Alle
TOKENLIST
-Spalten, auf die überSEARCH
- undSEARCH_SUBSTRING
-Operatoren verwiesen wird, müssen im selben Suchindex indexiert werden.Betrachten Sie beispielsweise die folgende Tabellen- und Indexdefinition:
CREATE TABLE Albums ( AlbumId STRING(MAX) NOT NULL, AlbumTitle STRING(MAX), AlbumStudio STRING(MAX), AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN, AlbumStudio_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumStudio)) HIDDEN ) PRIMARY KEY(AlbumId); CREATE SEARCH INDEX AlbumsTitleIndex ON Albums(AlbumTitle_Tokens); CREATE SEARCH INDEX AlbumsStudioIndex ON Albums(AlbumStudio_Tokens);
Die folgende Abfrage schlägt fehl, da es keinen einzelnen Suchindex gibt, der sowohl
AlbumTitle_Tokens
als auchAlbumStudio_Tokens
indexiert:SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, @p1) AND SEARCH(AlbumStudio_Tokens, @p2)
Wenn die Sortierreihenfolgenspalte nullable ist, müssen sowohl das Schema als auch die Abfrage Zeilen ausschließen, in denen die Sortierreihenfolgenspalte NULL ist. Weitere Informationen finden Sie unter Sortierreihenfolge des Suchindexes.
Wenn der Suchindex NULL-gefiltert ist, muss die Abfrage denselben NULL-Filterausdruck enthalten, der in einem Index verwendet wird. Weitere Informationen finden Sie unter Suchindexe mit NULL-Filter.
Suchindexe und Suchfunktionen werden in DML, partitionierter DML oder partitionierten Abfragen nicht unterstützt.
Suchindizes und Suchfunktionen werden in der Regel in schreibgeschützten Transaktionen verwendet. Wenn die Anwendungsanforderungen veraltete Ergebnisse zulassen, können Sie die Latenz möglicherweise verbessern, indem Sie Suchanfragen mit einer Gültigkeitsdauer von mindestens 10 Sekunden ausführen. Weitere Informationen finden Sie unter Veraltete Daten lesen. Das ist besonders nützlich für Suchanfragen, die sich auf viele Indexaufteilungen verteilen.
Suchindexe und Suchfunktionen werden in Lese-/Schreibtransaktionen nicht empfohlen. Während der Ausführung sperren Suchanfragen eine gesamte Indexpartition. Daher kann eine hohe Rate von Suchanfragen in Lese-/Schreibtransaktionen zu Sperrkonflikten führen, die zu Latenzspitzen führen. Standardmäßig werden Suchindizes in Lese-Schreib-Transaktionen nicht automatisch ausgewählt. Wenn für eine Abfrage in einer Lese-Schreib-Transaktion ein Suchindex erzwungen wird, schlägt sie standardmäßig fehl. Außerdem schlägt die Abfrage fehl, wenn sie eine der Suchfunktionen enthält. Dieses Verhalten kann mit dem Hinweis
@{ALLOW_SEARCH_INDEXES_IN_TRANSACTION=TRUE}
auf Anweisungsebene überschrieben werden. Bei Abfragen kommt es jedoch weiterhin häufig zu Sperrkonflikten.
Sobald die Indexanforderungen erfüllt sind, versucht der Abfrageoptimierer, Abfragebedingungen ohne Text (z. B. Rating > 4
) zu beschleunigen. Wenn der Suchindex die entsprechende TOKENLIST
-Spalte nicht enthält, wird die Bedingung nicht beschleunigt und bleibt eine Restbedingung.
Abfrageparameter
Suchanfrageargumente werden entweder als Literal oder als Abfrageparameter angegeben. Wir empfehlen, Suchparameter für die Volltextsuche anstelle von Stringliteralen zu verwenden, wenn Argumente den Wert eines Suchparameters zulassen.
Indexauswahl
Spanner wählt in der Regel mithilfe der kostenbasierten Modellierung den effizientesten Index für eine Abfrage aus. Der FORCE_INDEX
-Hinweis weist Spanner jedoch ausdrücklich an, einen bestimmten Suchindex zu verwenden. Im folgenden Beispiel wird beispielsweise gezeigt, wie Sie Spanner dazu zwingen, die AlbumsIndex
zu verwenden:
SELECT AlbumId
FROM Albums @{FORCE_INDEX=AlbumsIndex}
WHERE SEARCH(AlbumTitle_Tokens, "fifth symphony")
Wenn der angegebene Suchindex nicht infrage kommt, schlägt die Abfrage fehl, auch wenn andere infrage kommende Suchindexe vorhanden sind.
Snippets in Suchergebnissen
Ein Snippet ist ein Textauszug aus einem bestimmten String, der Nutzern einen Eindruck davon vermittelt, was ein Suchergebnis enthält und warum es für ihre Suchanfrage relevant ist.
In Gmail werden beispielsweise Snippets verwendet, um den Teil einer E-Mail anzugeben, der mit der Suchanfrage übereinstimmt:
Das Generieren eines Snippets durch die Datenbank bietet mehrere Vorteile:
- Komfort: Sie müssen keine Logik implementieren, um Snippets aus einer Suchanfrage zu generieren.
- Effizienz: Mit Snippets wird die Ausgabegröße vom Server reduziert.
Mit der Funktion SNIPPET
wird das Snippet erstellt. Sie gibt den relevanten Teil des ursprünglichen Stringwerts zusammen mit den Positionen der zu markierenden Zeichen zurück. Der Kunde kann dann auswählen, wie das Snippet für den Endnutzer angezeigt werden soll, z. B. mit hervorgehobenem oder fett formatiertem Text. Mit der Funktion SNIPPET
werden alle HTML-Tags aus dem ursprünglichen String entfernt.
Im folgenden Beispiel wird beispielsweise SNIPPET
verwendet, um Text aus AlbumTitle
abzurufen:
SELECT AlbumId, SNIPPET(AlbumTitle, "Fast Car")
FROM Albums
WHERE SEARCH(AlbumTitle_Tokens, "Fast Car")
Nächste Schritte
- Weitere Informationen zum Ranking von Suchergebnissen
- Weitere Informationen zur Teilstringsuche
- Weitere Informationen zur Paginierung von Suchergebnissen
- Weitere Informationen zum Kombinieren von Volltext- und Nicht-Textabfragen
- Weitere Informationen zur Suche in mehreren Spalten