콘텐츠로 이동

토큰화 규칙


Doris 스토리지 엔진에서 queryString 함수는 전체 텍스트 인덱스를 기반으로 매칭하며, 그 의미는 토큰화 결과와 직접적으로 관련됩니다. Guance의 하위 토크나이저는 Unicode Standard Annex #29의 기본 단어 경계(Default Word Boundaries) 사양을 따라 텍스트를 독립적인 토큰(Token)으로 분할한 후 인덱싱 및 쿼리를 수행합니다.


단어 경계 판단 로직

UAX #29는 일련의 규칙(WB1–WB999)을 통해 인접한 두 문자 사이에 단어 경계가 발생하는지 여부를 판단합니다. 핵심 규칙은 다음과 같습니다.

  • WB5: 문자(ALetter) 사이에는 경계가 발생하지 않습니다. 예: hello는 하나의 토큰으로 간주됩니다.
  • WB6 / WB7: 문자 + 특정 구두점(MidLetter, MidNumLet) + 문자는 경계를 생성하지 않습니다. 예: example.com, handlepongmessage:devops는 하나의 토큰으로 간주됩니다.
  • WB8 / WB9 / WB10: 숫자 간, 문자와 숫자 간에는 경계가 발생하지 않습니다. 예: 32.3에서 32와 3은 숫자 시퀀스로 간주됩니다(.는 MidNumLet으로 숫자 경계를 깨지 않음).
  • WB13a / WB13b: 밑줄(ExtendNumLet)과 문자/숫자 간에는 경계가 발생하지 않습니다. 예: user_name은 하나의 토큰으로 간주됩니다.
  • WB999: 위 규칙에 해당하지 않는 기타 모든 경우는 단어 경계가 발생합니다.

구분 기호(단어 경계 생성)

다음 문자는 토크나이저에서 구분 기호로 간주되어 앞뒤에 단어 경계를 생성하며, 쿼리 시 독립적인 토큰으로 분할됩니다.

문자 Unicode 속성 설명 예시(원본 텍스트 → 토큰화 결과)
␣(공백) White_Space / WSegSpace 기본 구분 기호 hello world → hello, world
/ Other URL 경로 구분 기호 http://example.com/path → http, example.com, path
? Other URL 쿼리 매개변수 시작 기호 ?query=1 → query, 1
= Other 키-값 쌍 구분 기호 key=value → key, value
& Other URL 매개변수 연결 기호 a=1&b=2 → a, 1, b, 2
@ Other 이메일 구분 기호 user@example.com → user, example.com
주의

위 문자들을 queryString 쿼리에서 리터럴로 매칭해야 하는 경우 이스케이프 또는 따옴표로 감싸는 것이 좋습니다. 하지만 토큰화 단계에서 이미 제거되므로, 따옴표로 감싸더라도 하위 인덱스는 여전히 토큰화된 토큰을 기준으로 매칭합니다.


토큰 구성 요소(단어 경계 없음)

다음 문자는 토크나이저에서 토큰의 일부로 간주되어 앞뒤에 단어 경계를 생성하지 않습니다.

문자 Unicode 속성 설명 예시
.(점) MidNumLet 도메인, 식별자의 일부 example.com이 하나의 토큰으로 간주됨
_(밑줄) ExtendNumLet 식별자의 일부 user_name이 하나의 토큰으로 간주됨
:(콜론) MidLetter 네임스페이스, 식별자의 일부 handlepongmessage:devops가 하나의 토큰으로 간주됨

토큰화 예시

예시 1: URL 토큰화

원본 텍스트:

https://api.example.com/v1/users?id=123&name=test

토큰화 결과(유효한 토큰만 유지):

https, api.example.com, v1, users, id, 123, name, test

예시 2: 이메일 주소 토큰화

원본 텍스트:

admin@example.com

토큰화 결과:

admin, example.com

예시 3: 밑줄 식별자

원본 텍스트:

user_name = "Alice"

토큰화 결과:

user_name, Alice

예시 4: 콜론으로 구분된 식별자

원본 텍스트:

handlepongmessage:devops

토큰화 결과:

handlepongmessage:devops

쿼리에 미치는 영향

토큰화 규칙을 이해하면 더 정확한 queryString 쿼리를 작성하는 데 도움이 됩니다.

쿼리문 실제 매칭 로직 설명
queryString("example.com") example.com 토큰을 포함하는 문서 매칭 점은 토큰의 일부
queryString("user_name") user_name 토큰을 포함하는 문서 매칭 밑줄은 토큰의 일부
queryString("user@example") user 또는 example을 포함하는 문서 매칭 @는 구분 기호, 쿼리가 두 개의 토큰으로 분할되며 기본적으로 OR로 연결
queryString("id=123") id 또는 123을 포함하는 문서 매칭 =는 구분 기호
queryString("a/b") a 또는 b를 포함하는 문서 매칭 /는 구분 기호

주의사항

구문 쿼리의 한계

큰따옴표는 정확한 구문 매칭에 사용되며, 토큰이 인덱스에서 인접하게 나타나야 합니다. 그러나 구분 기호(예: @, /, = 등)는 토큰화 단계에서 이미 제거되었으므로, 구문 쿼리는 원본 텍스트의 특정 구분 기호를 구분할 수 없습니다. 예:

queryString("user@example.com")

실제로는 user와 example.com 두 토큰이 인접하게 나타나는 경우를 매칭하며, user@example.com과 user example.com 등의 텍스트를 동시에 매칭할 수 있습니다. @를 포함하는 원본 문자열을 엄격하게 매칭해야 하는 경우 match 또는 regexp 함수를 사용하는 것이 좋습니다.

한중일 문자 토큰화

중국어, 일본어 등 CJK 문자의 경우 UAX #29 기본 규칙은 문자 단위로 분할합니다(각 글자를 독립적인 토큰으로 간주). 이는 search 함수의 "중국어: 문자 단위 토큰화 매칭" 동작과 일치합니다.

대소문자 구분

queryString 매칭은 기본적으로 대소문자를 구분하지 않습니다.


문서 평가

이 페이지가 도움이 되었나요?