コンテンツにスキップ

トークン分割ルール


Doris ストレージエンジンでは、queryString 関数は全文インデックスに基づいてマッチングを行い、そのセマンティクスはトークン分割結果に直接関連します。Guance の基盤となるトークナイザーは、Unicode Standard Annex #29デフォルトの単語境界(Default Word Boundaries)仕様に従い、テキストを独立したトークン(Token)に分割してからインデックス化およびクエリを実行します。


単語境界判定ロジック

UAX #29 は、一連のルール(WB1–WB999)を使用して、隣接する 2 文字間に単語境界が生じるかどうかを判定します。主要なルールは次のとおりです。

  • WB5:文字(ALetter)間では境界は生成されません。例:hello は 1 つのトークンとして扱われます。
  • WB6 / WB7:文字 + 特定の区切り文字(MidLetter、MidNumLet)+ 文字では境界は生成されません。例:example.comhandlepongmessage:devops は 1 つのトークンとして扱われます。
  • WB8 / WB9 / WB10:数字間、および文字と数字の間では境界は生成されません。例:32.3323 は数字のシーケンスとして扱われます(. は MidNumLet として数字の境界を破りません)。
  • WB13a / WB13b:アンダースコア(ExtendNumLet)と文字/数字の間では境界は生成されません。例:user_name は 1 つのトークンとして扱われます。
  • WB999:上記のルールに該当しないその他のケースでは、すべて単語境界が生成されます

区切り文字(単語境界を生成)

以下の文字はトークナイザーで区切り文字と見なされ、その前後で単語境界が生成されます。クエリ時には独立したトークンに分割されます。

文字 Unicode 属性 説明 例(元のテキスト → トークン分割結果)
(スペース) White_Space / WSegSpace 基本区切り文字 hello worldhello, world
/ Other URL パス区切り文字 http://example.com/pathhttp, example.com, path
? Other URL クエリパラメータ開始文字 ?query=1query, 1
= Other キーと値の区切り文字 key=valuekey, value
& Other URL パラメータ連結文字 a=1&b=2a, 1, b, 2
@ Other メールアドレス区切り文字 user@example.comuser, example.com
注意

上記の文字を queryString クエリでリテラルとしてマッチさせる場合は、エスケープまたは引用符で囲むことを推奨します。ただし、トークン分割段階で除去されるため、引用符で囲んでも、基盤となるインデックスはトークン分割後のトークンでマッチングを行います。


トークンの構成要素(単語境界を生成しない)

以下の文字はトークナイザーでトークンの一部と見なされ、その前後で単語境界は生成されません。

文字 Unicode 属性 説明
.(ドット) MidNumLet ドメイン名、識別子の一部 example.com は 1 つのトークンとして扱われる
_(アンダースコア) ExtendNumLet 識別子の一部 user_name は 1 つのトークンとして扱われる
:(コロン) MidLetter 名前空間、識別子の一部 handlepongmessage:devops は 1 つのトークンとして扱われる

トークン分割例

例 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 を含むドキュメントにマッチ @ は区切り文字であり、クエリは 2 つのトークンに分割され、デフォルトで OR 結合されます
queryString("id=123") id または 123 を含むドキュメントにマッチ = は区切り文字
queryString("a/b") a または b を含むドキュメントにマッチ / は区切り文字

注意事項

フレーズクエリの制限

ダブルクォーテーションは正確なフレーズマッチングに使用され、トークンがインデックス内で隣接して出現する必要があります。ただし、区切り文字(@/= など)はトークン分割段階で除去されるため、フレーズクエリは元のテキスト内の特定の区切り文字を区別できません。例えば:

queryString("user@example.com")

実際には userexample.com の 2 つのトークンが隣接して出現するものにマッチし、user@example.comuser example.com などのテキストの両方にマッチする可能性があります。@ を含む元の文字列を厳密にマッチさせる必要がある場合は、代わりに match または regexp 関数を使用することを推奨します。

中国語のトークン分割

中国語、日本語などの CJK 文字の場合、UAX #29 のデフォルトルールでは文字単位で分割され(各文字が独立したトークンとして扱われます)、search 関数の「中国語:文字単位のトークン分割マッチング」動作と一致します。

大文字と小文字の区別

queryString のマッチングはデフォルトで大文字と小文字を区別しません。


フィードバック

このページは役に立ちましたか?