검색 색인은 여러 토큰화된 열의 색인을 생성할 수 있으므로 이러한 열에 대한 쿼리를 더욱 효율적으로 수행할 수 있습니다. 이 페이지에서는 전체 텍스트 검색의 한 유형인 여러 열에서 검색을 수행하는 방법을 설명합니다.
다중 열 검색 수행
검색 색인 구조는 쿼리에 분산 조인이 필요하지 않도록 하여 쿼리의 예측 가능한 성능을 보장합니다. 같은 분할의 기본 테이블 행에 해당하는 모든 토큰이 함께 배치되므로 분산 조인이 방지됩니다.
예를 들어 다음 스키마를 가정해 보세요.
GoogleSQL
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
Title STRING(MAX),
Studio STRING(MAX),
Title_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Title)) HIDDEN,
Studio_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Studio)) HIDDEN
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsIndex ON Albums(Title_Tokens, Studio_Tokens);
PostgreSQL
CREATE TABLE albums (
albumid character varying NOT NULL,
title character varying,
studio character varying,
title_tokens spanner.tokenlist
GENERATED ALWAYS AS (TOKENIZE_FULLTEXT(title)) VIRTUAL HIDDEN,
studio_tokens spanner.tokenlist
GENERATED ALWAYS AS (TOKENIZE_FULLTEXT(studio)) VIRTUAL HIDDEN,
) PRIMARY KEY(albumid);
CREATE SEARCH INDEX albumsindex ON albums(title_tokens, studio_tokens);
이제 쿼리에서 Title_Tokens
및 Studio_Tokens
라는 필드 2개를 검색할 수 있습니다.
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, "fifth symphony")
AND SEARCH(Studio_Tokens, "Blue Note Studio")
PostgreSQL
SELECT albumid
FROM albums
WHERE spanner.search(title_tokens, 'fifth symphony')
AND spanner.search(studio_tokens, 'Blue Note Studio')
Spanner는 WHERE
절의 논리곱, 논리합, 부정 연산자에 다중 열 검색 쿼리를 지원합니다. 검색 색인에서는 다음 유형의 쿼리를 모두 사용할 수 있습니다.
논리곱:
Title
에 'car'라는 용어가 있고Studio
에 'sun'이라는 용어가 있는 문서를 찾습니다.GoogleSQL
SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, 'car') AND SEARCH(Studio_Tokens, 'sun')
PostgreSQL
SELECT albumid FROM albums WHERE spanner.search(title_tokens, 'car') AND spanner.search(studio_tokens, 'sun')
논리합:
Title
에 'car'라는 용어가 있거나Studio
에 'sun'이라는 용어가 있는 문서를 찾습니다.GoogleSQL
SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun')
PostgreSQL
SELECT albumid FROM albums WHERE spanner.search(title_tokens, 'car') OR spanner.search(studio_tokens, 'sun')
부정:
Title
에 'car' 용어가 포함되지 않은 모든 문서를 찾습니다.GoogleSQL
SELECT AlbumId FROM Albums WHERE NOT SEARCH(Title_Tokens, 'car')
PostgreSQL
SELECT albumid FROM albums WHERE NOT spanner.search(title_tokens, 'car')
rquery 언어는 다음과 같은 동일한 유형의 검색을 수행할 수 있습니다.
GoogleSQL
SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, '-car')
PostgreSQL
SELECT albumid FROM albums WHERE spanner.search(title_tokens, '-car')
두 양식 모두
Title
이 NULL인 문서를 필터링합니다. 토큰화 및 검색 함수는 NULL 입력 시 NULL을 반환하도록 정의됩니다. SQL은 NOT NULL을 NULL로 정의합니다.
또한 같은 TOKENLIST
열을 여러 번 참조할 수 있습니다.
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE (SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun'))
AND (SEARCH(Title_Tokens, 'guy') OR SEARCH(Studio_Tokens, electric))
PostgreSQL
SELECT albumid
FROM albums
WHERE (spanner.search(title_tokens, 'car') OR spanner.search(studio_tokens, 'sun'))
AND (spanner.search(title_tokens, 'guy') OR spanner.search(studio_tokens, 'electric'))
rquery 언어 또는 SQL을 사용하여 동일한 열에서 여러 용어를 검색합니다. 파라미터화된 쿼리에 대한 효율적인 쿼리 캐싱으로 인해 rquery를 사용하는 것이 좋습니다. 더 나은 쿼리 캐시 적중률 외에는 rquery와 SQL 언어의 지연 시간과 성능 비율이 동일합니다.
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, 'car OR guy')
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, 'car') OR SEARCH(Title_Tokens, 'guy')
PostgreSQL
SELECT albumid
FROM albums
WHERE spanner.search(title_tokens, 'car OR guy')
SELECT albumid
FROM albums
WHERE spanner.search(title_tokens, 'car') OR spanner.search(title_tokens, 'guy')
같은 쿼리에서 전체 텍스트 검색 함수와 함께 검색 색인으로 가속화된 텍스트가 아닌 조건을 사용할 수도 있습니다.
다음 단계
- 전체 텍스트 검색어 알아보기
- 검색 결과 순위 지정 방법 알아보기
- 하위 문자열 검색 수행 방법 알아보기
- 검색결과를 페이지로 나누는 방법 알아보기
- 전체 텍스트 및 비텍스트 쿼리 혼합 방법 알아보기