전체 텍스트 및 비텍스트 쿼리 혼합

이 페이지에서는 전체 텍스트 및 비텍스트 데이터가 혼합된 검색을 수행하는 방법을 설명합니다.

검색 색인은 전체 텍스트, 일치검색, 숫자 열을 지원합니다. 다중 열 검색 쿼리와 마찬가지로 WHERE 절에서 텍스트 및 비텍스트 조건을 조합할 수 있습니다. 쿼리 옵티마이저는 검색 색인을 사용해서 비텍스트 조건자를 최적화하려고 시도합니다. 이것이 불가능하면 Spanner가 검색 색인과 일치하는 모든 행에 대해 조건을 평가합니다. 검색 색인에 저장되지 않은 참조 열은 기본 테이블에서 가져옵니다.

예를 들어 다음 예시를 살펴보세요.

CREATE TABLE Albums (
  AlbumId STRING(MAX) NOT NULL,
  Title STRING(MAX),
  Rating FLOAT64,
  Genres ARRAY<STRING(MAX)>,
  Likes INT64,
  Cover BYTES(MAX),
  Title_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Title)) HIDDEN,
  Rating_Tokens TOKENLIST AS (TOKENIZE_NUMBER(Rating)) HIDDEN,
  Genres_Tokens TOKENLIST AS (TOKEN(Genres)) HIDDEN
) PRIMARY KEY(AlbumId);

CREATE SEARCH INDEX AlbumsIndex
ON Albums(Title_Tokens, Rating_Tokens, Genres_Tokens)
STORING Likes;

이 테이블의 쿼리 동작에는 다음이 포함됩니다.

  • RatingGenres가 검색 색인에 포함됩니다. Spanner가 검색 색인 게시 목록을 사용하여 조건을 가속화합니다.

    SELECT Album
    FROM Albums
    WHERE Rating > 4
      AND ARRAY_INCLUDES_ANY(Genres, ['jazz'])
    
  • 쿼리는 전체 텍스트 및 비텍스트 조건자 혼합을 포함하여 어떤 방식으로든 결합, 분리, 부정을 조합할 수 있습니다. 이 쿼리는 검색 색인에 의해 완전히 가속됩니다.

    SELECT Album
    FROM Albums
    WHERE (SEARCH(Title_Tokens, 'car')
           OR Rating > 4)
      AND NOT ARRAY_INCLUDES_ANY(Genres, ['jazz'])
    
  • Likes는 색인에 저장되지만 스키마에 따라 Spanner에서 가능한 값에 대한 토큰 색인 빌드가 요청되지 않습니다. 따라서 Title의 전체 텍스트 조건자와 Rating의 비텍스트 조건자가 가속화되지만 Likes의 조건자는 가속화되지 않습니다. Spanner에서 쿼리는 Title에 "car"가 있고 평점이 4보다 높은 모든 문서를 가져온 후 좋아요가 1,000개 미만인 문서를 필터링합니다. 거의 모든 앨범의 제목에 "car"가 있고 거의 대부분 평점이 5이지만 좋아요가 1,000개 있는 앨범이 많지 않으면 이 쿼리에 많은 리소스가 사용됩니다. 이러한 경우 Rating과 비슷하게 Likes를 색인 생성하면 리소스가 절약됩니다.

    SELECT Album
    FROM Albums
    WHERE SEARCH(Title_Tokens, 'car')
      AND Rating > 4
      AND Likes >= 1000
    
  • Cover는 색인에 저장되지 않습니다. 다음 쿼리는 AlbumsIndexAlbums 사이에 백 조인을 수행하여 모든 일치하는 앨범의 Cover를 가져옵니다.

    SELECT AlbumId, Cover
    FROM Albums
    WHERE SEARCH(Title_Tokens, 'car')
      AND Rating > 4
    

다음 단계