검색 색인에서 여러 열 검색

검색 색인은 여러 토큰화된 열의 색인을 생성할 수 있으므로 이러한 열에 대한 쿼리를 더욱 효율적으로 수행할 수 있습니다. 이 페이지에서는 전체 텍스트 검색 유형인 여러 열에서 검색을 수행하는 방법을 설명합니다.

검색 색인의 구조는 쿼리에 분산 조인이 필요하지 않도록 하여 쿼리의 성능을 예측할 수 있도록 합니다. 동일한 분할의 기본 테이블 행에 해당하는 모든 토큰의 코로케이션으로 인해 분산 조인이 방지됩니다.

예를 들어 다음 스키마를 가정해 보세요.

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, "fifth symphony")
  AND SEARCH(Studio_Tokens, "Blue Note Studio")

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

전체 텍스트 검색 함수와 함께 검색 색인으로 가속된 비텍스트 조건을 사용할 수 있습니다.

다음 단계