האצה של ביטויים להתאמת תבניות

אינדקסים של חיפוש ב-Spanner יכולים להאיץ ביטויים של התאמת תבניות, כמו LIKE,‏ STARTS_WITH,‏ ENDS_WITH ופרדיקט של התאמת ביטויים רגולריים REGEXP_CONTAINS. בדף הזה מוסבר איך ליצור ולהגדיר אינדקס חיפוש באמצעות TOKENIZE_NGRAMS כדי להאיץ את החיפוש של פרדיקטים של התאמת תבניות.

הגדרת n-gram TOKENLIST להאצת התאמת תבניות

כדי להפעיל האצה של ביטויים להתאמת תבניות, צריך ליצור טוקנים בעמודה STRING באותיות קטנות באמצעות TOKENIZE_NGRAMS ולאחסן את העמודה STRING באמצעות פסוקית STORING ב-GoogleSQL או פסוקית INCLUDE ב-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);

האצה אוטומטית של שאילתות עם פרדיקטים של התאמת תבניות

יכול להיות שהכלי לאופטימיזציה של שאילתות יבחר להאיץ את השאילתות הבאות באמצעות AlbumsIndex עם AlbumTitle_Ngram_Tokens. אפשר גם להוסיף לשאילתה את האפשרות @{force_index = AlbumsIndex} כדי לחייב את כלי האופטימיזציה להשתמש ב-AlbumsIndex.

GoogleSQL

ב-GoogleSQL, אנחנו מאיצים את LIKE,‏ STARTS_WITH,‏ ENDS_WITH ו-REGEXP_CONTAINS.

  • LIKE predicate:

    SELECT AlbumId
    FROM Albums @{FORCE_INDEX=AlbumsIndex}
    WHERE AlbumTitle LIKE "%999%";
    
  • STARTS_WITH predicate:

    SELECT AlbumId
    FROM Albums @{FORCE_INDEX=AlbumsIndex}
    WHERE STARTS_WITH(AlbumTitle, "apple")
    
  • ENDS_WITH predicate:

    SELECT AlbumId
    FROM Albums @{FORCE_INDEX=AlbumsIndex}
    WHERE ENDS_WITH(AlbumTitle, "apple")
    
  • REGEXP_CONTAINS predicate:

    SELECT AlbumId
    FROM Albums @{FORCE_INDEX=AlbumsIndex}
    WHERE REGEXP_CONTAINS(AlbumTitle, r"(good|great)[ ]+morning")
    

PostgreSQL

ב-PostgreSQL, אנחנו מאיצים את LIKE ואת STARTS_WITH.

  • LIKE predicate:

    SELECT albumid
    FROM albums /*@ FORCE_INDEX = albumsidx */
    WHERE album_title like '%999%';
    
  • STARTS_WITH predicate:

    SELECT albumid
    FROM albums /*@ FORCE_INDEX = albumsidx */
    WHERE starts_with(album_title, 'apple')
    

דרישות מוקדמות בנוגע להאצה

כדי ש-Spanner יאפשר את ההאצה הזו, הכללים הבאים צריכים להתקיים:

המאמרים הבאים