패턴 일치 표현식 가속화

Spanner 검색 색인LIKE, STARTS_WITH, ENDS_WITH과 같은 패턴 일치 표현식과 정규 표현식 일치 조건자 REGEXP_CONTAINS의 속도를 높일 수 있습니다. 이 페이지에서는 TOKENIZE_NGRAMS를 사용하여 패턴 일치 술어를 가속화하는 검색 색인을 만들고 구성하는 방법을 설명합니다.

패턴 일치 가속을 위해 n-gram TOKENLIST 구성

패턴 일치 표현식 가속을 사용 설정하려면 소문자 STRING 열을 TOKENIZE_NGRAMS로 토큰화하고 GoogleSQL의 STORING 절 또는 PostgreSQL의 INCLUDE 절을 사용하여 STRING 열을 저장합니다.

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);

패턴 일치 조건자를 사용한 쿼리의 자동 가속화

쿼리 최적화 도구는 AlbumTitle_Ngram_Tokens와 함께 AlbumsIndex를 사용하여 다음 쿼리를 가속화할 수 있습니다. 선택적으로 쿼리는 옵티마이저가 AlbumsIndex를 사용하도록 강제하기 위해 @{force_index = AlbumsIndex}를 제공할 수 있습니다.

GoogleSQL

GoogleSQL에서는 LIKE, STARTS_WITH, ENDS_WITH, REGEXP_CONTAINS이 가속화됩니다.

  • LIKE 조건자:

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

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

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

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

PostgreSQL

PostgreSQL에서는 LIKESTARTS_WITH이 가속화됩니다.

  • LIKE 조건자:

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

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

가속에 관한 기본 요건

Spanner에서 이 가속을 사용 설정하려면 다음 규칙을 충족해야 합니다.

  • 색인은 GoogleSQL의 STORING 절 또는 PostgreSQL의 INCLUDE 절을 사용하여 STRING 열을 저장해야 합니다. 이렇게 하면 검색에서 문서를 과도하게 가져올 때 성능에 중요한 사후 필터링 중에 비용이 많이 드는 기본 테이블로의 백 조인이 방지됩니다.
  • STRING 열은 TOKENIZE_NGRAMS를 사용하여 토큰화해야 합니다.
  • 토큰화는 column_name이 아닌 LOWER(column_name)에 적용해야 합니다.
  • LIKE 패턴, STARTS_WITH 접두사, ENDS_WITH 접미사 또는 REGEXP_CONTAINS 정규 표현식은 상수 리터럴로 지정해야 합니다. 너무 짧은 패턴에서 가속을 방지하기 위해 쿼리 매개변수는 지원되지 않습니다.
  • LIKE 패턴, STARTS_WITH 접두사, ENDS_WITH 접미사 또는 REGEXP_CONTAINS 정규 표현식에는 하나 이상의 n-gram에 충분한 텍스트가 포함되어야 합니다. 예를 들어 r".*"는 일치하는 문자 시퀀스가 없으므로 적합하지 않습니다. 마찬가지로 ngram 최소 크기가 3으로 설정된 경우 "ab" (크기 2)이 너무 짧기 때문에 LIKE 술어 "%ab%"는 적합하지 않습니다.

다음 단계