검색 색인은 여러 토큰화된 열의 색인을 생성할 수 있으므로 이러한 열에 대한 쿼리를 더욱 효율적으로 수행할 수 있습니다. 이 페이지에서는 전체 텍스트 검색 유형인 여러 열에서 검색을 수행하는 방법을 설명합니다.
다중 열 검색 수행
검색 색인의 구조는 쿼리에 분산 조인이 필요하지 않도록 하여 쿼리의 성능을 예측할 수 있도록 합니다. 동일한 분할의 기본 테이블 행에 해당하는 모든 토큰의 코로케이션으로 인해 분산 조인이 방지됩니다.
예를 들어 다음 스키마를 가정해 보세요.
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);
이제 쿼리로 두 필드를 모두 검색할 수 있습니다.
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, @p1) AND SEARCH(Studio_Tokens, @p2)
Spanner는 WHERE
절의 논리곱, 논리합, 부정 연산자에 다중 열 검색 쿼리를 지원합니다. 검색 색인과 함께 다음 유형의 쿼리를 모두 사용할 수 있습니다.
논리곱:
Title
에 'car'라는 용어가 있고Studio
에 'sun'이라는 용어가 있는 문서를 찾습니다.SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, 'car') AND SEARCH(Studio_Tokens, 'sun')
논리합:
Title
에 'car'라는 용어가 있거나Studio
에 'sun'이라는 용어가 있는 문서를 찾습니다.SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun')
부정:
Title
에 'car'라는 용어가 포함되지 않은 모든 문서를 찾습니다.SELECT AlbumId FROM Albums WHERE NOT SEARCH(Title_Tokens, 'car')
rquery 언어도 동일한 유형의 검색을 수행할 수 있습니다.
SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, '-car')
두 양식 모두
Title
이 NULL인 문서를 필터링합니다. 토큰화 및 검색 함수는 NULL 입력에서 NULL을 반환하도록 정의됩니다. SQL은 NOT NULL을 NULL로 정의합니다.
또한 동일한 TOKENLIST
열을 여러 번 참조할 수 있습니다.
SELECT AlbumId
FROM Albums
WHERE (SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun'))
AND (SEARCH(Title_Tokens, 'guy') OR SEARCH(Studio_Tokens, electric))
rquery 언어 또는 SQL을 사용하여 동일한 열에서 여러 용어를 검색합니다. 파라미터화된 쿼리에 대한 효율적인 쿼리 캐싱으로 인해 rquery를 사용하는 것이 좋습니다. 더 나은 쿼리 캐시 적중률 외에는 rquery와 SQL 언어의 지연 시간과 성능 비율이 동일합니다.
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')
전체 텍스트 검색 함수와 함께 검색 색인으로 가속된 비텍스트 조건을 사용할 수 있습니다.
다음 단계
- 전체 텍스트 검색어 알아보기
- 검색 결과 순위 지정 방법 알아보기
- 하위 문자열 검색 수행 방법 알아보기
- 검색결과를 페이지로 나누는 방법 알아보기
- 전체 텍스트 및 비텍스트 쿼리 혼합 방법 알아보기