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 を設定し、フルテキストインデックスのトークナイザータイプを指定します。その他のトークナイザーのプロパティパラメータ設定については、インデックスの作成を参照してください。
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));
-- 既存テーブルのフルテキストインデックスのトークナイザーを変更する
ALTER 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の例
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モード:長い単語を優先的に出力し、分割数を減らします(例:"南京市"は"Nanjing""市"に分割されません)。
- Max Wordモード:考えられるすべての短い単語を出力します(例:"南京市"は"Nanjing""市"に分割されます)。
英単語、メールアドレス、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分かち書き器 | 新語の発見と複雑なパターンの切り替えをサポートします。 |
関連ドキュメント
全文インデックスの作成に関する詳細は、インデックスの作成 の 全文インデックスを作成する セクションを参照してください。