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에서는 LIKE 및 STARTS_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%"는 적합하지 않습니다.
다음 단계
- 퍼지 검색으로 근사치 일치 찾기에 대해 알아보세요.