OceanBaseデータベースのMySQLモードでは、フルテキストインデックスはCHAR、VARCHAR、TEXT型の列に適用できます。さらに、OceanBaseデータベースでは、主表に複数のフルテキストインデックスを作成することが可能であり、同一列に対しても複数のフルテキストインデックスを作成できます。
非パーティションテーブルおよびパーティションテーブルに主キーの有無にかかわらず、フルテキストインデックスを作成できます。フルテキストインデックスの作成制限は以下の通りです:
- フルテキストインデックスは
CHAR、VARCHAR、TEXT型の列にのみ適用できます。 - 現在のバージョンでは、ローカル(
LOCAL)フルテキストインデックスのみの作成がサポートされています。 - フルテキストインデックス作成時に
UNIQUEキーワードを指定することはできません。 - 複数列にまたがるフルテキストインデックスを作成する場合、これらの列が同じ文字セットを持っている必要があります。
これらの構文とルールを使用することで、OceanBaseデータベースのフルテキストインデックス機能は、テキストデータに対する効率的な検索と取得機能を提供します。
DML操作
全文インデックスを含むテーブルを作成した場合、INSERT INTO ON DUPLICATE KEY、REPLACE INTO、複数テーブルの更新・削除、更新可能なビューなどの複雑なDML操作をサポートします。
例:
INSERT INTO ON DUPLICATE KEY:
INSERT INTO articles VALUES ('OceanBase', 'Fulltext search index support insert into on duplicate key') ON DUPLICATE KEY UPDATE title = 'OceanBase 4.3.3';REPLACE INTO:
REPLACE INTO articles(title, context) VALUES ('Oceanbase 4.3.3', 'Fulltext search index support replace');複数テーブルの更新・削除。
テーブル
tbl1を作成します。CREATE TABLE tbl1 (a int PRIMARY KEY, b text, FULLTEXT INDEX(b));テーブル
tbl2を作成します。CREATE TABLE tbl2 (a int PRIMARY KEY, b text);複数テーブルの更新 (
UPDATE) ステートメント。UPDATE tbl1 JOIN tbl2 ON tbl1.a = tbl2.a SET tbl1.b = 'dddd', tbl2.b = 'eeee';UPDATE tbl1 JOIN tbl2 ON tbl1.a = tbl2.a SET tbl1.b = 'dddd';UPDATE tbl1 JOIN tbl2 ON tbl1.a = tbl2.a SET tbl2.b = tbl1.b;複数テーブルの削除 (
DELETE) ステートメント。DELETE tbl1, tbl2 FROM tbl1 JOIN tbl2 ON tbl1.a = tbl2.a;DELETE tbl1 FROM tbl1 JOIN tbl2 ON tbl1.a = tbl2.a;DELETE tbl1 FROM tbl1 JOIN tbl2 ON tbl1.a = tbl2.a;
更新可能なビューのDML。
ビュー
fts_viewを作成します。CREATE VIEW fts_view AS SELECT * FROM tbl1;更新可能なビューに
INSERTステートメントを使用します。INSERT INTO fts_view VALUES(3, 'cccc'), (4, 'dddd');UPDATEステートメントは、更新可能なビューに対して使用します。UPDATE fts_view SET b = 'dddd';UPDATE fts_view JOIN normal ON fts_view.a = tbl2.a SET fts_view.b = 'dddd', tbl2.b = 'eeee';DELETEステートメントは、更新可能なビューに対して使用します。DELETE FROM fts_view WHERE b = 'dddd';DELETE tbl1 FROM fts_view JOIN tbl1 ON fts_view.a = tbl1.a AND 1 = 0;
フルテキストインデックスのトークナイザー
OceanBaseのフルテキストインデックス機能は、さまざまな組み込みトークナイザーをサポートしており、ユーザーはビジネスシナリオに応じて最適なテキスト分割戦略を選択できます。デフォルトのトークナイザーは Spaceトークナイザー です。その他のトークナイザーは WITH PARSER パラメータで明示的に指定する必要があります。
トークナイザーリスト:
- Spaceトークナイザー
- Basic Englishトークナイザー
- IKトークナイザー
- Ngramトークナイザー
- jiebaトークナイザー
設定方法の例:
テーブルの作成時または変更時に、CREATE TABLE/ALTER TABLE ステートメントを使用してテーブルのフルテキストインデックスを作成する際に、パラメータ WITH PARSER tokenizer_option を設定し、フルテキストインデックスのトークナイザータイプを指定します。その他のトークナイザーのプロパティパラメータ設定については、インデックスの作成を参照してください。
-- テーブル作成時にNgramトークナイザーを指定
CREATE TABLE tbl2(id INT, name VARCHAR(18), doc TEXT,
FULLTEXT INDEX full_idx1_tbl2(name, doc)
WITH PARSER NGRAM
PARSER_PROPERTIES=(ngram_token_size=3));
-- 既存テーブルにフルテキストインデックスを追加し、Ngramトークナイザーを指定
ALTER TABLE tbl2 ADD FULLTEXT INDEX full_idx1_tbl2(name, doc)
WITH PARSER NGRAM
PARSER_PROPERTIES=(ngram_token_size=3);
既存のフルテキストインデックスのトークナイザーを変更する場合は、まず元のインデックスを削除してから、再度作成する必要があります:
-- 元のフルテキストインデックスを削除
ALTER TABLE tbl2 DROP INDEX full_idx1_tbl2;
-- フルテキストインデックスを再作成し、新しいトークナイザーを指定
ALTER TABLE tbl2 ADD FULLTEXT INDEX full_idx1_tbl2(name, doc)
WITH PARSER IK
PARSER_PROPERTIES=(ik_mode='max_word');
Spaceトークナイザー(デフォルト)
概念:
- スペース、句読点(カンマ、ピリオドなど)、または英字数字以外の文字(アンダースコア
_を除く)を区切り文字として使用し、テキストを分割します。 - 分割結果には、
min_token_size(デフォルト3)からmax_token_size(デフォルト84)の範囲内の有効な単語要素のみが含まれます。 - 中国語の文字は、それぞれ個別の文字として扱われます。
適用シナリオ:
- スペースで区切られる言語(英語など)の場合(例:「apple watch series 9」)。
- 中国語で人手によって区切り文字が追加されている場合(例:「南京 长江大桥」)。
トークナイズ効果:
OceanBase(rooteoceanbase)>select tokenize("南京市长江大桥有1千米长,详见www.XXX.COM, 邮箱xx@OB.COM,一平方公里也很小 hello-word h_name", 'space');
+-------------------------------------------------------------------------------------------------------------+
| tokenize("南京市长江大桥有1千米长,详见www.XXX.COM, 邮箱xx@OB.COM,一平方公里也很小 hello-word h_name", 'space') |
+-------------------------------------------------------------------------------------------------------------+
|["详见www", "一平方公里也很小", "xxx", "南京市长江大桥有1千米长", "邮箱xx", "word", "hello”, "h_name"] |
+-------------------------------------------------------------------------------------------------------------+
例の説明:
- スペース、カンマ、ピリオドなどの記号が区切り文字として使用され、中国語の連続する文字は単語と見なされます。
Basic English(Beng)トークナイザー
概念:
- Spaceトークナイザーと同様ですが、アンダースコア
_は保持せず、それを区切り文字と見なします。 - 英語のフレーズ区切りに適していますが、スペースのない用語(例:「iPhone15」)の分割効果は限定的です。
適用シナリオ:
- 英語ドキュメントの基本的な検索(ログ、コメントなど)。
トークナイズ効果:
OceanBase(rooteoceanbase)>select tokenize("南京市长江大桥有1千米长,详见WWW.XXX.COM, 邮箱xx@OB.COM, 一平方公里也很小 hello-word h_name", 'beng');
+-----------------------------------------------------------------------------------------------------------------------+
| tokenize("南京市长江大桥有1千米长,详见WWW.XXX.COM,邮箱xx@OB.COM, 一平方公里也很小 hello-word h_name", 'beng') |
+-----------------------------------------------------------------------------------------------------------------------+
|["详见www", "一平方公里也很小", "xxx", "南京市长江大桥有1千米长", "邮箱xx", "word", "hello", "name"] |
+-----------------------------------------------------------------------------------------------------------------------+
例:
- アンダースコア
_は分割されます。Spaceトークナイザーとの主な違いは_の処理方法です。
Ngramトークナイザー
概念:
- 固定n値トークナイズ:デフォルトで
n=2となり、連続する区切り文字以外の文字を長さnの部分列に分割します。 - 区切り文字の判定ルールはSpaceトークナイザーと同じです(
_、数字、英字は保持されます)。 - 長さ制限パラメータはサポートしていないため、すべての可能な
n長さの語彙素を出力します。
適用シナリオ:
- 短文のあいまい一致検索(ユーザーID、注文番号など)。
- 固定長の特徴抽出が必要なシナリオ(パスワードポリシー分析など)。
トークナイズ結果:
OceanBase(rooteoceanbase)>select tokenize("南京市长江大桥有1千米长,详见WWW.XXX.COM, 邮箱xx@OB.COM, 一平方公里也很小 hello-word h_name", 'ngram');
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tokenize("南京市长江大桥有1千米长,详见WWW.XXX.COM, 邮箱xx@OB.COM, 一平方公里也很小 hello-word h_name", 'ngram') |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|["邮箱", "ww", "大桥", “ob", "me", "里也", "or", "_n", "千米", "很小", "米长", "ll", "箱x", "公里", "见w", "co", "也很", "1千", "京市", "lo", "江大", "el", "rd", "一平", "方公", "he", "am", "南京", "h_", "市长", "wo", "xx", "长江", "有1", "na", "详见", "平方", "om", "桥有" |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
例:
- デフォルトで
n=2の場合、重複部分を含むすべての連続する2文字の語彙素を出力します。
Ngram2トークナイザー
概念:
- 動的n値範囲をサポートします:
min_ngram_sizeとmax_ngram_sizeパラメータで語彙素の長さ範囲を設定します。 - 複数の長さの語彙素のカバレッジが必要なシナリオに適しています。
適用シナリオ: 複数の固定長語彙素が同時に必要なシナリオ。
説明
ngram2トークナイザーを使用する場合、メモリ消費が高くなる可能性がある点に注意してください。例えば、min_ngram_size と max_ngram_size のパラメータ範囲を広く設定すると、大量の語彙素の組み合わせが生成され、リソース消費が過剰になる可能性があります。
トークナイズ結果:
OceanBase(rooteoceanbase)>select tokenize("南京市长江大桥1千米", 'ngram2', '[{"additional_args":[{"min_ngram_size": 4},{"max_ngram_size": 6}]}]');
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tokenize("南京市长江大桥1千米", 'ngram2', '[{"additional_args":[{"min_ngram_size": 4},{"max_ngram_size": 6}]}]') |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ["長江大橋", "大橋1千", "江大橋1千", "市長江大橋", "京市長江", "江大橋1", "南京市長", "市長江大", "大橋1千米", "江大橋1千米", "市長江大橋1", "長江大橋1", "南京市長江", "橋1千米", "南京市長江大", "長江大橋1千", "京市長江大橋", "京市長江大" |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
例の説明:
- 長さが4文字から6文字のすべての連続する部分列を出力し、単語要素は重なることができます。
IK 分かち書きツール
概念:
オープンソースツール IK Analyzer をベースとした中国語の分かち書きツールで、以下の 2 つのモードをサポートしています:
- Smart モード:長い単語を優先的に出力し、分割数を減らします(例:「南京市」は「南京」「市」とは分割しません)。
- Max Word モード:考えられるすべての短い単語を出力します(例:「南京市」は「南京」「市」と分割します)。
英単語、メールアドレス、URL(
://を除く)、IP アドレスなどの形式を自動的に認識します。
適用シナリオ:中国語の分かち書き
ビジネスシナリオ:
E コマース商品説明の検索(例:「华为Mate60」の正確な一致)
ソーシャルメディアコンテンツの分析(例:ユーザーコメントからのキーワード抽出)
Smart モード:1文字が1つの語にのみ属し、重複がなく、単一の語を構成する長さをできるだけ長く、構成される語の数をできるだけ少なく保証します。数詞と量詞を組み合わせて1つの語として出力するよう試みます。
OceanBase(rooteoceanbase)>select tokenize("南京市长江大桥有1千米长,详见WWW.XXX.COM, 邮箱xx@OB.COM 192.168.1.1 http://www.baidu.com hello-word hello_word", 'IK', '[{"additional_args":[{"ik_mode": "smart"}]}]');
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tokenize("南京市长江大桥有1千米长,详见WWW.XXX.COM, 邮箱xx@OB.COM 192.168.1.1 http://www.baidu.com hello-word hello_word", 'IK', '[{"additional_args":[{"ik_mode": "smart"}]}]') |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|["邮箱", "hello_word", "192.168.1.1", "hello-word", "长江大桥", "www.baidu.com", "www.xxx.com", "xx@ob.com", "长", "http", "1千米", "详见", "南京市", "有"] |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
- max_word モード:同じ文字を異なる分かち書きに含め、可能な限り多くの語を提供します。
OceanBase(rooteoceanbase)>select tokenize("南京市长江大桥有1千米长,详见WWW.XXX.COM, 邮箱xx@OB.COM", 'IK', '[{"additional_args":[{"ik_mode": "max_word"}]}]');
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tokenize("南京市长江大桥有1千米长,详见WWW.XXX.COM, 邮箱xx@OB.COM", 'IK', '[{"additional_args":[{"ik_mode": "max_word"}]}]') |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|["米", "长江大桥", "市长", "干", "南京市", "南京", "千米", "xx", "www.xxx.com", "长", "www", "xx@ob.com", "长江", "ob", "XXX", "com", "详见", "l", "有", "大桥", "邮箱"] |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
jieba 分かち書きツール
概念:Python エコシステムのオープンソースツール jieba をベースとした分かち書きツールで、高精度モード、全モード、および検索エンジンモードをサポートしています。
特徴:
- 高精度モード:辞書に厳密に従って分割します(例:「不能」は「不」「能」とは分割しません)。
- 全モード:考えられるすべての分割パターンをリストアップします。
- 検索エンジンモード:精度と再現率のバランスを取ります(例:「南京市长江大桥」→「南京」「市长」「长江大桥」)。
- カスタム辞書と新語発見をサポートし、複数言語(中国語、英語、日本語など)に対応しています。
適用シナリオ:
- 医療・科学技術分野の用語解析(例:「人工知能」を正確に分割する場合)。
- 多言語混合テキスト処理(例:中国語と英語が混在するソーシャルメディアコンテンツ)。
jieba 分詞器プラグインは、お客様自身でインストールしてください。コンパイル手順については、分詞器プラグインを参照してください。
注意
現在の分詞器プラグインは実験的な機能であり、本番環境での使用は推奨されません。
分詞器の選択ポイント
業務シナリオ |
推奨分詞器 |
理由 |
|---|---|---|
| 英語商品タイトル検索 | SpaceまたはBasic English | シンプルかつ効率的で、英語の分詞習慣に合致します。 |
| 中国語商品説明検索 | IK分詞器 | 中国語の専門用語を高精度で認識し、カスタム辞書に対応しています。 |
| ログのあいまい一致検索(エラーコードなど) | Ngram分詞器 | 辞書不要で、スペースのないテキストに対するあいまい検索ニーズをカバーします。 |
| 科学論文のキーワード抽出 | jieba分詞器 | 新語の発見と複雑なパターンの切り替えに対応しています。 |
関連ドキュメント
全文インデックスの作成に関する詳細は、インデックスの作成 の 全文インデックスを作成する セクションを参照してください。