Spanner-Suchindexe können Mustervergleichsausdrücke wie LIKE, STARTS_WITH, ENDS_WITH und das Prädikat für den Abgleich regulärer Ausdrücke REGEXP_CONTAINS beschleunigen.
Auf dieser Seite wird beschrieben, wie Sie mit TOKENIZE_NGRAMS einen Suchindex erstellen und konfigurieren, um Mustervergleichsprädikate zu beschleunigen.
N-Gramm TOKENLIST für die Beschleunigung des Musterabgleichs konfigurieren
Um die Beschleunigung von Musterausdrücken zu aktivieren, tokenisieren Sie eine Spalte STRING in Kleinbuchstaben mit TOKENIZE_NGRAMS und speichern Sie die Spalte STRING mit der STORING-Anweisung in GoogleSQL oder der INCLUDE-Anweisung in PostgreSQL.
GoogleSQL
CREATE TABLE Albums (
AlbumId INT64 NOT NULL,
AlbumTitle STRING(MAX),
AlbumTitle_Ngram_Tokens TOKENLIST AS (
TOKENIZE_NGRAMS(LOWER(AlbumTitle), ngram_size_min=>3, ngram_size_max=>4)) HIDDEN,
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsIndex
ON Albums(AlbumTitle_Ngram_Tokens) STORING (AlbumTitle);
PostgreSQL
CREATE TABLE albums (
albumid bigint NOT NULL,
album_title varchar,
album_title_ngrams_tokens spanner.tokenlist GENERATED ALWAYS AS (
spanner.tokenize_ngrams(
lower(album_title),
ngram_size_min => 3,
ngram_size_max => 4
)
) VIRTUAL HIDDEN,
PRIMARY KEY(albumid));
CREATE SEARCH INDEX albumsidx ON
albums(album_title_ngrams_tokens) INCLUDE (album_title);
Automatische Beschleunigung von Abfragen mit Mustern entsprechenden Prädikaten
Der Abfrageoptimierer kann die folgenden Abfragen mit AlbumsIndex und AlbumTitle_Ngram_Tokens beschleunigen. Optional kann die Abfrage @{force_index = AlbumsIndex} enthalten, um den Optimierer zur Verwendung von AlbumsIndex zu zwingen.
GoogleSQL
In GoogleSQL werden LIKE, STARTS_WITH, ENDS_WITH und REGEXP_CONTAINS beschleunigt.
LIKE-Prädikat:SELECT AlbumId FROM Albums @{FORCE_INDEX=AlbumsIndex} WHERE AlbumTitle LIKE "%999%";STARTS_WITH-Prädikat:SELECT AlbumId FROM Albums @{FORCE_INDEX=AlbumsIndex} WHERE STARTS_WITH(AlbumTitle, "apple")ENDS_WITH-Prädikat:SELECT AlbumId FROM Albums @{FORCE_INDEX=AlbumsIndex} WHERE ENDS_WITH(AlbumTitle, "apple")REGEXP_CONTAINS-Prädikat:SELECT AlbumId FROM Albums @{FORCE_INDEX=AlbumsIndex} WHERE REGEXP_CONTAINS(AlbumTitle, r"(good|great)[ ]+morning")
PostgreSQL
In PostgreSQL beschleunigen wir LIKE und STARTS_WITH.
LIKE-Prädikat:SELECT albumid FROM albums /*@ FORCE_INDEX = albumsidx */ WHERE album_title like '%999%';STARTS_WITH-Prädikat:SELECT albumid FROM albums /*@ FORCE_INDEX = albumsidx */ WHERE starts_with(album_title, 'apple')
Voraussetzungen für die Beschleunigung
Damit Spanner diese Beschleunigung ermöglichen kann, müssen die folgenden Regeln erfüllt sein:
- Im Index muss die Spalte
STRINGmit derSTORING-Klausel in GoogleSQL oder derINCLUDE-Klausel in PostgreSQL gespeichert werden. Dadurch werden kostspielige Back-Joins zur Basistabelle während der Nachfilterung vermieden, was für die Leistung entscheidend ist, wenn bei der Suche zu viele Dokumente abgerufen werden. - Die Spalte
STRINGmuss mitTOKENIZE_NGRAMStokenisiert werden. - Die Tokenisierung muss für
LOWER(column_name)und nicht fürcolumn_namegelten. - Das Muster
LIKE, das PräfixSTARTS_WITH, das SuffixENDS_WITHoder der reguläre AusdruckREGEXP_CONTAINSmuss als konstantes Literal angegeben werden. Abfrageparameter werden nicht unterstützt, um eine Beschleunigung bei zu kurzen Mustern zu vermeiden. - Das Muster
LIKE, das PräfixSTARTS_WITH, das SuffixENDS_WITHoder der reguläre AusdruckREGEXP_CONTAINSmuss genügend Text für mindestens ein N-Gramm enthalten.r".*"kommt beispielsweise nicht infrage, da keine Zeichenfolge vorhanden ist, die abgeglichen werden kann. Wenn die Mindestgröße für N-Gramme auf 3 festgelegt ist, kommt das PrädikatLIKE"%ab%"nicht infrage, da"ab"(Größe 2) zu kurz ist.