4.5 CONTEXT索引の作成
CONTEXT
索引タイプは、Microsoft Word、HTMLまたはプレーン・テキストのような形式の大量のまとまったドキュメントを索引付けする場合に最適です。
CONTEXT
索引では、様々な方法で索引をカスタマイズすることもできます。ドキュメントはテキスト表にロードする必要があります。
4.5.1 CONTEXT索引およびDML
CONTEXT
索引は、トランザクション・ベースでは更新されません。レコードを削除すると、索引は即時に変更されます。つまり、変更を行った瞬間からセッションはレコードを検索しなくなり、コミット後には他のユーザーはレコードを検索できなくなります。挿入と更新の場合、索引の同期化が行われるまで、新しい情報はテキスト検索には表示されません。したがって、元表で挿入または更新を行う場合、CTX_DDL.SYNC_INDEX.
を使用して明示的に索引を同期化する必要があります
関連項目:
「索引の同期化」
4.5.2 「デフォルトのCONTEXT索引例」
次の文は、docs
表内のtext
列にmyindex
というデフォルトのCONTEXT
索引を作成します。
CREATE INDEX myindex ON docs(text) INDEXTYPE IS CTXSYS.CONTEXT;
パラメータを明示的に指定せずにCREATE INDEX
文を使用すると、すべての言語に対してシステムのデフォルト動作が次のようになります。
-
索引付けされるテキストは、テキスト列に直接格納されるとみなします。テキスト列の型は、
CLOB
、BLOB
、BFILE
、VARCHAR2
またはCHAR
になります。 -
列型を検出し、バイナリの列型(
BLOB
およびBFILE)に対してフィルタ処理を使用します。
ほとんどのドキュメント形式がフィルタ処理でサポートされています。列がプレーン・テキストの場合、システムはフィルタ処理を使用しません。 -
データベース設定で指定した言語に対するデフォルトのストップリストを使用します。ストップリストは、索引付け時にシステムが無視するワードを識別します。
デフォルトの索引付け動作は、プリファレンスをカスタマイズし、そのプリファレンスをCREATE
INDEX
のパラメータ文字列に指定することによって、いつでも変更できます。
関連項目:
AUTO_FILTER
フィルタを使用するための環境の構成についてさらに学習するには、『Oracle Text リファレンス』を参照してください
4.5.3 CONTEXT索引の追加的な作成
ALTER INDEX
文およびCREATE INDEX
文は、CONTEXT
索引の追加的な作成をサポートします。
Oracle Text索引は追加的に作成できます。つまり、索引構造は即時に作成されますが、索引の作成または再構築プロセスではデータが移入されません。索引は後で適切なタイミングで移入します。この手順は、索引付け処理を連続的に実行するのが困難な大規模なインストールで索引を作成する場合に便利です。索引の作成をより細かく制御できるため、1回の操作で索引を作成する必要がなくなります。
索引の追加的な作成のステップは、次のとおりです:
-
空の索引の作成:
索引の作成時または再構築時に
NOPOPULATE
を指定すると、索引表のメタデータが作成されるのみで、移入は実行されません。-
グローバル索引:
グローバル索引の場合、
CREATE
INDEX
を使用してREBUILD
句のREPLACE
パラメータでNOPOPULATE
キーワードをサポートします。 -
ローカル索引パーティション:
ローカル索引パーティションについて、
ALTER
INDEX
...REBUILD
partition
...parameters
('REPLACE
...')パラメータ文字列を、NOPOPULATE
キーワードをサポートするように修正します。ローカル索引パーティションについては、
CREATE
INDEX
...LOCAL
... (partition
...parameters
('NOPOPULATE
'))がサポートされています。パーティション・レベルのPOPULATE
キーワードまたはNOPOPULATE
キーワードは、索引レベルで指定されたPOPULATE
またはNOPOPULATE
を上書きします。
-
-
すべてのROWIDを保留キューに配置:
CTX_DDL.POPULATE_PENDING
プロシージャを使用して、保留キューに実表または表パーティション内のすべてのROWIDを移入します。 -
索引の移入:
CTX_DDL.SYNC_INDEX
プロシージャを使用して、キューに入っているデータを索引に移入します。SYNC_INDEX
プロシージャには、操作に対し分単位の提示された時間制限を指定するmaxtime
引数が含まれます。索引付けプロセスは、完了まで実行するのではなく、指定したmaxtime
の概算で実行されます。索引が完全に同期されるまで、複数のSYNC_INDEX
コールの実行が必要になる場合があります。POPULATE_PENDING
コールとSYNC_INDEX
コールの両方を個別に実行して、保留キューの移入と索引の移入が異なるタイミングで実行されるように選択することで、システム・パフォーマンスを最適化できます。
例4-1 空のグローバル索引の追加的な構築
-- Create an empty index
CREATE INDEX ctx_ind ON ctx_tab(doc) INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('NOPOPULATE');
declare
n_pending number;
function get_pending return number is
n_pending number;
begin
n_pending := 0;
begin
execute immediate 'SELECT COUNT(*) FROM DR$CTX_IND$C' into n_pending;
exception when others then
if (sqlcode != -942) then
raise;
end if;
end;
if (n_pending = 0) then
execute immediate 'SELECT COUNT(*) FROM CTX_USER_PENDING WHERE PND_INDEX_NAME = :1'
into n_pending using 'CTX_IND';
end if;
return n_pending;
end get_pending;
begin
-- Fill in the pending queue
CTX_DDL.POPULATE_PENDING('CTX_IND');
n_pending := get_pending;
while (n_pending > 0) loop
-- Populate the index through sync_index
CTX_DDL.SYNC_INDEX('CTX_IND', maxtime => 1);
n_pending := get_pending;
end loop;
end;
/
4.5.4 カスタムのCONTEXT索引例: HTMLドキュメントの索引付け
URLで指定されたHTMLドキュメント・セットを索引付けする場合は、CREATE INDEX
文でシステム定義プリファレンスであるNULL_FILTER
を指定します。
HTML_SECTION_GROUP
を使用するhtmgroup
セクション・グループおよびNETWORK_DATASTORE
を使用するNETWORK_PREF
データストアを指定できます。
begin ctx_ddl.create_preference('NETWORK_PREF','NETWORK_DATASTORE'); ctx_ddl.set_attribute('NETWORK_PREF','HTTP_PROXY','www-proxy.us.example.com'); ctx_ddl.set_attribute('NETWORK_PREF','NO_PROXY','us.example.com'); ctx_ddl.set_attribute('NETWORK_PREF','TIMEOUT','300'); end; begin ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP'); ctx_ddl.add_zone_section('htmgroup', 'heading', 'H1'); end;
それから、ドキュメントを索引付けできます。
CREATE INDEX myindex on docs(htmlfile) indextype is ctxsys.context parameters( 'datastore NETWORK_PREF filter ctxsys.null_filter section group htmgroup' );
ノート:
Oracle Database 19c以降、Oracle TextのURL_DATASTORE
型は非推奨になりました。かわりに、NETWORK_DATASTORE
を使用してください。
関連トピック
4.5.5 CONTEXT索引例: FILTER BYおよびORDER BYによる問合せ処理
複合問合せで問合せ処理を効率化し応答時間を短縮するため、次の例に示すようにFILTER
BY
句およびORDER
BY
句を使用します。
CREATE INDEX myindex on docs(text) INDEXTYPE is CTXSYS.CONTEXT FILTER BY category, publisher, pub_date ORDER BY pub_date desc;
問合せ時にFILTER
BY
category,
publisher,
pub_date
句を指定したため、Oracle Textではこれらの列上の関連の述語をOracle Text索引の行ソースに入れることも考慮します。
また、問合せに一致するORDER
BY
条件がある場合、応答時間を短縮するために、ORDER
BY
pub_date desc
を指定することで、Oracle Textにより、SORT
をOracle Text索引の行ソースに入れるかどうかが決定されます。