本記事では、OceanBaseデータベースに分詞器プラグインをインストールし、使用する方法について説明します。分詞器プラグインは全文インデックス機能に使用され、特定のビジネスニーズに合わせてカスタマイズした分詞ロジックをサポートします。
注意
- OceanBaseデータベースV4.3.5では、V4.3.5 BP1バージョンから分詞器プラグインがサポートされます。
- 現在の分詞器プラグインは実験的な機能であり、本番環境での使用は推奨されません。
前提条件
分割プラグインをインストールおよび使用する前に、以下の条件が満たされていることを確認してください:
オペレーティングシステムは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 buildコンパイルプロセスで生成される中間ファイルと最終生成物を格納するために、
buildという名前のディレクトリを作成します。-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