Oracle Cloud Infrastructure(OCI)のOracle Databaseサービスの1つ、Autonoous DatabaseでOCI Object Storageバケット内のファイルに対してOracle Textの全文検索索引を作成し、全文検索してみた。
前提条件
- OCI Object Storageバケットに対象ファイルを配置
- Autonomous Databaseでクレデンシャルの作成
- OCIチュートリアルの クレデンシャル情報の登録参照
Object StorageファイルにOracle Text索引を作成
Object Storage内のファイルにOracle Text索引を作成するためにDBMS_CLOUD.CREATE_EXTERNAL_TEXT_INDEX 使用します。
- パラメータcredential_name:クレデンシャルを指定します。
- パラメータlocation_uri:指定された URI にあるObject StorageファイルにOracle Text索引を作成します。
- パラメータindex_name;索引名を指定します。
- パラメータformatのrefresh_rateオプション:索引更新間隔(分)を指定します。
begin
dbms_cloud.create_external_text_index (
credential_name => 'DEF_CRED_NAME',
location_uri => 'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<namespace>/b/<bucket名>/o/',
index_name => 'mydocs',
format => JSON_OBJECT('refresh_rate' value '10')
);
end;
/
これにより、東京リージョンの namespace
のbucket名
のバケットに対してOracle Text索引が作成されます。
Database Object(Oracle Text索引参照表)としては、mydocs$TXTIDX(index_name
$TXTIDX)テーブルが作成され、CONTAINSを使用して検索を実行できます。
このOracle Text索引は10分間隔でリフレッシュされます。
Oracle Text索引参照表
DBMS_CLOUD.CREATE_EXTERNAL_TEXT_INDEXを実行することで作成されるOracle Text索引参照表(Index_name
$TXTIDX)には次の列があります。
- mtime:Object Storageファイルの最終変更タイムスタンプです。これは、DBMS_CLOUDが最後にファイルにアクセスした時刻です。
- object_name:Object Storage上のファイル名です。
- object_path:Object Storage上のファイルを含むObject Storageバケットの URI です。
全文検索の実施
索引付けが完了したオブジェクト(ファイル)の確認
Oracle Text索引参照表:mydocs$TXTIDXテーブル を検索すると 索引付けが完了したファイルを確認できます。
select * from mydocs$txtidx
全文検索
「日本語」という文字列を含むファイルの検索
select * from mydocs$txtidx where contains (object_name, '日本語') > 0;
「ホワイト」という文字列を含むファイルの検索
select * from mydocs$txtidx where contains (object_name, 'ホワイト') > 0;
作成したOracle Text索引の削除
Object Storageファイルに対するOracle Text索引を削除するには DBMS_CLOUD.DROP_EXTERNAL_TEXT_INDEXを使用します。
- パラメータindex_name:索引名を指定します。
BEGIN
DBMS_CLOUD.DROP_EXTERNAL_TEXT_INDEX (
index_name => 'mydocs'
);
END;
/
Oracle Text索引作成の監視
DBMS_CLOUD.CREATE_EXTERNAL_TEXT_INDEXでOracle Text索引を作成すると、ALL_SCHEDULER_JOB_RUN_DETAILSビューにログが記録されます。
ALL_SCHEDULER_JOB_RUN_DETAILSビューを照会して、索引作成ジョブによって報告されたステータスとエラーを取得できます。
DBMS_SCHEDULERジョブの名前は、index_name
$JOBです。
SELECT status, additional_info
FROM all_scheduler_job_run_details WHERE LOWER(job_name) = LOWER('mydocs$JOB');
STATUS ADDITIONAL_INFO
--------- ---------------
SUCCEEDED
SUCCEEDED
SUCCEEDED
SUCCEEDED
SUCCEEDED
5行が選択されました。
Database Actions のスケジュール
でも確認できます。
おわりに
Autonomous DatabaseからObject Storageのファイルに対してOracle Textを使った全文検索ができました。
記事執筆時点(2023/01/08)ではAutonomous Database以外のOracle Database 19c の DBMS_CLOIDパッケージには CREATE_EXTERNAL_TEXT_INDEX プロシージャがありませんでした。