숫자 색인

텍스트 색인 생성 외에도 검색 색인은 숫자 색인 생성에 대해 효율적인 방법을 제공합니다. 이 기능은 주로 숫자 필드에 대한 조건을 사용해서 전체 텍스트 검색 쿼리를 보강하기 위해 사용됩니다. 이 페이지에서는 숫자 검색 색인을 테이블에 추가하고 배열을 토큰화하는 방법을 설명합니다.

개요

Spanner는 다음 쿼리 작업에 대한 숫자 색인 생성을 지원합니다.

  • 동등성(comparison_type=>"equality")
  • 비동등성(comparison_type=>"all")

두 경우 모두 원래 숫자(정수 또는 부동 소수)에 대해 전체 텍스트 토큰화와 개념적으로 비슷한 토큰화 과정이 진행됩니다. 이 과정에서는 쿼리가 숫자 조건과 일치하는 문서를 찾는 데 사용할 수 있는 토큰 집합이 생성됩니다.

동등성 색인 생성은 숫자를 나타내는 하나의 토큰만 생성합니다. 이 모드는 쿼리의 WHERE 절에 field = @p 형식의 조건만 포함된 경우에 권장됩니다.

비동등성 및 동등성 색인 생성은 쿼리의 WHERE 절에서 다양한 조건을 사용하는 쿼리의 속도를 높일 수 있습니다. 여기에는 동등성 조건 외에도 field < @p, field <= @p, field > @p, field >= @p, field BETWEEN @p1 and @p2, field <> @p가 포함됩니다. 이러한 유형의 색인 생성을 구현하기 위해 Spanner는 기본 검색 색인에 토큰을 생성합니다. Spanner는 조정 매개변수에 따라 각 색인 숫자에 대해 여러 개의 토큰을 생성할 수 있습니다. 토큰 수는 algorithm, min, max, granularity와 같이 TOKENIZE_NUMBER에 대해 설정된 매개변수에 따라 달라집니다. 따라서 디스크 스토리지와 조회 시간 사이에 적절한 균형을 보장하기 위해서는 조정 매개변수를 신중하게 평가하는 것이 중요합니다.

색인 숫자 범위에 대한 알고리즘

TOKENIZE_NUMBER algorithm 인수에는 색인 숫자 범위에 대해 logtree, prefixtree, floatingpoint의 세 가지 옵션이 있습니다. 각 알고리즘은 각각의 데이터 및 쿼리 범위 분포에 따라 특정한 색인 생성 효과를 제공합니다.

  • logtree는 정수가 포함된 균일하게 분포된 열을 색인 생성하는 데 가장 적합합니다. 기본 알고리즘입니다.
  • prefixtree는 기하급수적으로 분포된 데이터를 색인 생성할 때 그리고 쿼리 조건자가 "@param > number" 또는 "@param >= number" 형식(상한 없는 범위)일 때 가장 적합합니다. logtree와 비교할 때 이 알고리즘은 작은 숫자에 대해 더 적은 개수의 색인 토큰을 생성합니다. WHERE 절에 이전에 설명한 조건자가 포함된 쿼리의 경우 prefixtree는 더 적은 수의 쿼리 토큰을 생성하여, 성능 향상에 도움이 될 수 있습니다.
  • floatingpoint는 색인 생성 데이터 및 쿼리에 소수점 자리가 자주 포함되는 경우의 FLOAT64 값 색인 생성에 가장 적합합니다. 다른 알고리즘은 정수만 색인 생성하기 때문에 소수점 범위를 포함하는 쿼리는 일치하지 않는 값을 더 많이 검색할 가능성이 높습니다. 이러한 일치하지 않는 값은 검색 후 필터링이 요구되어 성능에 부정적인 영향을 줍니다. logtreeprefixtree와 비교할 때 이 알고리즘은 훨씬 많은 수의 색인 토큰을 생성하며 더 많은 쿼리 토큰을 생성할 수 있습니다.

