トークン分割ルール¶
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.com、handlepongmessage:devopsは 1 つのトークンとして扱われます。 - WB8 / WB9 / WB10:数字間、および文字と数字の間では境界は生成されません。例:
32.3の32と3は数字のシーケンスとして扱われます(.は MidNumLet として数字の境界を破りません)。 - WB13a / WB13b:アンダースコア(ExtendNumLet)と文字/数字の間では境界は生成されません。例:
user_nameは 1 つのトークンとして扱われます。 - 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 は 1 つのトークンとして扱われる |
_(アンダースコア) |
ExtendNumLet |
識別子の一部 | user_name は 1 つのトークンとして扱われる |
:(コロン) |
MidLetter |
名前空間、識別子の一部 | handlepongmessage:devops は 1 つのトークンとして扱われる |
トークン分割例¶
例 1:URL のトークン分割¶
元のテキスト:
トークン分割結果(有効なトークンのみ保持):
例 2:メールアドレスのトークン分割¶
元のテキスト:
トークン分割結果:
例 3:アンダースコア付き識別子¶
元のテキスト:
トークン分割結果:
例 4:コロン区切りの識別子¶
元のテキスト:
トークン分割結果:
クエリへの影響¶
トークン分割ルールを理解することで、より正確な 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 を含むドキュメントにマッチ |
/ は区切り文字 |
注意事項¶
フレーズクエリの制限¶
ダブルクォーテーションは正確なフレーズマッチングに使用され、トークンがインデックス内で隣接して出現する必要があります。ただし、区切り文字(@、/、= など)はトークン分割段階で除去されるため、フレーズクエリは元のテキスト内の特定の区切り文字を区別できません。例えば:
実際には user と example.com の 2 つのトークンが隣接して出現するものにマッチし、user@example.com と user example.com などのテキストの両方にマッチする可能性があります。@ を含む元の文字列を厳密にマッチさせる必要がある場合は、代わりに match または regexp 関数を使用することを推奨します。
中国語のトークン分割¶
中国語、日本語などの CJK 文字の場合、UAX #29 のデフォルトルールでは文字単位で分割され(各文字が独立したトークンとして扱われます)、search 関数の「中国語:文字単位のトークン分割マッチング」動作と一致します。
大文字と小文字の区別¶
queryString のマッチングはデフォルトで大文字と小文字を区別しません。