토큰화

이 페이지에서는 테이블에 토큰화를 추가하는 방법을 설명합니다. 토큰화는 검색 색인에 사용된 토큰을 만들기 위해 필요합니다.

개요

토큰화는 값을 토큰으로 전환하는 프로세스입니다. 문서를 토큰화하기 위해 사용하는 방법에 따라 사용자가 수행할 수 있는 검색의 유형 및 효율성이 결정됩니다.

Spanner는 자연어 텍스트, 하위 문자열, 정확한 텍스트, 숫자, 불리언에 대한 토크나이저를 제공합니다. 데이터베이스 스키마는 열에 필요한 검색 유형과 일치하는 토크나이저를 사용합니다. 토크나이저의 특성은 다음과 같습니다.

  • 각 토크나이저는 문자열 또는 숫자, 추가 옵션의 명명된 인수와 같이 입력을 취하는 SQL 함수입니다.
  • 토크나이저는 TOKENLIST를 출력합니다.

예를 들어 텍스트 문자열 The quick brown fox jumps over the lazy dog[the,quick,brown,fox,jumps,over,the,lazy,dog]로 토큰화됩니다. HTML 문자열 The <b>apple</b> is <i>red</i>[the,apple,is,red]로 토큰화됩니다.

토큰의 특성은 다음과 같습니다.

  • 토큰은 TOKENLIST 데이터 유형을 사용하는 열에 저장됩니다.
  • 각 토큰은 선택적인 연관된 속성 집합과 함께 바이트 시퀀스로 저장됩니다. 예를 들어 전체 텍스트 애플리케이션에서 토큰은 일반적으로 텍스트 문서에서 한 단어입니다.
  • HTML 값을 토큰화할 때 Spanner는 문서 내에서 토큰의 가시도를 나타내는 속성을 생성합니다. Spanner는 이러한 속성을 사용해서 점수를 할당하고, 제목과 같이 더 중요한 단어에 더 높은 점수를 부여합니다.

토크나이저

Spanner는 다음과 같은 토크나이저 함수를 지원합니다.

  • 전체 텍스트 토크나이저(TOKENIZE_FULLTEXT)는 자연어 쿼리에 대해 한 단어로 된 토큰을 생성합니다.

    예시

    두 함수 모두

    TOKENIZE_FULLTEXT("Yellow apple")
    TOKENIZE_FULLTEXT("Yellow &lt;b>apple&lt;/b>", content_type=>"text/html")
    

    동일한 토큰을 생성합니다. [yellow,apple].

  • 하위 문자열 토크나이저(TOKENIZE_SUBSTRING)는 각 단어의 각 N-그램에 대한 토큰을 생성합니다. 이는 텍스트에서 단어의 하위 문자열을 찾기 위해 사용됩니다.

    예시

    TOKENIZE_SUBSTRING("hello world", ngram_size_min=>4, ngram_size_max=>6)
    

    다음 토큰을 생성합니다. [ello,hell,hello,orld,worl,world].

  • N-그램 토크나이저(TOKENIZE_NGRAMS)는 입력으로부터 N-그램을 생성합니다(개별 단어로 분할하지 않음). 이는 정규 표현식 조건자를 가속화하는 데 사용됩니다.

    예시

    다음 함수:

    TOKENIZE_NGRAMS("Big Time", ngram_size_min=>4, ngram_size_max=>4)
    

    다음 토큰을 생성합니다. ["Big ","ig T","g Ti"," Tim", "Time"].

  • 정확한 일치 토크나이저(TOKENTOKENIZE_BOOL)는 해당 열 중 하나에 특정 값이 포함된 행을 찾기 위해 사용됩니다. 예를 들어 제품 카탈로그를 색인화하는 애플리케이션이 특정 브랜드 및 색상의 제품을 검색해야 할 수 있습니다.

    예시

    다음 함수:

    TOKEN("hello")
    TOKEN(["hello", "world"])
    

    각각 [hello][hello,world]에 해당하는 토큰을 생성합니다.

    다음 함수:

    TOKENIZE_BOOL(true)
    

    다음 토큰을 생성합니다. [y].

  • 숫자 토크나이저(TOKENIZE_NUMBER)는 숫자 비교 검색을 가속화하는 토큰 집합을 생성하는 데 사용됩니다. 동일성 조건에서 토큰은 숫자 자체입니다. 범위 조건(예: rating >= 3.5)의 경우 토큰 집합은 더 복잡합니다.

    예시

    다음 함수 문:

    TOKENIZE_NUMBER(42, comparison_type=>"equality")
    TOKENIZE_NUMBER(42, comparison_type=>"all", granularity=>10, min=>1, max=>100)
    

    각각 "==42""==42", "[1,75]","[36, 45]","[36,55]","[36, 75]"에 해당하는 토큰을 생성합니다.

