Musterabgleichsausdrücke beschleunigen

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 STRING mit der STORING-Klausel in GoogleSQL oder der INCLUDE-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 STRING muss mit TOKENIZE_NGRAMS tokenisiert werden.
  • Die Tokenisierung muss für LOWER(column_name) und nicht für column_name gelten.
  • Das Muster LIKE, das Präfix STARTS_WITH, das Suffix ENDS_WITH oder der reguläre Ausdruck REGEXP_CONTAINS muss als konstantes Literal angegeben werden. Abfrageparameter werden nicht unterstützt, um eine Beschleunigung bei zu kurzen Mustern zu vermeiden.
  • Das Muster LIKE, das Präfix STARTS_WITH, das Suffix ENDS_WITH oder der reguläre Ausdruck REGEXP_CONTAINS muss 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ädikat LIKE "%ab%" nicht infrage, da "ab" (Größe 2) zu kurz ist.

Nächste Schritte