base 매개변수는 logtreeprefixtree 알고리즘에서 각 트리 버킷의 너비를 제어합니다. 두 알고리즘 모두 노드 너비가 basedistance_from_leafbase-ary 트리의 노드를 나타내는 토큰을 생성합니다. 이 알고리즘은 prefixtree가 보다 큼 쿼리를 가속화하는 보다 큼 토큰을 위해 트리 노드 일부를 생략한다는 점에서 차이가 있습니다. 선택한 base가 클수록 색인되는 색인 토큰이 줄어듭니다. 하지만 base 값이 클수록 필요한 최대 쿼리 토큰 수가 증가합니다.

[min, max] 범위 외에 있는 숫자는 모드 2개의 버킷으로 색인 생성됩니다. 하나는 min보다 작은 숫자에 대한 버킷이고 다른 하나는 max보다 큰 모든 숫자에 대한 버킷입니다. 그 결과 쿼리로 요청된 범위에 범위 외 숫자도 포함된 경우 상당한 초과 검색(너무 많은 숫자 검색)이 발생할 수 있습니다. 따라서 minmax를 모든 입력 숫자를 포함하는 가능한 한 가장 좁은 범위의 값으로 설정합니다. 모든 토큰화 구성과 마찬가지로 minmax 값을 변경하기 위해서는 숫자 색인을 다시 빌드해야 하기 때문에 열의 최종 도메인을 알 수 없는 경우 증가할 여지를 남겨둬야 합니다. 초과 검색의 문제는 검색 프로세스 종료 시에 버킷에 포함되지 않은 숫자에 대해 모든 잠재적 일치 항목을 검사하기 때문에 정확성에 관한 문제가 아니라 잠재적인 효율성 문제를 나타냅니다.

granularity 인수는 트리 기반 알고리즘에서 색인 생성되기 전 숫자에 적용되는 다운샘플링 속도를 제어합니다. 각 숫자는 토큰화되기 전에 너비가 granularity와 동일한 버킷으로 정렬됩니다. 동일한 granularity 버킷에 있는 모든 숫자는 동일한 토큰을 얻습니다. 즉, 세분성 값이 1 이외의 값으로 설정된 경우 초과 검색이 발생할 수 있습니다. 또한 숫자 값이 약간 변경될 경우에도 해당 토큰을 대부분 다시 색인 생성할 필요가 없습니다. granularity를 1보다 큰 값으로 지정하면 알고리즘이 생성해야 하는 토큰 수가 줄어들지만 base를 늘리는 것에 비해 효과가 크기 않습니다. 따라서 'granularity'는 1로 설정하는 것이 좋습니다.

배열 토큰화

스칼라 값 외에도 TOKENIZE_NUMBER는 숫자 배열의 토큰화를 지원합니다.

TOKENIZE_NUMBERARRAY 열에 사용할 경우 comparison_type=>"equality"를 지정해야 합니다. 범위 쿼리는 숫자 배열에 지원되지 않습니다.

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

CREATE TABLE Albums (
  AlbumId STRING(MAX) NOT NULL,
  Ratings ARRAY<INT64>,
  Ratings_Tokens TOKENLIST
    AS (TOKENIZE_NUMBER(Ratings, comparison_type=>"equality")) HIDDEN,
) PRIMARY KEY(AlbumId);

CREATE SEARCH INDEX AlbumsIndex ON Albums(Grades_Tokens);

다음 쿼리는 평점이 1 또는 2인 모든 앨범을 찾습니다.

SELECT AlbumId
FROM Albums
WHERE ARRAY_CONTAINS_ANY(Ratings, [1, 2])

다음 쿼리는 평점이 1과 5인 앨범을 모두 찾습니다.

SELECT AlbumId
FROM Albums
WHERE ARRAY_CONTAINS_ALL(Ratings, [1, 5])

다음 단계