토큰화 함수는 일반적으로 생성된 열 표현식에 사용됩니다. 이러한 열은 HIDDEN으로 정의되므로 SELECT * 쿼리 결과에 포함되지 않습니다.

다음 예시에서는 전체 텍스트 토크나이저와 숫자 토크나이저를 사용해서 음악 앨범 이름과 평점을 저장하는 데이터베이스를 만듭니다. DDL 문은 다음 두 가지를 수행합니다.

  1. 데이터 열 AlbumTitleRating을 정의합니다.
  2. AlbumTitle_TokensAlbumRating_Tokens를 정의합니다. 이러한 TOKENLIST 열은 데이터 열의 값을 토큰화하므로 Spanner가 이를 색인화할 수 있습니다.

    CREATE TABLE Albums (
      AlbumId STRING(MAX) NOT NULL,
      AlbumTitle STRING(MAX),
      Rating FLOAT64,
      AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN,
      Rating_Tokens TOKENLIST AS (TOKENIZE_NUMBER(Rating)) HIDDEN
    ) PRIMARY KEY(AlbumId);
    

기본값이 수정될 때마다 AlbumTitle_TokensRating_Tokens가 자동으로 업데이트됩니다.

일반 텍스트 또는 HTML 콘텐츠 토큰화

텍스트 토큰화는 일반 텍스트 및 HTML 콘텐츠 유형을 지원합니다. Spanner TOKENIZE_FULLTEXT 함수를 사용하여 토큰을 만듭니다. 그런 후 CREATE SEARCH INDEX DDL 문을 사용하여 검색 색인을 생성합니다.

예를 들어 다음 CREATE TABLE DDL 문은 TOKENIZE_FULLTEXT 함수를 사용하여 Albums 테이블의 AlbumTitles에서 토큰을 만듭니다. CREATE SEARCH INDEX DDL 문은 새 AlbumTitles_Tokens로 검색 색인을 만듭니다.

CREATE TABLE Albums (
  AlbumId STRING(MAX) NOT NULL,
  AlbumTitle STRING(MAX),
  AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN
) PRIMARY KEY(AlbumId);

CREATE SEARCH INDEX AlbumsIndex ON Albums(AlbumTitle_Tokens)

토큰화 프로세스에는 다음 규칙이 사용됩니다.

  • 토큰화에는 철자가 잘못된 단어의 어간 추출 또는 교정이 포함되지 않습니다. 예를 들어 "A cat was looking at a group of cats"와 같은 문장에서 "cat" 토큰은 "cats" 토큰과 별개로 색인화됩니다. 쓰기 작업 중 토큰을 정규화하는 다른 검색 엔진과 달리 Spanner는 다른 단어 형태를 포함하도록 검색 쿼리를 확장하는 옵션을 제공합니다. 자세한 내용은 향상된 쿼리 모드를 참조하세요.
  • 검색 제외 단어(예: "a")가 검색 색인에 포함됩니다.
  • 전체 텍스트 검색은 항상 대소문자를 구분하지 않습니다. 토큰화 프로세스는 모든 토큰을 소문자로 변환합니다.

