本記事では、OceanBaseデータベースに分かち書きプラグインをインストールし、使用する方法について説明します。分かち書きプラグインは全文インデックス機能で使用でき、特定の業務要件を満たすためにカスタムの分かち書きロジックをサポートします。
注意
現在の分かち書きプラグインは実験的な機能であり、本番環境での使用は推奨されません。
前提条件
分割器プラグインをインストールおよび使用する前に、以下の条件が満たされていることを確認してください:
オペレーティングシステムがyumパッケージ管理ツールをサポートしていること。
説明
yumをサポートしないシステムを使用している場合は、RPMパッケージを手動でダウンロードしたり、他のパッケージ管理ツールを使用したりするなど、他の方法で上記の依存関係をインストールできます。正常にデプロイされ、稼働しているOceanBaseデータベースクラスタがあること。
システムテナント権限を持っていること。これにより、構成パラメータの変更やクラスタの再起動が可能になります。
手順
ステップ1:開発環境の構築
分かち書きプラグインの開発には、C/C++コンパイル環境とOceanBaseが提供するプラグイン開発ツールキットが必要です。以下のコマンドを実行して、C/C++開発環境とOceanBaseプラグイン開発キットをインストールします。
基本コンパイルツールのインストール。
C/C++プログラムをコンパイルするために必要な基本ツールとライブラリをインストールします。
yum install -y cmake make glibc-devel glibc-headers gcc gcc-c++OceanBaseソフトウェアリポジトリの設定。
OceanBaseの公式ソフトウェアリポジトリを追加し、後でyumを使用してOceanBase関連のツールや依存関係をインストールできるようにします。
yum-utilsツールのインストール。
yum install -y yum-utilsOceanBaseソフトウェアリポジトリの追加。
yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo
プラグイン開発キットのインストール。
yum install -y oceanbase-plugin-dev-kitインストール完了後、
/usr/share/examples/ObPlugin/ftparserディレクトリにOceanBase分かち書きプラグインのサンプルコードファイルspace_ftparser.cppが表示されます。ls /usr/share/examples/ObPlugin/ftparser実行結果は次のとおりです:
CMakeLists.txt space_ftparser.cpp
ステップ2:開発テンプレートの取得
OceanBase分かち書きプラグインのサンプルコードspace_ftparser.cppをご自身の開発ディレクトリにコピーすると、space_ftparser.cppファイルを変更して独自の分かち書きプラグインを開発できます。
例:
[root@xxx packages]# cp /usr/share/examples/ObPlugin/ftparser/* /home/admin/test_plugin_dev
[root@xxx packages]# ls /home/admin/test_plugin_dev
実行結果は次のとおりです:
CMakeLists.txt space_ftparser.cpp
サンプルコードの中核となるファイルはspace_ftparser.cppであり、業務要件に応じてこのファイルを変更することで、カスタムの分かち書きロジックを実装できます。
ステップ3:プラグインのコンパイルとインストール
ビルド設定を変更します(
CMakeLists.txt)。サンプルコードのルートディレクトリには、
CMakeLists.txtファイルがあります。このファイルでは、「TODO」とマークされた箇所が変更が必要な部分であり、以下の部分が含まれます:PLUGIN_NAME:現在のプラグイン名であり、プロジェクト名および生成される動的リンクライブラリの名前でもあります。必要な名前に変更してください。SOURCES:実装ファイルのリストで、CまたはC++のソースファイルを含めることができます。実装ファイルを追加する場合は、ここにファイルのパスを追加してください。ヘッダーファイルはこのリストに含めないでください。
コンパイルを実行します。
以下の手順を実行してコンパイルします:
作業ディレクトリに移動します。
cd /your/work/path/ftparser分かち書きプラグイン開発ディレクトリに移動します。
/your/work/path/ftparserを実際の開発ディレクトリパスに置き換えてください。ビルドディレクトリを作成します。
mkdir -p buildbuildという名前のディレクトリを作成し、コンパイルプロセスで生成される中間ファイルと最終製品を格納します。-pパラメータは、ディレクトリが既に存在してもエラーが発生しないようにします。ビルドディレクトリに入ります。
cd build作成したばかりの
buildディレクトリに入ります。以降のコンパイル操作はこのディレクトリ内で行われるため、ソースコードディレクトリをきれいに保つことができます。ビルド環境を設定します。
cmake ..cmakeコマンドを実行し、上位ディレクトリにあるCMakeLists.txtファイルを読み込んで、コンパイルに必要なMakefileファイルを生成します。..はCMakeLists.txtファイルが上位ディレクトリにあることを示します。ソースコードをコンパイルします。
makemakeコマンドを実行し、生成されたMakefileファイルに基づいてソースコードをコンパイルし、動的リンクライブラリファイル(例:libexample_ftparser.so)を生成します。コンパイルが成功すると、現在のディレクトリ(つまり
buildディレクトリ)に動的リンクライブラリファイルが生成されます。
コンパイル済み製品をコピーします。
コンパイルが完了すると、
buildディレクトリに動的リンクライブラリファイル(例:libexample_ftparser.so)が生成されます。このファイルをOceanBaseクラスタの各Observerノードのplugin_dirディレクトリにコピーします。cp libexample_ftparser.so /path/to/plugin_dir/生成された動的リンクライブラリファイルをOceanBaseのプラグインディレクトリにコピーします。
/path/to/plugin_dir/を実際のplugin_dirパス(システムパラメータplugin_dirを確認することで取得できます)に置き換えてください。プラグインをロードします。
システムテナントでOceanBaseデータベースにログインし、設定パラメータ
plugins_loadを変更してプラグインをロードします:ALTER SYSTEM SET plugins_load='libexample_ftparser.so';クラスタを再起動してプラグインを有効にします。
OceanBaseデプロイメントツール(OBD)で管理されているOceanBaseクラスタの場合、以下のコマンドでクラスタを再起動できます。
obd cluster restart <cluster_name><cluster_name>を実際のクラスタ名に置き換えてください。OceanBaseクラウドプラットフォーム(OCP)で管理されているクラスタの場合、OCP上で直接クラスタを再起動できます。
インストール済みの分かち書きプラグインを確認します。
select * from oceanbase.GV$OB_PLUGINS;実行結果は次のとおりです:
+-----------+----------+------------------+--------+----------+------------------------+-----------------+------------------+-------------------+-----------------------+---------------+---------------------------------------------+ | SVR_IP | SVR_PORT | NAME | STATUS | TYPE | LIBRARY | LIBRARY_VERSION | LIBRARY_REVISION | INTERFACE_VERSION | AUTHOR | LICENSE | DESCRIPTION | +-----------+----------+------------------+--------+----------+------------------------+-----------------+------------------+-------------------+-----------------------+---------------+---------------------------------------------+ | 127.0.0.1 | 55801 | ngram | READY | FTPARSER | NULL | 1.0.0 | NULL | 0.1.0 | OceanBase Corporation | Mulan PubL v2 | This is a ngram fulltext parser plugin. | | 127.0.0.1 | 55801 | beng | READY | FTPARSER | NULL | 1.0.0 | NULL | 0.1.0 | OceanBase Corporation | Mulan PubL v2 | This is a basic english parser plugin. | | 127.0.0.1 | 55801 | space | READY | FTPARSER | NULL | 1.0.0 | NULL | 0.1.0 | OceanBase Corporation | Mulan PubL v2 | This is a default whitespace parser plugin. | | 127.0.0.1 | 55801 | example_ftparser | READY | FTPARSER | libexample_ftparser.so | 1.0.0 | NULL | 0.1.0 | OceanBase Corporation | Mulan PSL v2 | This is an example ftparser. | +-----------+----------+------------------+--------+----------+------------------------+-----------------+------------------+-------------------+-----------------------+---------------+---------------------------------------------+ここで、
LIBRARYがNULLの場合は組み込み分かち書きプラグインを意味します。
ステップ4:分かち書きプラグインをテストする
テーブルを作成し、
WITH PARSER句を使用して分かち書きプラグインexample_ftparserを指定します。CREATE TABLE t_example( c1 INT, c2 VARCHAR(200), c3 TEXT, FULLTEXT INDEX (c2, c3) WITH PARSER example_ftparser );テーブルにテストデータを挿入します。
INSERT INTO t_example (c1, c2, c3) VALUES (1, 'Alice', 'Alice loves programming and enjoys long walks.'), (2, 'Bob', 'Bob is an avid reader and a coffee enthusiast.'), (3, 'Charlie', 'Charlie is a skilled musician who plays the guitar.'), (4, 'Diana', 'Diana is passionate about painting and arts.'), (5, 'Eve', 'Eve is a fitness coach and a healthy lifestyle advocate.');キーワード
lovesを含むレコードをクエリします。SELECT * FROM t_example WHERE MATCH(c2, c3) AGAINST ('loves') > 0;実行結果は次のとおりです:
+------+-------+------------------------------------------------+ | c1 | c2 | c3 | +------+-------+------------------------------------------------+ | 1 | Alice | Alice loves programming and enjoys long walks. | +------+-------+------------------------------------------------+ 1 row in setキーワード
readerを含むレコードをクエリします。SELECT * FROM t_example WHERE MATCH(c2, c3) AGAINST ('reader') > 0;実行結果は次のとおりです:
+------+------+------------------------------------------------+ | c1 | c2 | c3 | +------+------+------------------------------------------------+ | 2 | Bob | Bob is an avid reader and a coffee enthusiast. | +------+------+------------------------------------------------+ 1 row in set分かち書きスコアをテストします。
SELECT c1, MATCH (c2, c3) AGAINST ('he loves programming and reading') AS score, c2, c3 FROM t_example;実行結果は次のとおりです:
+------+--------------------+---------+----------------------------------------------------------+ | c1 | score | c2 | c3 | +------+--------------------+---------+----------------------------------------------------------+ | 1 | 2.665294094128556 | Alice | Alice loves programming and enjoys long walks. | | 2 | 0.2849740932642488 | Bob | Bob is an avid reader and a coffee enthusiast. | | 3 | 0 | Charlie | Charlie is a skilled musician who plays the guitar. | | 4 | 0.2989130434782609 | Diana | Diana is passionate about painting and arts. | | 5 | 0.2722772277227723 | Eve | Eve is a fitness coach and a healthy lifestyle advocate. | +------+--------------------+---------+----------------------------------------------------------+ 5 rows in set