토큰화 프로세스는 원래 텍스트에서 각 토큰의 위치를 추적합니다. 이러한 위치는 나중에 어구 매칭에 사용됩니다. 위치는 docid와 함께 검색 색인에 저장됩니다.

Google은 토큰화 알고리즘을 계속해서 개선하고 있습니다. 따라서 경우에 따라 현재 문자열이 토큰화되는 방법과 이후에 토큰화되는 방법이 달라질 수 있습니다. 이러한 경우는 거의 드물게 발생할 것으로 예상됩니다. 중국어, 일본어, 한국어(CJK) 언어 세분화에서 개선이 있는 경우가 여기에 해당할 수 있습니다.

content_type 인수는 콘텐츠 형식에 일반 텍스트 또는 HTML이 사용되는지 여부를 지정합니다. 다음 설정을 사용하여 content_type을 설정합니다.

  • 텍스트 토큰화의 경우 content_type 인수를 "text/plain"로 설정합니다. 이것이 기본 설정입니다.
  • HTML 토큰화의 경우 content_type 인수를 "text/html"로 설정합니다. 이 인수를 사용하지 않으면 HTML 태그가 구두점으로 취급됩니다. HTML 모드에서 Spanner는 휴리스틱을 이용해서 페이지에서 텍스트의 가시도를 유추합니다. 예를 들어 텍스트가 제목에 있는지 또는 글꼴 크기가 무엇인지 등을 판단합니다. HTML에 지원되는 속성에는 small, medium, large, title, `link'가 포함됩니다. 속성은 위치와 같이 검색 색인에서 토큰과 함께 저장됩니다. 토큰화는 HTML 태그에 대한 토큰을 만들지 않습니다.

토큰 속성은 SEARCH 또는 SEARCH_SUBSTRING 함수의 결과 또는 매칭에 영향을 주지 않습니다. 토큰 속성은 순위 지정에만 사용됩니다.

다음 예시는 텍스트 토큰화 방법을 보여줍니다.

CREATE TABLE T (
  ...
  Text STRING(MAX),
  Html STRING(MAX),
  Text_Tokens TOKENLIST
    AS (TOKENIZE_FULLTEXT(Text, content_type=>"text/plain")) HIDDEN,
  Html_Tokens TOKENLIST
    AS (TOKENIZE_FULLTEXT(Html, content_type=>"text/html")) HIDDEN
) PRIMARY KEY(...);

language_tag 인수로 언어 감지 미세 조정

토큰화는 기본적으로 입력 언어를 자동으로 감지합니다. 입력 언어가 알려져 있으면 language_tag 인수를 사용해서 이러한 동작을 미세 조정할 수 있습니다.

AlbumTitle_Tokens TOKENLIST
  AS (TOKENIZE_FULLTEXT(AlbumTitle, language_tag=>"en-us")) HIDDEN

대부분의 애플리케이션은 language_tag 인수를 지정하지 않은 상태로 두고 대신 자동 언어 감지를 사용합니다. 중국어, 한국어, 일본어와 같은 아시아 언어의 세분화는 토큰화 언어 설정이 필요하지 않습니다.

다음 예시에서는 language_tag가 토큰화에 영향을 주는 사례를 보여줍니다.

토큰화 함수 생성된 토큰
TOKENIZE_FULLTEXT("A tout pourquoi il y a un parce que") [a, tout, pourquoi, il, ya, un, parce, que]
TOKENIZE_FULLTEXT("A tout pourquoi il y a un parce que", \ language_tag=>"fr") [a, tout, pourquoi, il, y, a, un, parce, que]
TOKENIZE_FULLTEXT("旅 行") 토큰 2개: [旅, 行]
TOKENIZE_FULLTEXT("旅 行", language_tag=>"zh") 토큰 1개: [旅行]

다음 단계