8 CTX_DDLパッケージ
CTX_DDL
PL/SQLパッケージには、テキスト索引に必要なプリファレンス、セクション・グループおよびストップリストを作成および管理するプロシージャが用意されています。
CTX_DDL
には、次のストアド・プロシージャおよびファンクションが含まれています。
名前 | 説明 |
---|---|
属性セクションをXMLセクション・グループに追加します。 |
|
自動最適化の対象である索引のリストに、索引またはパーティションを追加します。 |
|
フィールド・セクションを作成し、指定したセクション・グループに割り当てます。 |
|
索引をカタログ索引プリファレンスに追加します。 |
|
ドキュメントの |
|
|
|
|
|
|
|
|
|
|
|
既存のセクション・グループ属性の値のリストに、セクション・グループ属性値を追加します。 |
|
特殊セクションをセクション・グループに追加します。 |
|
ストップクラスをストップリストに追加します。 |
|
停止セクションを自動セクション・グループに追加します。 |
|
ストップテーマをストップリストに追加します。 |
|
ストップワードをストップリストに追加します。 |
|
サブレクサーをマルチレクサー・プリファレンスに追加します。 |
|
ゾーン・セクションを作成し、それを指定されたセクション・グループに追加します。 |
|
ポリシーのコピーを作成します。 |
|
|
|
|
|
テキスト・データ・ディクショナリにプリファレンスを作成します。 |
|
テキスト・データ・ディクショナリにセクション・グループを作成します。 |
|
受け取った索引に対してポリシーを作成します。非パーティション索引の場合は、索引表も作成します。 |
|
ストップリストを作成します。 |
|
索引セットを削除します。 |
|
ポリシーを削除します。 |
|
テキスト・データ・ディクショナリからプリファレンスを削除します。 |
|
テキスト・データ・ディクショナリからセクション・グループを削除します。 |
|
シャドウ索引を削除します。 |
|
ストップリストを削除します。 |
|
シャドウ索引のメタデータとデータをスワップします。 |
|
索引を最適化します。 |
|
元表または表パーティション内のROWIDすべてを含めた保留キューを移入します。 |
|
CTX_DDLプリファレンスに関連するプロシージャが暗黙的なコミットを発行するかどうか指定します。 |
|
受け取った索引を再作成します。 |
|
既存のセクション・グループ属性の値のリストから、特定のセクション・グループ属性値を削除します。 |
|
自動最適化の対象である索引のリストから、索引またはパーティションを削除します。 |
|
|
|
ドキュメントから |
|
セクション・グループからセクションを削除します。 |
|
ストップクラスをストップリストから削除します。 |
|
ストップリストからストップテーマを削除します。 |
|
ストップリストからストップワードを削除します。 |
|
サブレクサーをマルチレクサー・プリファレンスから削除します。 |
|
ローカル・ドメイン索引のメタデータを置換します。 |
|
プリファレンスの属性を設定します。 |
|
名前で指定したセクション・グループに、セクション・グループ固有の属性を追加します。 |
|
セクション属性を設定します。 |
|
索引を同期化します。 |
|
プリファレンスから属性の設定を削除します。 |
|
サブレクサーを更新します。 |
|
セクション・グループ固有の属性を削除します。 |
|
ポリシーを更新します。 |
|
SDATAセクションを更新します。 |
ノート:
CREATE_PREFERENCE
およびCREATE_SECTION_GROUP
を除いて、CTX_DDL
パッケージのAPIは、スキーマまたは所有者名を接頭辞として使用する識別子をサポートしていません。
8.1 ADD_ATTR_SECTION
属性セクションをXMLセクション・グループに追加します。このプロシージャは、XMLドキュメントの属性をセクションとして定義する場合に有効です。これによって、WITHIN
演算子を使用してXML属性テキストを検索できます。
ノート:
AUTO_SECTION_GROUP
を使用すると、属性セクションが自動的に作成されます。自動的に作成された属性セクションは、tag@attribute
という形式でネーミングされます。
構文
CTX_DDL.ADD_ATTR_SECTION( group_name IN VARCHAR2, section_name IN VARCHAR2, tag IN VARCHAR2);
- group_name
-
XMLセクション・グループの名前を指定します。属性セクションは、XMLセクション・グループにのみ追加できます。
- section_name
-
属性セクションの名前を指定します。この名前は、属性テキストに対する
WITHIN
問合せで使用されます。指定するセクション名には、コロン(:)、カンマ(,)またはドット(.)は使用できません。また、セクション名は、
group_name
の中で一意であることが必要です。セクション名の大/小文字は区別されません。属性セクション名の長さは、64バイト以内にしてください。
- tag
-
属性の名前は、tag@attrという形式で指定します。このパラメータでは、大/小文字が区別されます。
例
次のように、TITLE
属性を持つBOOK
タグを定義するXMLファイルがあるとします。
<BOOK TITLE="Tale of Two Cities"> It was the best of times. </BOOK>
タイトル属性を属性セクションとして定義するには、次のようにXML_SECTION_GROUP
を作成し、属性セクションを定義します。
begin ctx_ddl.create_section_group('myxmlgroup', 'XML_SECTION_GROUP'); ctx_ddl.add_attr_section('myxmlgroup', 'booktitle', 'BOOK@TITLE'); end;
このようにTITLE
属性セクションを定義し、ドキュメント・セットを索引付けすると、次のようにXML属性テキストを問い合せることができます。
'Cities within booktitle'
8.2 ADD_AUTO_OPTIMIZE
自動最適化の対象である索引のリストに、索引またはパーティションを追加します。パーティション索引の場合はパーティションの名前を指定する必要があり、指定しないとエラーが発生します。グローバル索引の場合はSTAGE_ITAB
を有効にする必要があり、有効にしないとエラーが発生します。
AUTO_OPTIMIZE
機能により、STAGE_ITAB
機能を使用する索引の管理性が向上します。STAGE_ITAB
機能は、新しく同期化されたドキュメントから投稿を収集するため、$Gステージング表を導入しています。
AUTO_OPTIMIZE
機能の目的は、次のとおりです。
-
索引およびパーティションをバックグラウンド
AUTO_OPTIMIZE
プロセスに登録できます。 -
適切な時間に$G表から$Iに行を自動的に移動します。
-
$Gから$Iへの行の移動が問合せパフォーマンスを最大化する方法で実行されます。
このプロシージャは、まだ起動していない場合にバックグラウンド・プロセスを起動します。自動最適化のプロセスは、CTXロギングによって追跡されます。
このプロシージャによる変更は、ただちに有効になります。
構文
CTX_DDL.ADD_AUTO_OPTIMIZE(
idx_name IN VARCHAR2, part_name IN VARCHAR2 default NULL, optlevel IN VARCHAR2 default CTX_DDL.OPTLEVEL_MERGE );
- idx_name
-
追加する索引の名前を指定します。
- part_name
-
追加するパーティションの名前を指定します。
- optlevel
-
CTX_DDL.OPTIMIZE_INDEX
プロシージャのoptlevel
を指定します。このパラメータで唯一有効な値はmerge
です。
ノート
自動最適化を使用するときの推奨ステップは、次のとおりです。
-
必要な索引を作成します。
-
CTX_DDL.ADD_AUTO_OPTIMIZE
プロシージャを使用して、自動最適化リストに索引を追加します。
索引の同期化操作によって、自動最適化ジョブの実行は自動的に開始されます(すでに実行中の場合は除く)。このジョブは、処理対象がなくなるまで続行されます。今後の索引同期化でも、すでに実行中でないかぎり、自動最適化ジョブの実行は自動的に始まります。
8.3 ADD_FIELD_SECTION
フィールド・セクションを作成し、そのセクションを既存のセクション・グループに追加します。これによって、WITHIN演算子を使用してフィールド・セクション内を検索できます。追加できるフィールド・セクションの数は無制限です。
フィールド・セクションは開始および終了タグで区切られます。デフォルトでは、フィールド・セクション内のテキストは、ドキュメントの残りの部分とは別のサブドキュメントとして索引付けされます。
ゾーン・セクションとは異なり、フィールド・セクションはネストまたはオーバーラップできません。このため、フィールド・セクションは非繰返しセクション、非オーバーラップ・セクション(電子メール型またはニュース型ドキュメントのTITLE
やAUTHOR
マークアップなど)に最適です。
フィールド・セクションの索引付けによって、フィールド・セクションに対するWITHIN問合せは、通常、ゾーン・セクションに対するWITHIN
問合せより高速になります。
構文
CTX_DDL.ADD_FIELD_SECTION( group_name IN VARCHAR2, section_name IN VARCHAR2, tag IN VARCHAR2, visible IN BOOLEAN default FALSE );
- group_name
-
section_name
を追加するセクション・グループの名前を指定します。1つのセクション・グループに追加できるフィールド・セクションの数は無制限です。同じグループ内では、セクション・ゾーン名とセクション・フィールド名は同じ名前にできません。 - section_name
-
group_name
に追加するセクションの名前を指定します。この名前は、問合せでセクションを識別する場合に使用します。英数字以外の文字(_など)は問合せでエスケープされるため、これらの文字を含む名前は使用しないでください。セクション名の大/小文字は区別されません。ノート:
section_name
の接頭辞として、スキーマまたは所有者名はこの構文でサポートされていないため、使用できません。同じグループ内では、ゾーン・セクション名とフィールド・セクション名は同じ名前にできません。語句PARAGRAPHおよびSENTENCEは、特殊セクション用に予約されています。
セクション名はタグ内で一意である必要はありません。詳細を検索しやすいように、同じセクション名を複数のタグに割り当てることができます。
- tag
-
セクションの開始をマークするタグを指定します。たとえば、タグが<H1>の場合は、H1を指定します。指定する開始タグは、セクション・グループ内で一意であることが必要です。
ノート:
タグの接頭辞として、スキーマまたは所有者名はこの構文でサポートされていないため、使用できません。
group_name
がHTML_SECTION_GROUP
の場合は、METAタグのNAME/CONTENT
属性の組に対してフィールド・セクションを作成できます。それには、tag
をmeta@namevalue
として指定します。この場合、namevalue
はNAME
属性の値で、対応するCONTENT
属性がセクションとして索引付けられます。「<META>タグに対するセクションの作成」の例を参照してください。Oracle Textは、セクション・グループ作成時に指定した
group_type
パラメータから終了タグを認識します。 - visible
-
ドキュメントの残りの部分でテキストを参照できるようにするには、
TRUE
を指定します。デフォルトでは、
visible
フラグはFALSE
です。これは、フィールド・セクション内のテキストがドキュメントの残りの部分とは別のサブドキュメントとしてOracle Textにより索引付けされることを意味します。ただし、フィールド・セクション内のテキストをドキュメント全体の一部として索引付けする場合は、visibleフラグをTRUE
に設定できます。
例
Visibleなフィールド・セクションおよびInvisibleなフィールド・セクション
次の例は、BASIC_SECTION_GROUP
型のセクション・グループbasicgroup
を定義します。(BASIC_SECTION_GROUP
型の詳細は、「セクション・グループ型」"を参照してください。)次に、<A>
タグに対してAuthor
というフィールド・セクションをbasicgroup
に作成します。
また、visibleフラグはFALSE
に設定します。
begin
ctx_ddl.create_section_group('basicgroup', 'BASIC_SECTION_GROUP'); ctx_ddl.add_field_section('basicgroup', 'Author', 'A', FALSE);
end;
Author
フィールド・セクションは参照不能であるため、Author
セクション内のテキストを検索するには、次のようにWITHIN演算子を使用する必要があります。
'(Martin Luther King) WITHIN Author'
WITHIN
演算子を使用せずにMartin Luther Kingを問い合せても、フィールド・セクション内のこの語句のインスタンスは戻りません。WITHIN
を指定しないでフィールド・セクション内のテキストを問い合せるには、セクション作成時に次のようにvisibleフラグをTRUE
に設定する必要があります。
begin ctx_ddl.add_field_section('basicgroup', 'Author', 'A', TRUE); end;
<META>
タグに対するセクションの作成
HTML_SECTION_GROUP
を使用すると、META
タグに対するセクションを作成できます。
次のように、META
タグを持つHTMLドキュメントがあるとします。
<META NAME="author" CONTENT="ken">
<META NAME="author">
タグに対してCONTENT
属性を索引付けたフィールド・セクションを作成します。
begin ctx_ddl.create_section_group('myhtmlgroup', 'HTML_SECTION_GROUP'); ctx_ddl.add_field_section('myhtmlgroup', 'author', 'META@AUTHOR'); end
セクション・グループmygroup
で索引付けした後、次のようにドキュメントを問い合せます。
'ken WITHIN author'
制限事項
ネストされたセクション
フィールド・セクションはネストできません。たとえば、フィールド・セクションを<TITLE>
で始まるように定義し、別のフィールド・セクションを<FOO>
で始まるように定義した場合、この2つのセクションは次のようにネストすることはできません。
<TITLE> dog <FOO> cat </FOO> </TITLE>
ネストされたセクションを使用するには、これらをゾーン・セクションとして定義します。
繰返しフィールド・セクションは使用できますが、WITHIN
問合せはこれらを1つのセクションとして処理します。次に、ドキュメントの繰返しフィールド・セクションの例を示します。
<TITLE> cat </TITLE> <TITLE> dog </TITLE>
問合せ(dog and cat)within titleは、これらのワードが別々のセクション内に出現する場合にも、ドキュメントを戻します。
WITHIN
問合せで繰返しセクションを区別するには、これらをゾーン・セクションとして定義します。
8.4 ADD_INDEX
サブ索引をカタログ索引プリファレンスに追加します。このプリファレンスを作成するには、元表の1つ以上の列に名前を付けます。
サブ索引を作成して構造化問合せの応答時間を改善するため、問合せ時には、追加する列をCATSEARCH
演算子のstructured_query
句で使用する必要があります。
構文
CTX_DDL.ADD_INDEX( set_name IN VARCHAR2, column_list IN VARCHAR2, storage_clause IN VARCHAR2 );
例
次のスキーマを使用してAUCTION
という表について考えます。
create table auction(
item_id number, title varchar2(100), category_id number, price number, bid_close date);
表の問合せには、category_id
に対する必須のテキスト問合せ句とオプションの構造化条件が含まれているとします。結果は、bid_close
に基づいてソートする必要があります。
ユーザーが入力する可能性がある様々なタイプの構造化問合せをサポートするために、カタログ索引を作成できます。
索引を作成する場合は、最初に索引セット・プリファレンスを作成した後、そのプリファレンスに必要な索引を追加するには:
begin ctx_ddl.create_index_set('auction_iset'); ctx_ddl.add_index('auction_iset','bid_close'); ctx_ddl.add_index('auction_iset','category_id, bid_close'); end;
結合されたカタログ索引は、CREATE
INDEX
を使用して次のように作成します。
create index auction_titlex on AUCTION(title) indextype is CTXCAT parameters ('index set auction_iset');
問合せ
ワードpokemonのtitle列を問い合せるには、次のように、通常の複合問合せを入力します。
select * from AUCTION where CATSEARCH(title, 'pokemon',NULL)> 0; select * from AUCTION where CATSEARCH(title, 'pokemon', 'category_id=99 order by bid_close desc')> 0;
ノート
索引セットのCTXCAT
索引の列リストにあるVARCHAR2
列は、30バイトを超えることはできません。
関連項目
8.5 ADD_MDATA
MDATA
セクションとして指定されているドキュメントのメタデータを変更します。
このコールの後で、名前が付けられたMDATA
値を含むMDATA
問合せにより、このMDATA
値のあるドキュメントが検索されます。
CTX_DDL.ADD_MDATA
には2つのバージョンがあります。単一のメタデータ値を単一のROWIDに追加するバージョンと、複数の値または複数のROWID(あるいはその両方)を処理するバージョンです。
CTX_DDL.ADD_MDATA
はトランザクション型です。つまり、コールするセッションで即時に機能し、そのコールするセッションのみで表示でき、ROLLBACK
コマンドを使用して無効にできます。また、永続的に機能させるには、コミットが必要です。
すでに索引付けされているドキュメントからメタデータ値を削除するには、CTX_DDL.REMOVE_MDATAを使用します。ADD_MDATA
およびREMOVE_MDATA
をコールできるのは、索引の所有者のみです。
構文
これは、単一の値を単一のROWIDに追加する構文です。
CTX_DDL.ADD_MDATA( idx_name IN VARCHAR2, section_name IN VARCHAR2, mdata_value IN VARCHAR2, mdata_rowid IN VARCHAR2, [part_name] IN VARCHAR2] );
- idx_name
-
名前が付けられたrowidを含むテキスト索引の名前。
- section_name
-
MDATA
セクションの名前。 - mdata_value
-
ドキュメントに追加するメタデータ値。
- mdata_rowid
-
メタデータ値を追加するROWID。
- [part_name]
-
索引パーティションの名前(ある場合)。ローカル・パーティション索引に指定する必要があり、グローバルの非パーティション索引ではNULLである必要があります。
これは、複数の値または複数のROWID(あるいはその両方)を渡す構文です。新しい値またはROWIDの数が多い場合は、このバージョンが効率的です。
CTX_DDL.ADD_MDATA( idx_name IN VARCHAR2, section_name IN VARCHAR2, mdata_values SYS.ODCIVARCHAR2LIST, mdata_rowids SYS.ODCIRIDLIST, [part_name] IN VARCHAR2] );
例
この例では、単一の値を更新します。
select rowid from mytab where contains(text, 'MDATA(sec, value')>0; No rows returned exec ctx_ddl.add_mdata('my_index', 'sec', 'value', 'ABC'); select rowid from mytab where contains(text, 'MDATA(sec, value')>0; ROWID ----- ABC
この例では、複数の値を更新します。
begin ctx_ddl.add_mdata('my_index', 'sec', sys.odcivarchar2list('value1','value2','value3'), sys.odciridlist('ABC','DEF')); end;
これは、次の操作に相当します。
begin ctx_ddl.add_mdata('my_index', 'sec', 'value1', 'ABC'); ctx_ddl.add_mdata('my_index', 'sec', 'value1', 'DEF'); ctx_ddl.add_mdata('my_index', 'sec', 'value2', 'ABC'); ctx_ddl.add_mdata('my_index', 'sec', 'value2', 'DEF'); ctx_ddl.add_mdata('my_index', 'sec', 'value3', 'ABC'); ctx_ddl.add_mdata('my_index', 'sec', 'value3', 'DEF'); end;
ノート
ROWIDが索引付けされていない場合、CTX_DDL.ADD.MDATA
はエラーなしで完了しますが、エラーはCTX_USER_INDEX_ERRORS
にロギングされます。
これらの更新は、元表に格納されている実際の内容ではなく索引自体に直接反映されます。したがって、テキスト索引が再構築されるとそれらは存在しなくなります。
関連項目
関連項目:
『Oracle Textアプリケーション開発者ガイド』の第8章「Oracle Textでのドキュメント・セクションの検索」
8.6 ADD_MDATA_COLUMN
column_nameで名前が指定されているFILTER
BY
列をsection_nameで名前が指定されているMDATA
セクションにマップします。
構文
構文は次のとおりです。
CTX_DDL.ADD_MDATA_COLUMN( group_name IN VARCHAR2, section_name IN VARCHAR2, column_name IN VARCHAR2, );
制限事項
CTX_DDL.ADD_MDATA_COLUMN
を使用して作成したMDATA
セクションの値は、CTX_DDL.ADD_MDATA
またはCTX_DDL.REMOVE_MDATA
では変更できません。変更すると、エラーが戻ります。セクションの値はSQLを使用して更新する必要があります。
ノート
-
MDATA
セクションに格納されるデータ型はtext
です。したがって、FILTER
BY
列の値は索引付けの際にtext
に変換されます。text以外のデータ型の場合は、索引付けの際にFILTER
BY
列が内部形式に正規化されます。MDATA
演算子を使用してセクションを問い合せる場合も、処理の前にMDATA
問合せ文字列が内部形式に正規化されます。 -
FILTER
BY
列をMDATA
としてマップすると、Oracle Textのコストベース・オプティマイザでは、Oracle Textのコンポジット・ドメイン索引を使用しないようにして、そのFILTER
BY
列の範囲述語が処理されます。これは、MDATA
のFILTER
BY
列に対する範囲述語の処理効率が、SDATA
として宣言された場合より低くなるためです。したがって、列に対して範囲検索を行う予定がある場合は、FILTER
BY
列をMDATA
として追加しないでください。
8.7 ADD_MDATA_SECTION
MDATA
セクションを値とともに既存のセクション・グループに追加します。MDATA
セクションは、NULLセクション・グループ、PATHセクション・グループまたはAUTOセクション・グループには追加できません。
セクション値は簡易正規化されます。
-
値に隣接する空白は削除されます。
-
値は255バイトに切り捨てられます。
-
値は単一の値として索引付けされます。値が複数のワードから構成されていても、分割されません。
-
大/小文字の区別は保持されます。ドキュメントが動的に生成される場合は、
MDATA
値を大文字にし、検索対象を大文字のみにすることで大/小文字の無区別を実装します。
セクションを削除するには、CTX_DDL.REMOVE_SECTION を使用します。
構文
CTX_DDL.ADD_MDATA_SECTION( group_name IN VARCHAR2, section_name IN VARCHAR2, tag IN VARCHAR2, read_only IN BOOLEAN default FALSE);
- group_name
-
MDATA
セクションを含むセクション・グループの名前。 - section_name
-
MDATA
セクションの名前。 - tag
-
MDATA
セクションの値。たとえば、セクションが<AUTHOR>
である場合、値はCynthia Kadohata (小説『The Floating World』の著者)などとなります。指定したMDATA
セクションに複数のtagを割り当てることができます。 - read_only
-
MDATAセクションで
CTX_DDL.ADD_MDATA()
およびCTX_DDL.REMOVE_MDATA()
のコールを許可する場合はFALSE
(デフォルトt)、許可しない場合はTRUE
に設定します。FALSE
に設定すると、MDATA
セクションでの問合せの効率が低下します。そのMDATA
セクションで検出された値を追跡するには索引表でカーソルを開く必要があるからです。
例
この例では、auth
というMDATA
セクションを作成します。
ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP'); ctx_ddl.add_mdata_section('htmgroup', 'auth', 'author', READ_ONLY);
8.8 ADD_NDATA_SECTION
同じようなスペルの一致を検索します。NDATA
セクションの値は、他のセクションのようにドキュメント・テキストから抽出されます。ただし、名前データとして索引付けされます。NDATA
セクションは、CTX_USER_SECTIONS
ビューに格納されます。
構文
CTX_DDL.ADD_NDATA_SECTION( group_name IN VARCHAR2, section_name IN VARCHAR2, tag IN VARCHAR2 );
ノート
NDATA
セクションは、シングルバイト・データおよびマルチバイト・データをサポートします。ただし、文字および語句ベースで制限があります。索引付けされるNDATA
セクション・データには、次の制約があります。
-
1文字の空白で区切られた語句の文字数
511
-
空白で区切られた語句の数
255
-
空白を含む文字の総数
511
これらの制約を超えるNDATA
セクション・データは切り捨てられます。
例
次の例は、BASIC_SECTION_GROUP
型のセクション・グループnamegroup
を定義します。さらに、firstname
というnamegroup
のNDATA
セクションを作成します。
begin ctx_ddl.create_section_group('namegroup', 'BASIC_SECTION_GROUP'); ctx_ddl.add_ndata_section('namegroup', 'firstname', 'fname1'); end;
8.9 ADD_SDATA_COLUMN
このプロシージャを使用して、(column_nameで指定されている) FILTER BY
列またはORDER BY
列を(section_nameで指定されている) SDATA
セクションにマップします。デフォルトでは、すべてのFILTER BY
列がSDATA
としてマップされます。
構文
構文は次のとおりです。
CTX_DDL.ADD_SDATA_COLUMN( group_name IN VARCHAR2, section_name IN VARCHAR2, column_name IN VARCHAR2, );
ノート
-
FILTER
BY
列のセクションへのマッピングはオプションです。FILTER
BY
列にセクション・マッピングが存在しない場合、その列はSDATA
セクションにマップされ、セクション名はFILTER
BY
列の名前になります。 -
コンポジット・ドメイン索引の
CREATE
INDEX
時にセクション・グループを指定しない場合は、デフォルト・セクション・グループ設定が使用され、FILTER
BY
およびORDER
BY
の各列に対してSDATA
セクションが作成されます。ノート:
セクション名では特定の特殊文字が使用できず、大/小文字が区別されないため、列名で大/小文字が区別されているかまたは特殊文字が使用されている場合は、エラーが発生します。この問題を回避するには、索引を作成する前に、列を
MDATA
またはSDATA
セクションにマップする必要があります。 -
MDATA
にマップされている列がORDER
BY
列句でも使用されている場合は、エラーが発生します。 -
列セクション名は、セクション・グループ内で一意です。つまり、
FOO
というMDATA
列セクションがすでにある場合、MDATA
列セクション名にFOO
を指定することはできません。また、FOO
というSDATA
列セクションがすでにある場合、フィールド・セクション名にFOO
を使用することはできません。このルールは、列セクションの作成方法が暗黙的(FILTER
BY
またはORDER
BY
句のCREATE
INDEX
で作成)か、明示的(CTX_DDL.ADD_SDATA_COLUMN
で作成)かに関係なく適用されます。 -
1つの
FILTER
BY
列にマップできるのは1つのセクション名のみで、その逆もまた同様です。たとえば、1つのセクションを複数の列にマップしたり、1つの列を複数のセクションにマップすることはできません。 -
列セクションは、
NULL
のセクション・グループも含めて、あらゆるタイプのセクション・グループに追加できます。 -
SDATA
セクションおよび列の最大数は99です。 -
FILTER BY
列またはORDER BY
列のデータ型がDATE
の場合、DATE
データ型の値はYYYY-MM-DD
またはYYYY-MM-DD HH24:MI:SS
の形式に従う必要があります。たとえば、2006年11月24日午後10時32分36秒のDATE
値を格納する場合、ドキュメントに含まれる内容は<TAG>2006-11-24 22:32:36</TAG>
になります。
8.10 ADD_SDATA_SECTION
SDATA
セクションをセクション・グループに追加します。デフォルトでは、すべてのFILTER
BY
列がSDATA
としてマップされます。
SDATA
セクションがサポートされています。索引に作成できるSDATAセクションの数は制限されません。つまり、FILTER
BY
およびORDER
BY
で暗黙的に作成され、CTX_DDL.ADD_SDATA_SECTION()
プロシージャで明示的に作成される索引のSDATA
セクションの合計に制限はありません。FILTER BY
およびORDER BY
を含むCDIの合計数は32ですが、サポートされているSDATA
セクションの数に制限はありません。SDATA
セクションのタイプは、次の2つです。
-
検索可能: SDATAセクションの検索で最適化を作成します。これは、セクションでのドキュメントごとの複数値および効率的な範囲検索機能をサポートしています。
-
ソート可能: SDATAセクションのソートで最適化を作成します。セクションでのドキュメントごとの単一の値をサポートしています。
optimized_for
属性を設定しない場合、セクションのデフォルトのタイプはSortableです。コンポジット・ドメイン索引は、FILTER BY
またはORDER BY
評価の効率化のために、Sortable SDATAを内部的に使用します。
Oracle Databaseリリース18cからは、optimized_for
属性にsort
、search
またはsort_and_search
を設定して作成したSDATAセクションで、グループ・カウントまたはファセットがサポートされます。optimized_for
属性は、CTX_DDL.SET_SECTION_ATTRIBUTE
プロシージャを使用して設定できます。
関連項目:
-
ファセットとしてセクションを定義する方法の詳細は、『Oracle Textアプリケーション開発者ガイド』を参照してください
構文
構文は次のとおりです。
CTX_DDL.ADD_SDATA_SECTION( group_name IN VARCHAR2, section_name IN VARCHAR2, tag IN VARCHAR2, datatype IN VARCHAR2 default NULL, );
- group_name
-
セクションを含むグループの名前。
- section_name
-
SDATA
セクションの名前。 - tag
-
SDATA
セクションに追加するタグの名前。 - datatype
-
格納されるデータの形式を指定し、後で
SDATA
演算子で使用する比較のセマンティクスを指定します。SortableSDATA
セクションは、次のデータ型をサポートしています。-
VARCHAR2
-
CHAR
-
RAW
-
NUMBER
-
DATE
VARCHAR2
データ型は、最大249バイトの文字データをデータベース文字セットで格納します。この制限を超えると、ドキュメント単位での索引付けエラーになります。SDATA
セクション値の前後の空白は、抽出時にセクショナによって常に切り捨てられます。この処理方法は、SDATA
列の場合とは異なります。列の値が切り捨てられることはありません。どのデータ型のSDATA
の値についても、レクサー処理は実行されません。CHAR
データ型は、最大249バイトの文字データをデータベース文字セットで格納します。この制限を超えると、ドキュメント単位での索引付けエラーになります。SDATA
セクション値の前後の空白は、抽出時にセクショナによって常に切り捨てられます。この処理方法は、SDATA
列の場合とは異なります。列の値が切り捨てられることはありません。どのデータ型のSDATA
の値についても、レクサー処理は実行されません。SQLとの一貫性を確保するために、CHAR
データ型のSDATA
値の比較では空白が埋められて比較されます。RAW
データ型は、最大249バイトのバイナリ・データを格納します。この制限を超えると、ドキュメント単位での索引付けエラーになります。値は、16進文字列表現から変換されます。つまり、65
の値を格納する場合、ドキュメントに含まれる内容は<TAG>65</TAG>
や<TAG>A</TAG>
ではなく、<TAG>40</TAG>
になります。DATE
データ型の値は、YYYY-MM-DD
またはYYYY-MM-DD HH24:MI:SS
の書式に従う必要があります。つまり、2006年11月24日午後10時32分36秒のDATE
値を格納する場合、ドキュメントに含まれる内容は<TAG>2006-11-24 22:32:36</TAG>
になります。検索可能
SDATA
セクションは、次のデータ型をサポートします。-
VARCHAR2
-
RAW
-
NUMBER
-
DATE
-
BINARY_FLOAT
-
BINARY_DOUBLE
-
TIMESTAMP
-
TIMESTAMP_WITH_TIMEZONE
ノート:
検索可能
SDATA
セクションは、CHAR
データ型をサポートしていません。BINARY_FLOAT
データ型は、32ビットの浮動小数点数を格納します。BINARY_DOUBLE
データ型は、64ビットの浮動小数点数を格納します。TIMESTAMP
データ型は、DATE
データ型の拡張です。日付の年、月、日の値、および、時刻の時、分、および秒の値が格納されます。DATE
データ型では格納されない小数秒も格納されます。小数秒の精度は、9以下です。TIMESTAMP
値は、ISO書式に従う必要があります。TIMESTAMP
リテラルは、YYYY-MM-DDTHH:MI:SS
の形式で指定できます。TIMESTAMP
値の例を次に示します。<TAG>1997-11-05T19:20:00</TAG>
TIMESTAMP_WITH_TIMEZONE
はTIMESTAMP
データ型のバリアントで、値にはタイム・ゾーン・オフセットまたはタイム・ゾーン・リージョン名が含まれます。小数秒の精度は、9以下です。TIMESTAMP_WITH_TIMEZONE
値は、ISO書式に従う必要があります。TIMESTAMP_WITH_TIMEZONE
値の例を次に示します。<TAG>1997-12-31T19:20:00-05:00</TAG>
-
例
次の例では、SDATAセクションの作成方法を示します。
create table tab(id number, info varchar2(100));
insert into tab values(1,'Hello World<fruit>apple</fruit><price>3</price>');
insert into tab values(2,'Hello World<fruit>orange</fruit><price>5</price>');
前述の文は、データが2行あるtabという名の表を作成します。
次の文は、sg
という基本セクション・グループを作成し、SDATAセクションをグループに追加してSDATAを検索可能にします。
exec ctx_ddl.create_section_group('sg', 'basic_section_group');
exec ctx_ddl.add_sdata_section('sg','fruit','fruit','varchar2');
exec ctx_ddl.set_section_attribute('sg','fruit','optimized_for','search');
exec ctx_ddl.add_sdata_section('sg','price','price','number');
exec ctx_ddl.set_section_attribute('sg','price','optimized_for','search');
次の文では、sg
に索引が作成されます。
create index idx on tab(info) indextype is ctxsys.context parameters ('section group sg');
次の文は、tab
を問い合せて、検索可能SDATAを示します。
問合せ1
select id from tab where CONTAINS(info, 'SDATA(fruit = "apple")'); return id 1
問合せ2
select id from tab where CONTAINS(info, 'Hello and SDATA(price > 4)'); return id 2
制限事項
-
指定のドキュメントに
SDATA
タグがない場合は、NULL
のSDATA
値として処理されます。 -
空の
SDATA
タグはNULL
値として処理されます。 -
SDATA
セクションはネストできません。内部でネストされたセクションは無視されます。 -
SDATA
セクションは、skipjoins
およびprintjoins
の文字をサポートしていません。
8.12 ADD_SPECIAL_SECTION
特殊セクション(SENTENCE
またはPARAGRAPH
)をセクション・グループに追加します。これによって、WITHIN演算子を使用して、ドキュメントの文または段落内を検索できるようになります。
ドキュメントの特殊セクションは、ゾーン・セクションおよびフィールド・セクションとして明示的にタグ付けされていないセクションです。索引が作成されると、特殊セクションの開始および終了が検出されます。Oracle Textでは、段落および文の2つのセクションparagraphおよびsentenceをサポートします。
文および段落の境界は、レクサーが判断します。たとえば、レクサーはSENTENCEセクションまたはPARAGRAPHセクションの境界を次のように認識します。
表8-1 PARAGRAPHセクションとSENTENCEセクションの境界
特殊セクション | 境界 |
---|---|
SENTENCE |
WORD/PUNCT/WHITESPACE |
SENTENCE |
WORD/PUNCT/NEWLINE |
PARAGRAPH |
WORD/PUNCT/NEWLINE/WHITESPACE(インデント・スタイルの段落) |
PARAGRAPH |
WORD/PUNCT/NEWLINE/NEWLINE(ブロック・スタイルの段落) |
punctuation、whitespaceおよびnewlineの各文字は、レクサーの設定によって判断されます。これらの設定は変更できます。
レクサーが境界を認識できない場合、SENTENCEセクションまたはPARAGRAPHセクションはいずれも索引付けされません。
構文
CTX_DDL.ADD_SPECIAL_SECTION( group_name IN VARCHAR2, section_name IN VARCHAR2 );
例
次の例は、HTMLドキュメントの文内での検索を可能にします。
begin ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP'); ctx_ddl.add_special_section('htmgroup', 'SENTENCE'); end;
文検索の他にゾーン検索を可能にするには、ゾーン・セクションをグループに追加します。次の例では、ゾーン・セクションHeadline
をセクション・グループhtmgroup
に追加します。
begin ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP'); ctx_ddl.add_special_section('htmgroup', 'SENTENCE'); ctx_ddl.add_zone_section('htmgroup', 'Headline', 'H1'); end;
ドキュメント内での文検索または段落検索のみが必要で、ゾーン・セクションまたはフィールド・セクションを定義する必要がない場合は、次のようにNULL_SECTION_GROUP
を使用します。
begin ctx_ddl.create_section_group('nullgroup', 'NULL_SECTION_GROUP'); ctx_ddl.add_special_section('nullgroup', 'SENTENCE'); end;
8.13 ADD_STOPCLASS
ストップクラスをストップリストに追加します。ストップクラスは、索引付けされていないトークンのクラスです。ストップリストは、ストップパターンを使用した250以上のストップクラスを指定できません。これは、NUMBERS
ストップクラスを含みません。ストップ・パターンを使用して索引付けする場合、索引付けのパフォーマンスを最適化するために、メモリー設定を少なくとも500MBから1GBにすることをお薦めします。
ストップクラスでサポートされている言語は英語のみです。
構文
CTX_DDL.ADD_STOPCLASS( stoplist_name IN VARCHAR2, stopclass IN VARCHAR2, stoppattern IN VARCHAR2 default NULL );
- stoplist_name
-
ストップリストの名前を指定します。
- stopclass
-
stoplist_name
に追加するストップクラスを指定します。NUMBERS
ストップクラスのいずれかです。それ以外の場合は、パターン・ストップクラスとみなされます。NUMBERS
には、数値パターンに従ったトークン、つまり小数点、numgroup
およびnumjoin
のみが含まれます。したがって、123ABCもA123も数値ではありません。これらはMIXED
としてラベル付けされます。$123は数値ではありません(英数字以外はデフォルトで空白になるため、このトークンはテキスト索引としては一般的ではありません)。米国では、123.45は数値ですが、123.456.789は数値ではありません。numgroupに'.'を使用する欧州では、これとは逆に123.456.789は数値ですが、123.45は数値ではありません。ストップクラス
parameter
にNUMBERSを指定しない場合は、パターン・ストップクラスとして扱われ、ストップクラスparameter
には任意の名前を指定できます。stopclassをパターン・クラスとして指定する場合は、stoppattern
パラメータにパターンを指定する必要があります。パターンには任意の文字列パターンを使用でき、これには数字や日付も含まれます。ストップリストに追加できるストップワード、ストップテーマおよびストップクラスの数の最大値は4095です。
- stoppattern
-
ストップリストに追加するストップ・パターンを指定します。ストップクラスをパターン・クラスとして指定する場合は、ストップ・パターンを指定する必要があります。ストップ・パターンの指定には、Oracle正規表現を使用できます。
ストップリストに複数のストップ・パターンを追加するには、
ADD_STOPCLASS
プロシージャを複数回コールします。ストップクラスに複数のストップ・パターンを追加するには、異なるストップクラス名を指定する必要があります。デフォルトでは、ストップ・パターンの大/小文字は区別されませんが、
MIXED_CASE
レクサー・プリファレンスを有効にすると、大/小文字を区別して動作するようになります。ストップ・パターンには、最大で512まで指定できます。ストップ・パターンを使用して索引付けする場合、索引付けのパフォーマンスを最適化するために、メモリー設定を少なくとも500MBから1GBにすることをお薦めします。
例
次の例は、ストップクラスNUMBERS
をストップリストmystoplist
に追加します。
begin ctx_ddl.add_stopclass('mystoplist', 'NUMBERS'); end;
次の例は、SSN
のパターン・ストップクラスをストップリストmystoplist
に追加します。
begin ctx_ddl.add_stopclass('mystoplist', 'SSN', '\d{3}-\d{2}-\d{4}'); end;
この例で、ストップクラスSSN
は、<3 digit number>-<2 digit number>-<4 digit number>というフォームのすべてのトークン、たとえば234-11-8902
に一致します。
8.14 ADD_STOP_SECTION
停止セクションを自動セクション・グループに追加します。停止セクションを追加すると、自動セクションの索引付け操作で、XMLドキュメント内の指定されたセクションが無視されます。
ノート:
停止セクションを追加すると、索引内にセクション情報が作成されません。ただし、停止セクション内のテキストは常に検索可能です。
停止セクションを追加することは、ドキュメントに下位レベルの情報タグが多数含まれる場合に有効です。また、停止セクションを追加すると、自動セクション・グループを使用した索引付けのパフォーマンスが向上します。
追加できる停止セクションの数は無制限です。
停止セクションにはセクション名がありません。したがって、セクション・ビューには記録されません。
構文
CTX_DDL.ADD_STOP_SECTION( section_group IN VARCHAR2, tag IN VARCHAR2 );
例
停止セクションの定義
次の例は、タグ<fluff>
で識別された停止セクションを自動セクション・グループmyauto
に追加します。
begin ctx_ddl.add_stop_section('myauto', 'fluff'); end;
また、この例は、<fluff>
内に含まれるすべての属性セクションも停止します。たとえば、次のコードを持つドキュメントがあるとします。
<fluff type="computer">
前述の例は、属性セクション fluff@type.
も停止します。
ドキュメント・タイプを区別する停止セクション
次の例は、mydoc
のルート要素を持つドキュメント内のみで、タグ<fluff>
に対する停止セクションを作成します。
begin ctx_ddl.add_stop_section('myauto', '(mydoc)fluff'); end;
8.15 ADD_STOPTHEME
単一のストップテーマをストップリストに追加します。ストップテーマは、索引付けされていないテーマです。
英語では、ABOUT演算子を使用して索引テーマを問い合せます。
構文
CTX_DDL.ADD_STOPTHEME( stoplist_name IN VARCHAR2, stoptheme IN VARCHAR2 );
例
次の例では、ストップテーマbanking
をストップリストmystop
に追加します。
begin ctx_ddl.add_stoptheme('mystop', 'banking'); end;
8.16 ADD_STOPWORD
単一のストップワードをストップリストに追加します。
ストップワードのリストを作成するには、ワードごとにこのプロシージャを1回コールする必要があります。
構文
CTX_DDL.ADD_STOPWORD(
stoplist_name IN VARCHAR2, stopword IN VARCHAR2, language IN VARCHAR2 default NULL, language_dependent IN BOOLEAN default TRUE
);
- stoplist_name
-
ストップリストの名前を指定します。
- stopword
-
追加するストップワードを指定します。
言語固有のストップワードは、その言語固有の他のストップワードとの間で一意であることが必要です。たとえば、ドイツ語のdieと英語のdieを同じストップリスト内に含めることは有効です。
ストップリストに追加できるストップワード、ストップテーマおよびストップクラスの数の最大値は4095です。
- language
-
stoplist_name
で指定したストップリストがMULTI_STOPLIST
型の場合は、stopword
の言語を指定します。Oracle Textがサポートしている言語のグローバリゼーション・サポート名または略称を指定する必要があります。ストップワードを複数の言語でアクティブにするには、このパラメータに
ALL
を指定します。たとえば、任意の言語で停止が必要な英語のフラグメントを含む国際文書の場合は、ALL
ストップワードを定義すると便利です。ALL
ストップワードは、すべての言語でアクティブです。マルチレクサーを使用すると、そのストップワードの言語固有のレクサー処理が発生します。この状態は、そのストップワードを複数の特定言語に繰り返し追加した場合と同じです。それ以外の場合は、
NULL
を指定します。 - language_dependent
-
ユーザー定義の任意の文字列を
language
パラメータに指定できることを指定するには、このパラメータをFALSE
に設定します。
例
単一言語のストップリスト
次の例では、ストップワードbecause、notwithstanding、nonethelessおよびthereforeをストップリストmystop
に追加します。
begin
ctx_ddl.add_stopword('mystop', 'because'); ctx_ddl.add_stopword('mystop', 'notwithstanding'); ctx_ddl.add_stopword('mystop', 'nonetheless'); ctx_ddl.add_stopword('mystop', 'therefore');
end;
マルチ言語のストップリスト
次の例では、ドイツ語のワードdieをマルチ言語のストップリストに追加します。
begin
ctx_ddl.add_stopword('mystop', 'Die','german');
end;
ALLストップワードの追加
次の例では、ワードtheをALL
ストップワードとして、マルチ言語のストップリストgloballistに追加します。
begin
ctx_ddl.add_stopword('globallist','the','ALL');
end;
ノート
-
ストップワードは、
ALTER INDEX
を使用して索引を作成した後に追加します。 -
ストップリストは、文字列値の
SDATA
セクションには影響しません。つまり、ストップワードがSDATA
セクション内に存在する場合、そのトークンは引き続き索引付けされ、SDATA
演算子を使用して問い合せることができます。
8.17 ADD_SUB_LEXER
サブレクサーをマルチレクサー・プリファレンスに追加します。サブレクサーは、マルチレクサー(マルチ言語)・プリファレンスで言語を識別します。複数の言語を索引付けする必要がある場合は、マルチレクサー・プリファレンスを使用します。
構文
CTX_DDL.ADD_SUB_LEXER( lexer_name IN VARCHAR2, language IN VARCHAR2, sub_lexer IN VARCHAR2, alt_value IN VARCHAR2 default NULL, language_dependent IN BOOLEAN default TRUE );
- lexer_name
-
マルチレクサー・プリファレンスの名前を指定します。
- language
-
サブレクサーのグローバリゼーション・サポート言語の名前または略称を指定します。たとえば、日本語に対しては
JAPANESE
またはJA
を指定します。sub_lexer
で指定したサブレクサーは、言語列が、language
の略称グローバリゼーション・サポート名と同等の値(大/小文字を区別しない)を持つ場合に使用されます。元表内の言語列の値がNULL、無効またはサブレクサーにマップされていない場合は、
DEFAULT
を指定し、デフォルトのサブレクサーを割り当てます。DEFAULT
レクサーも、ストップワードの解析に使用されます。指定した
language
に対するサブレクサー定義がすでに存在する場合は、このコールで置換されます。 - sub_lexer
-
この言語に対して使用するサブレクサーの名前を指定します。
- alt_value
-
オプションで、
language
の代替値を指定します。language
に対してDEFAULT
を指定した場合、alt_value
は指定できません。alt_value
は30バイトに制限されており、グローバリゼーション・サポート言語の名前、略称またはDEFAULT
は指定できません。 - language_dependent
-
ユーザー定義の任意の文字列を
language
パラメータに指定できることを指定するには、このパラメータをFALSE
に設定します。FALSE
に設定されている場合、検索式に適用されるレクサー処理は、問合せ言語に依存しません。BASIC_SECTION_GROUP
が索引に使用されている場合、FALSE
オプションのみ使用できます。
例
この例は、マルチ言語テキスト表の作成方法、および表を索引付けするためのマルチレクサーの設定方法を示しています。
次のように、主キー、テキスト列および言語列を持つマルチ言語表を作成します。
create table globaldoc ( doc_id number primary key, lang varchar2(3), text clob );
保持するドキュメントのほとんどが英語で、ドイツ語または日本語のドキュメントが少しある表を考えてみます。3つの言語を処理するには、次のように英語、ドイツ語および日本語に対して1つずつ、3つのサブレクサーを作成する必要があります。
ctx_ddl.create_preference('english_lexer','basic_lexer'); ctx_ddl.set_attribute('english_lexer','index_themes','yes'); ctx_ddl.set_attribtue('english_lexer','theme_language','english'); ctx_ddl.create_preference('german_lexer','basic_lexer'); ctx_ddl.set_attribute('german_lexer','composite','german'); ctx_ddl.set_attribute('german_lexer','mixed_case','yes'); ctx_ddl.set_attribute('german_lexer','alternate_spelling','german'); ctx_ddl.create_preference('japanese_lexer','japanese_vgram_lexer');
マルチレクサー・プリファレンスを作成します。
ctx_ddl.create_preference('global_lexer', 'multi_lexer');
格納されているドキュメントのほとんどが英語であるため、英語のレクサーをデフォルトにします。
ctx_ddl.add_sub_lexer('global_lexer','default','english_lexer');
ドイツ語および日本語のレクサーをそれぞれの言語に追加します。また、言語列がISO 639-2で表現されている場合は、これらを代替値として追加します。
ctx_ddl.add_sub_lexer('global_lexer','german','german_lexer','ger'); ctx_ddl.add_sub_lexer('global_lexer','japanese','japanese_lexer','jpn');
パラメータ文字列に、次のようにマルチレクサー・プリファレンスおよび言語列を指定して索引globalx
を作成します。
create index globalx on globaldoc(text) indextype is ctxsys.context parameters ('lexer global_lexer language column lang');
language
パラメータには、次のようにユーザー定義の文字列を指定できます。
ctx_ddl.add_sub_lexer('global_lexer','mysymbol','german_lexer','my_alt_symbol', language_dependent => FALSE);
制限事項
CTX_DDL.ADD_SUB_LEXER
の使用には、次の制限が適用されます。
-
起動ユーザーは、マルチレクサーまたは
CTXSYS
の所有者である必要があります。 -
lexer_nameパラメータには、マルチレクサー・レクサーであるプリファレンスが指定されている必要があります。
-
マルチレクサーを索引で使用できるようにするには、デフォルトのレクサーが定義されている必要があります。
-
サブレクサー・プリファレンスの所有者は、マルチレクサー・プリファレンスの所有者と同じである必要があります。
-
サブレクサー・プリファレンスは、マルチレクサー・レクサーにはできません。
-
サブレクサー・プリファレンスは、マルチレクサー・プリファレンスで使用されている間は削除できません。
-
CTX_DDL.ADD_SUB_LEXER
は参照のみを記録します。サブレクサーの値は索引作成時に、索引値の記憶域にコピーされます。
8.18 ADD_ZONE_SECTION
ゾーン・セクションを作成し、そのセクションを既存のセクション・グループに追加します。これによって、WITHIN演算子を使用してゾーン・セクション内を検索できます。
ゾーン・セクションは、開始および終了タグで区切られたセクションです。たとえば、HTMLの<B>
および</B>
タグは、ボールド体で表示されるワードの範囲をマークします。
ゾーン・セクションは、ゾーン・セクション内で互いにネストしたりオーバーラップすることが可能です。また、1つのドキュメント内で複数出現させることが可能です。
構文
CTX_DDL.ADD_ZONE_SECTION( group_name IN VARCHAR2, section_name IN VARCHAR2, tag IN VARCHAR2 );
- group_name
-
section_name
を追加するセクション・グループの名前を指定します。 - section_name
-
group_nameに追加するセクションの名前を指定します。この名前は、
WITHIN
問合せでセクションを識別する場合に使用します。英数字以外の文字(_など)の多くは特殊であり、問合せでエスケープされるため、これらの文字を含む名前は使用しないでください。セクション名の大/小文字は区別されません。同じグループ内では、ゾーン・セクション名とフィールド・セクション名は同じ名前にできません。語句PARAGRAPHおよびSENTENCEは、特殊セクション用に予約されています。
セクション名はタグ内で一意である必要はありません。詳細を検索しやすいように、同じセクション名を複数のタグに割り当てることができます。
- tag
-
セクションの開始をマークするパターンを指定します。たとえば、
<H1>
がHTMLタグの場合は、tag
にH1
を指定します。指定する開始タグは、セクション・グループ内で一意であることが必要です。Oracle Textは、セクション・グループ作成時に指定した
group_type
パラメータから終了タグを認識します。group_name
がHTML_SECTION_GROUP
の場合は、METAタグのNAME/CONTENT
属性の組に対してゾーン・セクションを作成できます。それには、tag
をmeta@namevalue
として指定します。この場合、namevalue
はNAME
属性の値で、対応するCONTENT
属性がセクションとして索引付けられます。次の例を参照してください。group_name
がXML_SECTION_GROUP
の場合は、(doctype)tag
という形式でドキュメント・タイプ(ルート要素)を使用し、必要に応じてtag
を修飾できます。その場合は、XMLドキュメント・タイプの宣言でのsection_name
が区別されます。次の例を参照してください。
例
次の例は、HTML_SECTION_GROUP
型のhtmgroup
というセクション・グループを定義します。その後、<H1>タグで識別されたheadline
というhtmgroup
にゾーン・セクションを作成します。
begin ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP'); ctx_ddl.add_zone_section('htmgroup', 'heading', 'H1'); end;
セクション・グループhtmgroup
で索引付けした後は、次のように問合せを発行してheadingセクション内を問い合せます。
'Oracle WITHIN heading'
HTML_SECTION_GROUP
を使用すると、HTML METAタグにゾーン・セクションを作成できます。
次のように、META
タグを持つHTMLドキュメントがあるとします。
<META NAME="author" CONTENT="ken">
META
タグに対してすべてのCONTENT
属性を索引付けるゾーン・セクションを作成します。この場合、METAタグのNAME値
はauthorです。
begin ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP'); ctx_ddl.add_zone_section('htmgroup', 'author', 'meta@author'); end
セクション・グループhtmgroup
で索引付けした後は、次のようにドキュメントを問い合せます。
'ken WITHIN author'
ドキュメント・タイプを区別するセクションの作成(XMLドキュメントのみ)
異なるドキュメント・タイプ(DTD)に対して宣言された<book>
タグを持つXMLドキュメント・セットがあるとします。各ドキュメント・タイプに対して個別のbookセクションを作成する必要がある場合を考えてみます。
myDTDname
がXMLドキュメント・タイプとして、次のように宣言されているとします。
<!DOCTYPE myDTDname> <myDTDname> ...
(ノート: DOCTYPE
はトップレベルのタグに一致する必要があります。)
myDTDname
の中で、要素<book>
が宣言されています。このタグに対して、タグのドキュメント・タイプを区別するmybooksec
という名前のセクションを次のように作成します。
begin ctx_ddl.create_section_group('myxmlgroup', 'XML_SECTION_GROUP'); ctx_ddl.add_zone_section('myxmlgroup', 'mybooksec', '(myDTDname)book'); end;
ノート
ゾーン・セクションは繰返しが可能です。出現はそれぞれ別セクションとして処理されます。たとえば、<H1>がheading
セクションを示す場合は、次のように同じドキュメント内で繰り返すことができます。
<H1> The Brown Fox </H1>
<H1> The Gray Wolf </H1>
これらのゾーン・セクションがHeading
という名前の場合、問合せBrown WITHIN Headingはこのドキュメントを戻します。ただし、(Brown and Gray) WITHIN Headingという問合せはできません。
ゾーン・セクションは互いにオーバーラップできます。たとえば、<B>
および<I>
が2つの異なるゾーン・セクションを表す場合、これらはドキュメント内で次のようにオーバーラップできます。
plain <B> bold <I> bold and italic </B> only italic </I> plain
ゾーン・セクションは(それ自体も含む)、次のようにネストできます。
<TD> <TABLE><TD>nested cell</TD></TABLE></TD>
WITHIN
演算子を使用して、セクション内のセクションのテキストを検索するための問合せを記述できます。たとえば、BOOK1
、BOOK2
およびAUTHOR
のゾーン・セクションが、ドキュメントdoc1およびdoc2で次のように存在するとします。
doc1:
<book1> <author>Scott Tiger</author> This is a cool book to read.</book1>
doc2:
<book2> <author>Scott Tiger</author> This is a great book to read.</book2>
次のようにネストされた問合せを実行します。
'(Scott within author) within book1'
この問合せはdoc1のみを戻します。
8.21 CREATE_POLICY
CTX_DOC.POLICY_*
プロシージャおよびORA:CONTAINS
ファンクションで使用するポリシーを作成します。ORA:CONTAINS
は、existsNode()
を使用したXPATH
問合せ式内で使用するファンクションです。
関連項目:
構文
CTX_DDL.CREATE_POLICY( policy_name IN VARCHAR2, filter IN VARCHAR2 DEFAULT NULL, section_group IN VARCHAR2 DEFAULT NULL, lexer IN VARCHAR2 DEFAULT NULL, stoplist IN VARCHAR2 DEFAULT NULL, wordlist IN VARCHAR2 DEFAULT NULL);
例
mylexという名前のmylexレクサー・プリファレンスを作成します。
begin ctx_ddl.create_preference('mylex', 'BASIC_LEXER'); ctx_ddl.set_attribute('mylex', 'printjoins', '_-'); ctx_ddl.set_attribute ( 'mylex', 'index_themes', 'NO'); ctx_ddl.set_attribute ( 'mylex', 'index_text', 'YES'); end;
mystopという名前のストップリスト・プリファレンスを作成します。
begin ctx_ddl.create_stoplist('mystop', 'BASIC_STOPLIST'); ctx_ddl.add_stopword('mystop', 'because'); ctx_ddl.add_stopword('mystop', 'nonetheless'); ctx_ddl.add_stopword('mystop', 'therefore'); end;
'mywordlist'という名前のワードリスト・プリファレンスを作成します。
begin ctx_ddl.create_preference('mywordlist', 'BASIC_WORDLIST'); ctx_ddl.set_attribute('mywordlist','FUZZY_MATCH','ENGLISH'); ctx_ddl.set_attribute('mywordlist','FUZZY_SCORE','1'); ctx_ddl.set_attribute('mywordlist','FUZZY_NUMRESULTS','5000'); ctx_ddl.set_attribute('mywordlist','SUBSTRING_INDEX','TRUE'); ctx_ddl.set_attribute('mywordlist','STEMMER','ENGLISH'); end;
exec ctx_ddl.create_policy('my_policy', NULL, NULL, 'mylex', 'mystop', 'mywordlist');
または
exec ctx_ddl.create_policy(policy_name => 'my_policy', lexer => 'mylex', stoplist => 'mystop', wordlist => 'mywordlist');
次に、独自に定義したポリシーを使用して、次のexistsNode()
問合せを入力します。
select id from xmltab where existsNode(doc, '/book/chapter[ ora:contains(summary,"dog or cat", "my_policy") >0 ]', 'xmlns:ora="http://xmlns.example.com/xdb" ')=1;
ポリシーを更新するには、次のようにします。
exec ctx_ddl.update_policy(policy_name => 'my_policy', lexer => 'my_new_lex');
ポリシーを削除するには、次のようにします。
exec ctx_ddl.drop_policy(policy_name => 'my_policy');
8.22 CREATE_PREFERENCE
テキスト・データ・ディクショナリにプリファレンスを作成します。
プリファレンスは、CREATE INDEXまたはALTER INDEX のパラメータ文字列で指定します。
注意:
CTX_DDL.CREATE_PREFERENCE
では、ALTER
SESSION
SET
current_schema
によって設定された現行のスキーマは考慮されません。したがって、別のユーザーが所有するプリファレンスを作成または削除する必要がある場合は、その状態を明示的に記述する必要があります。そのためにはCREATE
ANY
TABLE
システム権限が必要です。
構文
CTX_DDL.CREATE_PREFERENCE(preference_name in varchar2, object_name in varchar2);
- preference_name
-
作成するプリファレンスの名前を指定します。
- object_name
-
プリファレンス型の名前を指定します。
関連項目:
プリファレンス型および関連する属性の完全なリストは、「Oracle Text索引付けの要素」を参照してください。
例
テキストのみの索引の作成
次の例では、テキストのみの索引を指定するレクサー・プリファレンスを作成します。そのためには、CTX_DDL.CREATE_PREFERENCE
を使用してmy_lexer
というBASIC_LEXER
プリファレンスを作成します。その後、CTX_DDL.SET_ATTRIBUTE を2回コールします。最初にINDEX_TEXT
属性に対してYESを指定し、次にINDEX_THEMES
属性に対してNOを指定します。
begin ctx_ddl.create_preference('my_lexer', 'BASIC_LEXER'); ctx_ddl.set_attribute('my_lexer', 'INDEX_TEXT', 'YES'); ctx_ddl.set_attribute('my_lexer', 'INDEX_THEMES', 'NO'); end;
次の例では、索引付けするファイルがOracleディレクトリ・オブジェクトに格納されていることをシステムに知らせるmypref
というデータ記憶域プリファレンスを作成します。その後、CTX_DDL.SET_ATTRIBUTEを使用して、DIRECTORY
属性をディレクトリ/docs
に設定します。
begin ctx_ddl.create_preference('mypref', 'DIRECTORY_DATASTORE'); ctx_ddl.set_attribute('mypref', 'DIRECTORY', '/docs'); end;
関連項目:
データ記憶域の詳細は、「データストア型」を参照してください
CTX_DDL.CREATE_PREFERENCE を使用して、DETAIL_DATASTORE
を持つプリファレンスを作成します。CTX_DDL.SET_ATTRIBUTE を使用して、このプリファレンスに対して属性を設定します。次に、これを行う方法を示します。
begin ctx_ddl.create_preference('my_detail_pref', 'DETAIL_DATASTORE'); ctx_ddl.set_attribute('my_detail_pref', 'binary', 'true'); ctx_ddl.set_attribute('my_detail_pref', 'detail_table', 'my_detail'); ctx_ddl.set_attribute('my_detail_pref', 'detail_key', 'article_id'); ctx_ddl.set_attribute('my_detail_pref', 'detail_lineno', 'seq'); ctx_ddl.set_attribute('my_detail_pref', 'detail_text', 'text'); end;
関連項目:
プライマリ/ディテールの詳細は、DETAIL_DATASTOREを参照してください
次の例では、索引表が1KBの初期エクステントでfoo
表領域に作成されるように指定します。
begin ctx_ddl.create_preference('mystore', 'BASIC_STORAGE'); ctx_ddl.set_attribute('mystore', 'I_TABLE_CLAUSE', 'tablespace foo storage (initial 1K)'); ctx_ddl.set_attribute('mystore', 'K_TABLE_CLAUSE', 'tablespace foo storage (initial 1K)'); ctx_ddl.set_attribute('mystore', 'R_TABLE_CLAUSE', 'tablespace foo storage (initial 1K)'); ctx_ddl.set_attribute('mystore', 'S_TABLE_CLAUSE', 'tablespace foo storage (initial 1K)'); ctx_ddl.set_attribute('mystore', 'N_TABLE_CLAUSE', 'tablespace foo storage (initial 1K)'); ctx_ddl.set_attribute('mystore', 'I_INDEX_CLAUSE', 'tablespace foo storage (initial 1K)'); end;
ノート:
SDATA
がない索引の記憶域プリファレンスに対してS_TABLE_CLAUSE
が指定されている場合、この指定による索引の影響はないため、索引は正しく作成されます。
関連項目:
属性のないプリファレンスの作成
属性のない型のプリファレンスを作成する場合は、次の例で示すように、フィルタをNULL_FILTER
に設定するプリファレンスのみを作成する必要があります。
begin ctx_ddl.create_preference('my_null_filter', 'NULL_FILTER'); end;
日本語のVGRAMレクサーへのBIGRAMモードの指定
次の例は、日本語の問合せにBIGRAMモードの操作を指定するVGRAMレクサー・プリファレンスを作成します。
begin ctx_ddl.create_preference('jp_lexer','JAPANESE_VGRAM_LEXER'); ctx_ddl.set_attribute('jp_lexer','BIGRAM','TRUE'); end; /* create the index */ create index jp_idx on jp_doc(text) indextype is ctxsys.context parameters('lexer jp_lexer');
8.23 CREATE_SECTION_GROUP
テキスト列にセクションを定義するためのセクション・グループを作成します。
セクション・グループを作成する場合は、ADD_ZONE_SECTION 、ADD_FIELD_SECTION、ADD_MDATA_SECTIONまたはADD_SPECIAL_SECTION を使用して、そのセクション・グループにゾーン、フィールドまたは特殊セクションを追加できます。
CREATE_SECTION_GROUP
とCTX_DDL.SET_SEC_GRP_ATTRを使用してxml_enable
を設定し、Oracle XML検索索引を作成することもできます。
索引付けする場合は、CREATE INDEXまたはALTER INDEX のパラメータ文字列にセクション・グループを指定します。
索引付けした後は、WITHIN演算子を使用して、定義したセクション内を問い合せます。
構文
CTX_DDL.CREATE_SECTION_GROUP( group_name in varchar2, group_type in varchar2 );
- group_name
-
作成するセクション・グループ名を
section_group_name
のように指定します。このパラメータは、1人の所有者内で一意であることが必要です。 - group_type
-
セクション・グループのタイプを指定します。
group_type
パラメータは次のいずれかです。セクション・グループ・プリファレンス 説明 NULL_SECTION_GROUP
どのセクションも定義しないか、またはSENTENCEかPARAGRAPHセクションのみを定義する場合は、このグループ・タイプを使用します。これはデフォルトです。
BASIC_SECTION_GROUP
このグループ・タイプを使用して、開始および終了タグが
<A>
および</A>
という形式のセクションを定義します。ノート: このグループ・タイプでは、対になっていないカッコ、コメント・タグおよび属性などの入力はサポートされません。これらを入力するには、
HTML_SECTION_GROUP
を使用してください。HTML_SECTION_GROUP
このグループ・タイプを使用して、HTMLドキュメントを索引付けし、HTMLドキュメントのセクションを定義します。
このグループを使用してJSON対応コンテキスト索引を作成します。
JSON ENABLE
属性はXML ENABLE
で使用できません。セクション・グループはJSON ENABLE
としてのみマークされます。すでにXML ENABLE
としてマークされている場合、パスのセクション・グループはJSON ENABLE
では使用できず、その逆もできません。XML_SECTION_GROUP
このグループ・タイプを使用して、XMLドキュメントを索引付けし、XMLドキュメントのセクションを定義します。
AUTO_SECTION_GROUP
このグループ・タイプを使用して、XMLドキュメントの開始タグ/終了タグに対して自動的にゾーン・セクションを作成します。XMLタグから導出されるセクション名は、XML内と同様に大/小文字が区別されます。
属性セクションは、属性を持つXMLタグに対して自動的に作成されます。属性セクションは、attribute@tagという形式でネーミングされます。
停止セクション、空のタグ、処理命令およびコメントは、索引付けされません。
自動セクション・グループには次の制限事項が適用されます。
-
ゾーン、フィールドまたは特殊セクションは、自動セクション・グループに追加できません。
-
自動セクション化は、XMLドキュメント・タイプ(ルート要素)を索引付けしません。ただし、ドキュメント・タイプに停止セクションを定義することはできます。
-
プリフィックスおよび名前空間を含む、索引付けされたタグの長さは、64バイト以下です。これより長いタグは索引付けされません。
PATH_SECTION_GROUP
このグループ・タイプを使用して、XMLドキュメントを索引付けします。このタイプは、
AUTO_SECTION_GROUP
と同じように動作します。相違点は、このセクション・グループを使用すると、
INPATH
およびHASPATH
演算子でパス検索を実行できることです。タグまたは属性名の問合せでは、大/小文字が同様に区別されます。NEWS_SECTION_GROUP
このグループ・タイプを使用して、RFC 1036に従ったニュース・グループ形式のドキュメントのセクションを定義します。
-
ノート:
Oracle Database 18c以降、Oracle TextのNEWS_SECTION_GROUP
の使用は非推奨になりました。かわりに外部処理を使用します。USENET投稿に索引を付ける場合、Oracle Text内でBASIC_SECTION_GROUP
またはHTML_SECTION_GROUP
を使用するように投稿を前処理します。USENETは、商用ではあまり使用されません。
例
次のコマンドは、HTMLグループ・タイプを使用してhtmgroup
というセクション・グループを作成します。
begin
ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP');
end;
次のコマンドは、AUTO_SECTION_GROUP
グループ・タイプを使用してauto
というセクション・グループを作成し、XMLドキュメントのタグを自動的に索引付けします。
begin
ctx_ddl.create_section_group('auto', 'AUTO_SECTION_GROUP');
end;
exec CTX_DDL.CREATE_SECTION_GROUP('secgroup','PATH_SECTION_GROUP'); exec CTX_DDL.SET_SEC_GRP_ATTR('secgroup','xml_enable','t'); CREATE INDEX po_ctx_idx on T(X) indextype is ctxsys.context parameters ('section group SECGROUP');
8.24 CREATE_SHADOW_INDEX
指定した索引に対して索引メタデータ(またはポリシー)を作成します。索引がパーティション化されていない場合は、索引表も作成します。このプロシージャは、Oracle DatabaseのEnterprise Editionのみでサポートされています。
次の変更はサポートされていません。
-
非コンポジット・ドメイン索引からコンポジット・ドメイン索引の変換、またはコンポジット・ドメイン索引の列の変更
-
索引表がパーティション化されている索引($I、$P、$Kなど)の再構築
ノート:
-
パーティション索引の場合は、最初にこのプロシージャをコールして、シャドウ索引メタデータを作成する必要があります。このプロシージャでは索引表は作成されません。問合せ、DML、同期化または最適化の各操作への影響はありません。
-
CREATE_SHADOW_INDEX
およびRECREATE_INDEX_ONLINE
プロシージャでは、CONTEXT
索引にXML_ENABLE
属性があるセクション・グループはサポートされていません。これを行うと、「DRG-10521: CONTEXT索引にXML_ENABLEがある場合は操作はサポートされません
」というエラーが発生します。
構文
CTX_DDL.CREATE_SHADOW_INDEX( idx_name IN VARCHAR2, parameter_string IN VARCHAR2 DEFAULT NULL, parallel_degree IN NUMBER DEFAULT 1 );
例
例8-1 グローバル索引の計画的な再作成(増分再構築)
この例では、RECREATE_INDEX_ONLINEの各段階を適切に制御しています。SYNC_INDEX
には制限時間を指定できるため、営業時間外はSYNC_INDEX
を制限して、索引を追加的に再作成できます。
/* create lexer and original index */ exec ctx_ddl.create_preference('us_lexer','basic_lexer'); create index idx on tbl(text) indextype is ctxsys.context parameters('lexer us_lexer'); /* create a new lexer */ begin ctx_ddl.create_preference('e_lexer','basic_lexer'); ctx_ddl.set_attribute('e_lexer','base_letter','yes'); ctx_ddl.create_preference('m_lexer','multi_lexer'); ctx_ddl.add_sub_lexer('m_lexer','default','us_lexer'); ctx_ddl.add_sub_lexer('m_lexer','e','e_lexer'); end; / /* add new language column to the table for multi-lexer */ alter table tbl add(lang varchar2(10) default 'us'); /* create shadow index */ exec ctx_ddl.create_shadow_index('idx', 'replace lexer m_lexer language column lang NOPOPULATE'); declare idxid integer; begin /* figure out shadow index name */ select idx_id into idxid from ctx_user_indexes where idx_name ='IDX'; /* populate pending */ ctx_ddl.populate_pending('RIO$'||idxid); /* time limited sync */ ctx_ddl.sync_index(idx_name =>'RIO$'||idxid, maxtime =>480); /* more sync until no pending rows for the shadow index */ end; /* swap in the shadow index */ exec ctx_ddl.exchange_shadow_index('idx');
ノート
-
シャドウ索引の索引名は
RIO$index_id
です。デフォルトでは、CREATE
INDEX
またはALTER
INDEX
にNOPOPULATE
が指定されていないかぎり、非パーティション索引の索引表も移入されます。ローカル・パーティション索引の場合は、各パーティションに対して索引表を作成せずに、索引メタデータのみが作成されます。各索引に指定できるシャドウ索引は1つのみです。 -
非パーティション索引をオンラインで構築するときは、最初にこのプロシージャをコールして索引メタデータと索引表を作成できます。
POPULATE
を指定すると、索引は移入されますが、スワッピングは実行されません。スワッピングは、必要に応じて後でスケジュールできます。NOPOPULATE
を指定すると、索引表のメタデータが作成されるのみで、移入は実行されません。このプロシージャを実行した後は、POPULATE_PENDING
(CTX_DDL.POPULATE_PENDING)を実行して保留キューを移入してから、索引を同期化する必要があります。これは、増分再作成と呼ばれます。このプロシージャの実行中、すべての問合せは正常に処理されます。
-
POPULATE
を指定すると、移入開始のわずかな間DMLがブロックされ、それ以降のすべてのDMLは、オンライン保留キューにロギングされ、後で処理されます。 -
NOPOPULATE
シャドウ索引の場合、DML操作をコールする前に、必ずPOPULATE_PENDING
プロシージャを実行してください。POPULATE_PENDING
プロシージャを実行する前にDML操作をコールすると、$I
索引表に同じトークンが2回出現します。 -
CTX_DDL.SYNC_INDEXでの同期化は、通常、索引に対して実行されます。OPTIMIZE_INDEXの実行では、なにも処理されませんが、エラーも戻りません。
8.25 CREATE_STOPLIST
新しい空のストップリストを作成します。ストップリストには、索引付けしないワードまたはテーマを含めることができます。
言語固有のストップワードを保持するマルチ言語のストップリストを作成することもできます。マルチ言語のストップリストは英語、ドイツ語および日本語などの異なる言語のドキュメントを含む表の索引付けに有効です。索引付けを実行する場合は、テキスト表に言語列が含まれている必要があります。
ADD_STOPWORD、ADD_STOPCLASSまたはADD_STOPTHEMEを使用して、ストップワード、ストップクラスまたはストップテーマのいずれかをストップリストに追加します。ストップリストは、CREATE INDEXまたはALTER INDEX のパラメータ文字列で指定し、デフォルトのストップリストCTXSYS.DEFAULT_STOPLIST
をオーバーライドします。
構文
CTX_DDL.CREATE_STOPLIST(
stoplist_name IN VARCHAR2, stoplist_type IN VARCHAR2 DEFAULT 'BASIC_STOPLIST');
- stoplist_name
-
作成するストップリストの名前を指定します。
- stoplist_type
-
単一言語のストップリストを作成するには、
BASIC_STOPLIST
を指定します。これはデフォルトです。言語固有のストップワードを持つストップリストを作成するには、
MULTI_STOPLIST
を指定します。索引付け時に、各ドキュメントの言語列が調べられ、その言語のストップワードのみが排除されます。問合せ時に、セッション言語の設定によって、アクティブなストップワードが特定されます。これは、マルチレクサーの使用時にアクティブなレクサーが特定されるのと同様です。
ノート:
マルチ言語のストップリストを持つマルチ言語表を索引付けする場合は、表に言語列が含まれている必要があります。
例
例8-2 単一言語のストップリスト
次の例は、mystop
というストップリストを作成します。
begin ctx_ddl.create_stoplist('mystop', 'BASIC_STOPLIST'); end;
例8-3 複数言語のストップリスト
次の例は、multistop
というマルチ言語のストップリストを作成し、次に2つの言語固有のストップワードを追加します。
begin ctx_ddl.create_stoplist('multistop', 'MULTI_STOPLIST'); ctx_ddl.add_stopword('mystop', 'Die','german'); ctx_ddl.add_stopword('mystop', 'Or','english'); end;
8.28 DROP_PREFERENCE
DROP_PREFERENCE
プロシージャは、指定したプリファレンスをテキスト・データ・ディクショナリから削除します。プリファレンスを削除しても、そのプリファレンスを使用して作成された索引には影響を与えません。
例
次の例は、プリファレンスmy_lexer
を削除します。
begin ctx_ddl.drop_preference('my_lexer'); end;
関連項目
「CTX_DDL.CREATE_PREFERENCE 」
8.29 DROP_SECTION_GROUP
DROP_SECTION_GROUP
プロシージャは、指定したセクション・グループおよびそのグループ内のすべてのセクションをテキスト・データ・ディクショナリから削除します。
例
次の例は、セクション・グループhtmgroup
およびそのすべてのセクションを削除します。
begin ctx_ddl.drop_section_group('htmgroup'); end;
8.30 DROP_SHADOW_INDEX
指定した索引のシャドウ索引を削除します。シャドウ索引を削除するときに、その索引がパーティション化されている場合は、このシャドウ索引のメタデータと、このシャドウ索引のパーティションすべてのメタデータが削除されます。このプロシージャは、シャドウ索引表もすべて削除し、オンライン保留キューをクリーン・アップします。
例
次の例は、シャドウ索引myshadowidx
を削除します。
begin ctx_ddl.drop_shadow_index('myshadowidx'); end;
関連項目
CTX_DDL.CREATE_SHADOW_INDEX
8.31 DROP_STOPLIST
テキスト・データ・ディクショナリからストップリストを削除します。ストップリストを削除した場合は、変更を有効にするために索引を再作成または再構築する必要があります。
例
次の例は、ストップリストmystop
を削除します。
begin ctx_ddl.drop_stoplist('mystop'); end;
関連項目
「CTX_DDL.CREATE_STOPLIST 」
8.32 EXCHANGE_SHADOW_INDEX
このプロシージャは、索引(または索引パーティション)メタデータと索引(または索引パーティション)データをスワップします。
非パーティション索引の場合は、メタデータと索引データの両方がスワップされ、オンライン保留キューが処理されます。
構文
CTX_DDL.EXCHANGE_SHADOW_INDEX( idx_name IN VARCHAR2 partition_name IN VARCHAR2 default NULL );
例
例8-4 計画的なスワップによるグローバル索引の再作成
次のコードは、問合せが失敗となり、DMLのブロックが許容される営業時間外にCTX_DDL.EXCHANGE_SHADOW_INDEX
を実行する例を示しています。
/* create lexer and original index */ exec ctx_ddl.create_preference('us_lexer','basic_lexer'); create index idx on tbl(text) indextype is ctxsys.context parameters('lexer us_lexer'); /* create a new lexer */ begin ctx_ddl.create_preference('e_lexer','basic_lexer'); ctx_ddl.set_attribute('e_lexer','base_letter','yes'); ctx_ddl.create_preference('m_lexer','multi_lexer'); ctx_ddl.add_sub_lexer('m_lexer','default','us_lexer'); ctx_ddl.add_sub_lexer('m_lexer','e','e_lexer'); end; / /* add new language column to the table for multi-lexer */ alter table tbl add(lang varchar2(10) default 'us'); /* recreate index online with the new multip-lexer */ exec ctx_ddl.create_shadow_index('idx', 'replace lexer m_lexer language column lang'); exec ctx_ddl.exchange_shadow_index('idx');
ノート
-
非パーティション索引でのEXCHANGE_SHADOW_INDEXの使用:
非パーティション索引の場合は、メタデータと索引データの両方がスワップされ、オンライン保留キューが処理されます。
メタデータと索引データをスワッピングしているときの問合せでは、列が索引付けされていないことを示すエラーが戻りますが、オンライン保留キューを処理しているときの問合せは正常に処理されます。エラーが発生するのは短い時間帯です。
シャドウ索引の作成時に
POPULATE
を指定した場合や、シャドウ索引の作成以降に多数のDML操作が発行された場合は、保留キューが大規模になる可能性があります。一方、増分再作成を使用した場合、つまり、シャドウ索引の作成時にNOPOPULATE
を指定し、保留キューを移入してから同期化した場合は、CREATE_SHADOW_INDEX
の発行以降に発生したDML操作の件数に関係なく、オンライン保留キューは常に空です。このプロシージャの実行時には、索引が進捗状態にあることを示すエラーによって、最初にDMLが失敗となります。その後、再適用を必要とする行がオンライン保留キューにある場合は、DMLをブロックできます。
ノート:
このプロシージャの実行時には、索引が進捗状態にあることを示すエラーによって、DML文は失敗となります。このエラーが発生したときに、再適用を必要とする行がオンライン保留キューにある場合は、DMLをブロックして応答を停止できます。
-
パーティション索引でのEXCHANGE_SHADOW_INDEXの使用:
NOSWAP
を使用して再作成されたパーティションの場合、索引がパーティション化されていて、partition_nameが有効な索引パーティションであるときは、索引パーティション・データと索引パーティション・メタデータがスワップされ、このパーティションのオンライン保留キューが処理されます。このプロシージャでは一度に1つのパーティションのみがスワップされます。このプロシージャを
NOSWAP
で再作成されたパーティションに対して実行すると、問合せは次のように処理されます。-
複数のパーティションにわたる問合せでは、すべてのパーティションで一貫した結果が戻るわけではありません。
-
スワップ中のパーティションに対する問合せは、エラーになります。
-
すでにスワップ済のパーティションに対する問合せは、新しい索引がベースとなります。
-
スワップされなかったパーティションに対する問合せは、古い索引がベースとなります。
partition_nameがNULLの場合は、索引メタデータがスワップされます。ローカル・パーティション索引をオンラインで再作成する場合は、このプロシージャをステップの最後に実行します。
-
-
同期の動作:
EXCHANGE_SHADOW_INDEX
の実行後は、SYNC_INDEX
操作をコールして、シャドウ索引の作成中に発生したDMLを同期する必要があります。SYNC(ON COMMIT)
またはSYNC(EVERY)
を指定してある場合、この同期は自動的に実行されます。ただし、SYNC(MANUAL)
を指定してある場合は、SYNC_INDEX
を手動で呼び出す必要があります。
8.33 OPTIMIZE_INDEX
索引を最適化します。索引を最適化すると、古いデータが削除され、索引の断片化が最小限度に抑えられます。その結果、問合せ応答時間を短縮できます。
索引の最適化は、同期化の後に実行します。問合せおよびDMLの処理は最適化中にも続行できます。
高速モード、完全モード、再構築モード、トークン・モード、トークン型モード、マージ・モードで最適化できます。
-
高速モードではデータは圧縮されますが、行は削除されません。
-
完全モードではデータが圧縮され、行が削除されます。
-
再構築モードで最適化すると、
$I
表(逆リスト表)全体が再構築されます。索引の再構築は完全最適化を実行したときよりも処理時間が大幅に短いことが多く、特に索引がひどく断片化している場合は、小型の索引を生成する傾向があります。再構築モードの最適化は、
$I
表のさらに圧縮されたコピーを作成し、元の$I
表とコピーを切り替えます。そのため、再構築操作には元の表とコピーを格納する十分な領域が必要です。(REDOロギングが使用可能な場合は、REDOログ用の領域を追加することも必要です。)再構築操作の最後には元の$I
表が削除されるため、領域を再利用できます。一時的な「変更取得トリガー」を使用して、最適化中の$I
表への更新が失われないことを確認します。したがって、REBUILD
モードのOPTIMIZE_INDEX
をコールするユーザーにはCREATE
TRIGGER
権限が必要です。再構築モードの最適化は、次の制限事項で
basic_storage
プリファレンスのi_table_clause
属性による$I
表のパーティション化をサポートします。-
$I
表をパーティション化する場合、ローカルのBツリー索引を使用してi_index_clause
を指定します。 -
token_first
、token_last
、またはtoken_count
列のパーティション化スキームは使用できません。
ノート:
再構築モードの
OPTIMIZE_INDEX
は、ユーザーへのトリガーを作成する権限を付与しないかぎり、Oracle Databaseリリース18c、バージョン18.3のアーティファクトを使用するOracle Autonomous Data Warehouse Cloudではサポートされません。また、セッション・レベルまたはシステム・レベルでパラレルDMLを無効にする必要があります。次のSQL文を実行し、トリガーを作成する権限を付与してパラレルDMLを無効にします。grant create trigger to user; alter session disable parallel dml;
-
-
トークン・モードでは、最適化する特定のトークンを指定します(たとえば、ワードelectionsを含むドキュメントを持つ行すべて)。このモードを使用して、参照頻度の低いトークンの最適化に要する時間を節約しながら、検索頻度の高い索引トークンを最適化します。トークンを最適化すると、問合せ応答時間を短縮できます(最適化されたトークンで問い合せる場合のみ)。
-
トークン型の最適化はトークン・モードに似ていますが、最適化がフィールド・セクション、
MDATA
セクション、またはSDATA
セクション(たとえば、<A>
タグのあるセクション)で実行される点が異なります。これは、重要なフィールドまたはMDATA
セクションを最適な状態に保持する場合に有効です。 -
DML操作で多用されるCONTEXT索引の$I表を最適化するには、マージ・モードを使用します。マージ操作によって既存のデータが$G表に圧縮され、そのデータが$I表にコピーされます。その後、圧縮された行が$G表から削除されます。
索引を最適化する一般的な方法は、参照頻度の高い語句で通常のトークン・モードの最適化を実行し、再構築モードの最適化はあまり実行しないという方法です。(実行頻度の高い問合せを見つけるには、CTX_REPORT.QUERY_LOG_SUMMARYを使用します。)トークン・モードの最適化のかわりに、完全モード、高速モードまたはトークン型モードの最適化を実行できます。
再構築の最適化はあまり実行せず、制限時間を指定して完全最適化を頻繁に実行するという方法もあります。
ノート:
-
索引を最適化することで、初期の索引操作後、元表に対するドキュメントの挿入、削除または更新操作のみが必要な場合は、応答時間がかなり短縮できます。
-
索引の最適化を実行すると、セッション内のどの作業も実質的にコミットされ、その作業はロールバックできなくなります。
索引の最適化には、ALTER
INDEX
文よりもこのプロシージャを使用することをお薦めします。
大型の索引の最適化には、時間を要することがあります。長時間に及ぶ最適化の進捗状態を監視するには、CTX_OUTPUT.START_LOGを使用して最適化をロギングし、生成されるログ・ファイルを時々チェックしてください。
シリアルの完全モードの最適化とは異なり、optlevel
がFULL
でCTX_DDL.OPTIMIZE_INDEX()
を実行すると、parallel_degree
> 1の場合は再開できません。つまり、タイムアウトまたは失敗の直後から再開されません。
ノート:
$I
表と最適化済のシャドウ$I
表とのスワップ中に、CTX_DDL.OPTIMIZE_INDEX
REBUILD
モードでは問合せが失敗する可能性がある時間枠がごくわずかにあります。
構文
CTX_DDL.OPTIMIZE_INDEX(
idx_name IN VARCHAR2, optlevel IN VARCHAR2, maxtime IN NUMBER DEFAULT NULL, token IN VARCHAR2 DEFAULT NULL, part_name IN VARCHAR2 DEFAULT NULL, token_type IN NUMBER DEFAULT NULL, parallel_degree IN NUMBER DEFAULT 1, maxtokens IN NUMBER DEFAULT NULL, section_type IN NUMBER DEFAULT NULL
);
- idx_name
-
索引の名前を指定します。索引名を指定しない場合は、Oracle Textによって最適化する索引が1つ選択されます。
- optlevel
-
最適化レベルを文字列で指定します。最適化には、次のいずれかの方法を指定できます。
optlevelの値 説明 FAST
またはCTX_DDL.OPTLEVEL_FAST
この方法では、断片化した行が圧縮されます。ただし、古いデータは削除されません。
FAST
最適化は、CTXCAT
索引に対してサポートされていません。FAST
最適化では、$S
索引表は最適化されません。FULL
またはCTX_DDL.OPTLEVEL_FULL
このモードでは、索引全体または索引の一部を最適化できます。この方法では行が圧縮され、古いデータ(削除済の行)が削除されます。完全モードでの最適化は、削除済の行が存在しない場合でも実行されます。
完全最適化は、
CTXCAT
索引に対してサポートされていません。REBUILD
またはCTX_DDL.OPTLEVEL_REBUILD
この
optlevel
では、$I
表(逆リスト表)が再構築され、圧縮されたトークン情報の行が生成されます。FULL
最適化と同様に、このモードでも、元表の削除された行に関係する情報が削除されます。CTCAT
およびCTXRULE
索引に対して、REBUILD
はサポートされていません。TOKEN
またはCTX_DDL.OPTLEVEL_TOKEN
この方法では、最適化する特定のトークンを指定します。Oracle Textでは、tokenで指定されたトークンに対して完全最適化を実行します。指定されたトークン型がない場合は、0(ゼロ)がデフォルトとして使用されます。
検索頻度の高いトークンの最適化には、この方法を使用します。
CTCAT
およびCTXRULE
索引に対して、トークンの最適化はサポートされていません。TOKEN_TYPE
またはCTX_DDL.OPTLEVEL_TOKEN_TYPE
このoptlevelでは、索引内で入力トークン型または入力セクション・タイプのどちらかと一致するすべてのトークンが要求時に最適化されます。
optlevel
がTOKEN_TYPE
の場合は、token_typeまたはsection_typeのどちらかを指定する必要があります。TOKEN_TYPE
は、指定された入力token_typeまたはsection_typeのトークンに対してFULL
最適化を実行します。TOKEN
最適化と同様に、TOKEN_TYPE
最適化では、FULL
最適化の状態は変更されず、各呼出しで完了まで実行されます。CTCAT
およびCTXRULE
索引に対して、token_typeはサポートされていません。MERGE
またはCTX_DDL.OPTLEVEL_MERGE
このoptlevelでは、ステージング
$G
表内の行が圧縮され、それらが$I
表にマージされます。このオプションは、トークン・レベルではサポートされていません。このオプションとともに
TOKEN
属性を指定すると、エラーが発生します。マージ最適化は、
STAGE_ITAB
索引オプションが有効なCONTEXT
索引に対して使用する必要があります。$S索引表に対する
CTX_DDL.OPTIMIZE_INDEX
の動作は、次のとおりです。optlevelの値 $S索引表の最適化 ノート FAST
またはCTX_DDL.OPTLEVEL_FAST
いいえ
FULL
またはCTX_DDL.OPTLEVEL_FULL
はい
-
最初に$I表が最適化されます。$I表の最適化が終了すると、
CTX_DDL.OPTIMIZE_INDEX
による$S索引表の最適化が継続されます。 -
MAXTIME
も使用できます。CTX_DDL.OPTIMIZE_INDEX
による指定のSDATA_ID
に対する$S行の最適化が完了した後、MAXTIME
がチェックされ、経過時間合計($Iの最適化に要した時間を含む)が指定のMAXTIME
を超過した場合は終了します。未処理部分は、次回のoptlevel=>'FULL'
指定のCTX_DDL.OPTIMIZE_INDEX
で最適化されます。 -
$S表の最適化は、シリアルに実行されます。
REBUILD
またはCTX_DDL.OPTLEVEL_REBUILD
はい
-
$Sの最適化は、$Iの再構築終了後に開始されます。
-
この場合、$Sの最適化は
FULL
モードでの$S最適化と同じ方法で処理されます。$S表は適切に最適化されますが、再構築は実行されません。ノート: なんらかの理由で$S最適化が異常終了した場合は、$I表が二重に再構築されないように、$Sの最適化には、
optlevel=>TOKEN_TYPE
を使用することをお薦めします。 -
$S表の最適化は、シリアルに実行されます。
TOKEN
またはCTX_DDL.OPTLEVEL_TOKEN
いいえ
TOKEN_TYPE
またはCTX_DDL.OPTLEVEL_TOKEN_TYPE
はい
optlevel => TOKEN_TYPE
およびTOKEN_TYPE
パラメータをターゲットSDATA_ID
に対して設定することで、指定したSDATA_ID
の$S行を最適化できます。 -
- maxtime
-
FULL
モードでの最適化の最大時間を分単位で指定します。記号
CTX_DDL
.MAXTIME_UNLIMITED
を指定した場合(またはNULLで渡した場合)は、索引全体が最適化されます。これはデフォルトです。 - token
-
最適化する
token
を指定します。 - part_name
-
使用している索引がローカル索引の場合は、同期化する索引パーティションの名前を指定します。指定しない場合はエラーが戻されます。
使用している索引がグローバルで、非パーティション索引の場合は、
NULL
を指定します。これはデフォルトです。 - token_type
-
最適化する
token_type
を指定します。token_type
は、CTX_REPORT.TOKEN_TYPE
メソッドまたはCTX_USER_SECTIONS
ビューを使用することで判別できます。 - parallel_degree
-
パラレル最適化に対する並列度を数値で指定します。実際の並列度は、リソースによって異なります。
optlevel
値ではシリアルに実行されるため、この設定は次の値に対してエラーDRG-10598がスローされます。-
TOKEN
またはCTX_DDL.OPTLEVEL_TOKEN
-
FAST
またはCTX_DDL.OPTLEVEL_FAST
-
- maxtokens
-
最適化する
maxtokens
を指定します。maxtokens
属性は、optlevel
の値がTOKEN
またはCTX_DDL.OPTLEVEL_TOKEN
に設定されていて、token
パラメータがNULL
の場合にのみ指定できます。ノート:
-
断片化されたトークンの数が$I内のトークンの合計数の50%を超えているときに、
maxtokens
が指定されていないと、「索引の断片化が過剰」のエラーが返されます。 -
maxtokens
に負の値が指定されている場合や、$I内のトークンの合計数の50%を超える値が指定されている場合は、「maxtokensの値が無効」のエラーが戻されます。
-
- section_type
-
section_type
は、特定のタイプのすべてのセクションを最適化する場合に指定します。このパラメータには、次のいずれかの値を指定できます。section_typeの値 説明 CTX_DDL.SECTION_FIELD
索引内のすべてのフィールド・セクションに対して最適化が実行されます。
CTX_DDL.SECTION_SORT_SDATA
索引内のすべての
optimized_for
ソートSDATAセクションに最適化が実行されます。CTX_DDL.SECTION_MDATA
索引内のすべてのMDATAセクションに対して最適化が実行されます。
CTX_DDL.SECTION_SEARCH_SDATA
索引内のすべての
optimized_for
検索SDATAセクションに最適化が実行されます。CTX_DDL.SECTION_WILDCARD_INDEX
$KG表(ワイルドカード検索索引)に対して最適化が実行されます。
ノート:
-
section_type
を指定できるのは、optlevel
の値がTOKEN_TYPE
またはCTX_DDL.OPTLEVEL_TOKEN_TYPE
に設定されている場合のみです。 -
指定したタイプのセクションがない場合、
section_type
に対する索引最適化は操作なしとなります。同様に、$KG表がない場合、CTX_DDL.SECTION_WILDCARD_INDEX
のsection_type
値に対する索引最適化は操作なしとなります。
-
例
次の2つの例は、高速モードの最適化を使用して索引を最適化する同等の方法です。
begin ctx_ddl.optimize_index('myidx','FAST'); end; begin ctx_ddl.optimize_index('myidx',CTX_DDL.OPTLEVEL_FAST); end;
次の例では、索引トークンOracleを最適化します。
begin ctx_ddl.optimize_index('myidx','token', TOKEN=>'Oracle'); end;
索引MYINDEX
内のフィールド・セクションMYSEC
のすべてのトークンを最適化するには、次のようにします。
begin ctx_ddl.optimize_index('myindex', ctx_ddl.optlevel_token_type, token_type=> ctx_report.token_type('myindex','field mysec text'));end;
次の2つの例は、マージ最適化を使用して索引を最適化する同等の方法です。
begin ctx_ddl.optimize_index('idx','MERGE'); end; begin ctx_ddl.optimize_index('idx',CTX_DDL.OPTLEVEL_MERGE); end;
次の例では、$I内で断片化された上位10個のトークンを最適化します。
begin ctx_ddl.optimize_index('idx','TOKEN',maxtokens=>10); end;
ノート
CTX_DDL.SYNC_INDEX
およびCTX_DDL.OPTIMIZE_INDEX
は同時に実行できます。並列度が指定されたCTX_DDL.SYNC_INDEX
およびCTX_DDL.OPTIMIZE_INDEX
も同時に実行できます。ただし、次は実行しないでください。
-
並列度が指定された
CTX_DDL.SYNC_INDEX
をCTX_DDL.OPTIMIZE_INDEX
と同時に実行すること。 -
並列度が指定された
CTX_DDL.SYNC_INDEX
を並列度が指定されたCTX_DDL.OPTIMIZE_INDEX
と同時に実行すること。
これらのいずれかの組合せを実行する必要がある場合、エラーは生成されませんが、一方の処理が完了してからもう一方の処理が行われます。
関連項目
8.34 POPULATE_PENDING
元表または表パーティション内のROWIDすべてを含めた保留キューを移入します。このプロシージャは、CONTEXT
索引に対してのみサポートされています。
このプロシージャは、索引付け処理を連続的に実行する余裕がないために、テキスト索引作成に対する制御を向上させる必要がある大規模なインストール環境で役立ちます。望ましい方法は、空の索引を作成して、すべてのROWIDを保留キューに配置し、CTX_DDL.SYNC_INDEXを介して索引を構築する方法です。
構文
ctx_ddl.populate_pending( idx_name IN VARCHAR2, part_name IN VARCHAR2 DEFAULT NULL );
ノート
SYNC_INDEX
は処理の間ブロックされます。索引ユニットは完全に空(idx_docid_count
= 0、idx_nextid
= 1)であることが必要です。索引付けを待機している行のROWIDは、表ctxsys.dr$pending
に挿入されます。元表のROWIDを保持するための十分な領域がこの表にあることを確認してください。
8.35 PREFERENCE_IMPLICIT_COMMIT
この変数は、CTX_DDLのパッケージ・レベルで設定され、CTX_DDL
プリファレンスに関係するプロシージャが暗黙的なコミットを発行するかどうかを指定します。この変数はセッションの間有効です。
PREFERENCE_IMPLICIT_COMMIT
変数は、次の表に示すプロシージャに対して設定できます。
プロシージャ名 | プロシージャ名 |
---|---|
ノート:
REMOVE_STOPCLASS
、REMOVE_STOPTHEME
、REMOVE_STOPWORD
の各プロシージャは暗黙的なコミットを発行しません。したがって、PREFERENCE_IMPLICIT_COMMIT
フラグを使用しません。
構文
exec CTX_DDL.PREFERENCE_IMPLICIT_COMMIT := TRUE|FALSE ;
PREFERENCE_IMPLICIT_COMMIT
変数のデフォルト値はTRUE
です。この変数をFALSE
に設定すると、CTX_DDL
プリファレンスに関係するプロシージャは暗黙的なコミットを発行しなくなります。こうすると、プリファレンスを複数回変更した場合でもロールバックが容易です。この変数はセッションの間有効です。
例
次の例は、暗黙的なコミットを無効にします。
exec CTX_DDL.PREFERENCE_IMPLICIT_COMMIT : update_sub_lexer = FALSE;
8.36 RECREATE_INDEX_ONLINE
指定した索引を再作成します。あるいは、索引がローカル・パーティション索引の場合は、受け取った索引パーティションを再作成します。
パーティション化されていないグローバル索引の場合、この手順は1ステップで実行できます。ローカル・パーティション索引の場合は、最初にCREATE_SHADOW_INDEXを使用してシャドウ・ポリシー(またはメタデータ)を作成した後で、すべてのパーティションに対してこのプロシージャを個別に実行する必要があります。このプロシージャは、Oracle DatabaseのEnterprise Editionのみでサポートされています。
次の変更はサポートされていません。
-
非コンポジット・ドメイン索引からコンポジット・ドメイン索引の変換、またはコンポジット・ドメイン索引の列の変更
-
索引表がパーティション化されている索引(
$I
、$P
、$K
など)の再構築
構文
CTX_DDL.RECREATE_INDEX_ONLINE( idx_name IN VARCHAR2, parameter_string IN VARCHAR2 default NULL, parallel_degree IN NUMBER default 1, partition_name IN VARCHAR2 default NULL );
- idx_name
-
有効な
CONTEXT
索引タイプの名前。 - parameter_string
-
索引がグローバル非パーティション索引である場合は、
ALTER
INDEX
の場合と同様に、同じ索引レベルのパラメータ文字列を指定します。NULL
以外の場合、パラメータ文字列はREPLACE
で開始する必要があります。必要に応じてSWAP
またはNOSWAP
を指定します。デフォルトはSWAP
です。 - parallel_degree
-
将来の使用のために予約されています。並列度を指定します。現在のリリースでは、パラレル操作はサポートされていません。
- partition_name
-
ローカル・パーティション索引に対して有効な索引パーティション名を指定します。名前を指定しない場合、デフォルトは
NULL
です。索引がパーティション化されている場合は、最初にパーティション名を渡し、次にALTER
INDEX
REBUILD
PARTITION
のパーティション・レベルのパラメータ文字列を指定します。
例
例8-5 単純なグローバル索引の再作成
次の例は、BASIC_LEXER
ベースのプリファレンスus_lexer
を使用して索引idx
を作成します。次に、新しいMULTI_LEXER
ベースのプリファレンスm_lexer
を使用して索引をワンステップで再作成します。このワンステップ・アプローチは、時間枠が小さいために問合せが操作終了時に失敗する可能性があり、最初と最後の短い時間帯にDMLがブロックされる可能性があります。
/* create lexer and original index */ exec ctx_ddl.create_preference('us_lexer','basic_lexer'); create index idx on tbl(text) indextype is ctxsys.context parameters('lexer us_lexer'); /* create a new lexer */ begin ctx_ddl.create_preference('e_lexer','basic_lexer'); ctx_ddl.set_attribute('e_lexer','base_letter','yes'); ctx_ddl.create_preference('m_lexer','multi_lexer'); ctx_ddl.add_sub_lexer('m_lexer','default','us_lexer'); ctx_ddl.add_sub_lexer('m_lexer','e','e_lexer'); end; / /* add new language column to the table for multi-lexer */ alter table tbl add(lang varchar2(10) default 'us'); /* recreate index online with the new multip-lexer */ exec ctx_ddl.recreate_index_online('idx', 'replace lexer m_lexer language column lang');
例8-6 一斉スワップによるローカル索引の再作成
次の例は、基本レクサーus_lexer
を使用してローカル・パーティション索引idxp
を作成します。このローカル・パーティション索引には、idx_p1
とidx_p2
の2つの索引パーティションがあります。パーティションidx_p1
を使用してローカル・パーティション索引idxp
をオンラインで再作成します。この索引には、新しい記憶域プリファレンスnew_store
が指定されます。パーティション・メタデータと索引パーティション・データのスワッピングは最後に発生します。この例にある複数パーティションにわたる問合せでは、再作成の処理中(EXCHANGE_SHADOW_INDEXの実行終了時を除く)に、パーティション全体で一貫した結果が戻ります。余分に必要な領域は、パーティションidx_p1
とidx_p2
を合せた索引サイズです。
/* create a basic lexer and a local partition index with the lexer*/ exec ctx_ddl.create_preference('us_lexer','basic_lexer'); create index idxp on tblp(text) indextype is ctxsys.context local (partition idx_p1, partition idx_p2) parameters('lexer us_lexer'); /* create new preferences */ begin ctx_ddl.create_preference('my_store','basic_storage'); ctx_ddl.set_attribute('my_store','i_table_clause','tablespace tbs'); end; / begin ctx_ddl.create_preference('e_lexer','basic_lexer'); ctx_ddl.set_attribute('e_lexer','base_letter','yes'); ctx_ddl.create_preference('m_lexer','multi_lexer'); ctx_ddl.add_sub_lexer('m_lexer','default','us_lexer'); ctx_ddl.add_sub_lexer('m_lexer','e','e_lexer'); end; / /* add new language column */ alter table tblp add column (lang varchar2(10) default 'us'); /* create a shadow policy with a new lexer */ exec ctx_ddl.create_shadow_index('idxp', null, 'replace lexer m_lexer language column lang'); /* recreate every index partition online without swapping */ exec ctx_ddl.recreate_index_online('idxp', 'replace storage my_store NOSWAP', 1, 'idx_p1'); exec ctx_ddl.recreate_index_online('idxp','replace NOSWAP',1,'idx_p2'); /* exchange in shadow index partition all at once */ exec ctx_ddl.exchange_shadow_index('idxp', 'idx_p1') /* exchange index partition data*/ exec ctx_ddl.exchange_shadow_index('idxp', 'idx_p2') /* exchange index partition data*/ /* exchange in shadow index metadata */ exec ctx_ddl.exchange_shadow_index('idxp')
例8-7 パーティション単位のスワップによるローカル索引の再作成
この例は、各索引パーティションが作成完了時点でスワップされること以外は、例8-6と同じタスクを実行します。この例では、すべてのパーティションにわたる問合せに対して一貫性のない結果が戻る可能性があります。
/* create a basic lexer and a local partition index with the lexer*/ exec ctx_ddl.create_preference('us_lexer','basic_lexer'); create index idxp on tblp(text) indextype is ctxsys.context local (partition idx_p1, partition idx_p2) parameters('lexer us_lexer'); /* create new preferences */ begin ctx_ddl.create_preference('my_store','basic_storage'); ctx_ddl.set_attribute('my_store','i_table_clause','tablespace tbs'); end; / begin ctx_ddl.create_preference('e_lexer','basic_lexer'); ctx_ddl.set_attribute('e_lexer','base_letter','yes'); ctx_ddl.create_preference('m_lexer','multi_lexer'); ctx_ddl.add_sub_lexer('m_lexer','default','us_lexer'); ctx_ddl.add_sub_lexer('m_lexer','e','e_lexer'); end; / /* add new language column */ alter table tblp add column (lang varchar2(10) default 'us'); /* create a shadow policy with a new lexer * exec ctx_ddl.create_shadow_index('idxp', 'replace lexer m_lexer language column lang'); /* recreate every index partition online and swap (default) */ exec ctx_ddl.recreate_index_online('idxp', 'replace storage my_store', 1, 'idx_p1'); exec ctx_ddl.recreate_index_online('idxp', 'replace SWAP', 1, 'idx_p2', /* exchange in shadow index metadata */ exec ctx_ddl.exchange_shadow_index('idxp')
例8-8 一斉スワップによるローカル索引の計画的な再作成
この例は、ローカル・パーティション索引の増分再作成を示しています。すべてのパーティションは最後にスワップされます。
/* create a basic lexer and a local partition index with the lexer*/ exec ctx_ddl.create_preference('us_lexer','basic_lexer'); create index idxp on tblp(text) indextype is ctxsys.context local (partition idx_p1, partition idx_p2) parameters('lexer us_lexer'); /* create new preferences */ begin ctx_ddl.create_preference('my_store','basic_storage'); ctx_ddl.set_attribute('my_store','i_table_clause','tablespace tbs'); end; / begin ctx_ddl.create_preference('e_lexer','basic_lexer'); ctx_ddl.set_attribute('e_lexer','base_letter','yes'); ctx_ddl.create_preference('m_lexer','multi_lexer'); ctx_ddl.add_sub_lexer('m_lexer','default','us_lexer'); ctx_ddl.add_sub_lexer('m_lexer','e','e_lexer'); end; / /* add new language column */ alter table tblp add column (lang varchar2(10) default 'us'); /* create a shadow policy with a new lexer * exec ctx_ddl.create_shadow_index('idxp', 'replace lexer m_lexer language column lang'); /* create shadow partition with new storage preference */ exec ctx_ddl.recreate_index_online('idxp', 'replace storage ctxsys.default_storage nopopulate',1,'idx_p1'); exec ctx_ddl.recreate_index_online('idxp', 'replace storage ctxsys.default_storage nopopulate',1,'idx_p2'); declare idxid integer; ixpid integer; begin select idx_id into idxid from ctx_user_indexes where idx_name = 'IDXP'; select ixp_id into ixpid from ctx_user_index_partitions where ixp_index_name = 'IDXP' and ixp_index_partition_name = 'IDX_P1'; /* populate pending */ ctx_ddl.populate_pending('RIO$'||idxid, 'RIO$'||idxid||'#'||ixpid); /* incremental sync ctx_ddl.sync_index('RIO$'||idxid, null, 'RIO$'||idxid||'#'||ixpid, maxtime=>400); /* more incremental sync until no more pending rows */ select ixp_id into ixpid from ctx_user_index_partitions where ixp_index_name = 'IDXP' and ixp_index_partition_name = 'IDX_P2'; /* populate pending */ ctx_ddl.populate_pending('RIO$'||idxid, 'RIO$'||idxid||'#'||ixpid); /* incremental sync ctx_ddl.sync_index('RIO$'||idxid, null, 'RIO$'||idxid||'#'||ixpid, maxtime=>400); /* more incremental sync until no more pending rows */ end; / exec ctx_ddl.exchange_shadow_index('idxp','idx_p1'); exec ctx_ddl.exchange_shadow_index('idxp','idx_p2'); exec ctx_ddl.exchange_shadow_index('idxp');
例8-9 パーティション単位のスワップによるローカル索引の計画的な再作成
この例は、パーティションが使用可能になり次第スワップされる増分再作成を示しています。すべての同期化が終了するまで待機してからシャドウ索引の交換を開始するのではなく、1つの同期化が終了した直後に各パーティションに対してEXCHANGE_SHADOW_INDEXが実行されること以外は、例8-8のステップと同じです。
ノート
-
グローバル非パーティション索引でのRECREATE_INDEX_ONLINEの使用:
このプロシージャには、グローバル索引を対象にして、索引をオンラインで再作成するワンステップ・プロセスが用意されています。このプロセスでは、索引を新しいプリファレンス値で再作成し、再作成の間も元表DMLと問合せ機能を維持します。
新しい索引は既存の索引と並行して作成されるため、この操作には、既存の索引とほぼ等しいサイズの追加の記憶域が必要です。
-
DMLの動作:
このプロシージャはオンラインで実行されるため、この操作の間も元表に対するDMLは許可され、通常どおりに処理されます。
RECREATE_INDEX_ONLINE
中に発生するDML文はすべて、オンライン保留キューにロギングされます。再作成操作の終了間際には、索引の進捗状態を示すエラーによって、DMLが失敗となる短い時間帯があります。処理中にDMLが再度応答しなくなる可能性があり、その時間は再作成処理の開始以降にオンライン保留キューにロギングされたDMLの数によって異なります。
索引の再作成操作が完了した後は、
RECREATE_INDEX_ONLINE
の開始以降に保留となったすべてのDMLから、新しい情報が即時に反映されない場合があることに注意してください。INDEXTYPE
IS
ctxsys.context
ONLINE
を使用した索引の作成と同様に、索引の再作成操作が完了した後は、その索引を同期化して最新の状態にする必要があります。 -
同期化と最適化の動作:
再作成操作の過程で索引に対して発行された同期化は、古い既存のデータと照合して処理されます。問合せでエラーが戻る時間帯と同じ時間帯には、同期化もブロックされます。
RECREATE_INDEX_ONLINE
の実行後は、SYNC_INDEX
操作をコールして、シャドウ索引の作成中に発生したDMLを同期する必要があります。SYNC(ON COMMIT)
またはSYNC(EVERY)
を指定してある場合、この同期は自動的に実行されます。ただし、SYNC(MANUAL)
を指定してある場合は、SYNC_INDEX
を手動で呼び出す必要があります。再作成操作の過程で索引に対して発行された最適化コマンドは、なにも実行されずにエラーなしで即時に戻ります。
-
問合せの動作:
再作成操作の間、索引は、ほぼ通常どおりに問い合せることができます。問合せでは、最後のスワップが終わるまで、既存の索引とポリシー(またはメタデータ)に基づいて結果が戻ります。
RECREATE_INDEX_ONLINE
終了間際には、問合せに対して、列が索引付けされていないことを示すエラーが戻る短い時間帯があります。この時間帯は通常の問合せにとっては十分な時間ではありません。この時間は、主にシャドウ索引表と索引表のデータ・セグメントのスワッピングに要する時間と、保留キュー内のすべての行を削除する時間を加算した時間です。これは、DMLが失敗となる時間帯と同じ時間枠です。RECREATE_INDEX_ONLINE
の間にDML文を発行して同期化した場合は、既存の索引を問い合せるときに新しい行を表示できます。ただし、RECREATE_INDEX_ONLINE
が終了し(スワッピングが完了し、新しい索引に対して問合せがある)、同期化が実行される前は、新しい行に対して問合せを実行できない可能性があります。これは、この新しい行には古い索引で1回問合せが実行される可能性があるためです。トランザクション問合せはサポートされていません。
-
ローカル・パーティション索引でのRECREATE_INDEX_ONLINEの使用:
索引がローカル・パーティション化されている場合、索引はワンステップで再作成できません。最初にシャドウ・ポリシーを作成し、次にすべてのパーティションに対してこのプロシージャを実行する必要があります。
SWAP
またはNOSWAP
を設定して、RECREATE_INDEX_ONLINE
で索引パーティション・データと索引パーティション・メタデータをスワップするかどうかを指定できます。パーティションがNOSWAP
で構築されている場合は、このパーティションに対して別のEXCHANGE_SHADOW_INDEX
コールを後で起動する必要があります。また、パラメータ文字列に
NOPOPULATE
を指定した場合は、このプロシージャを使用して各パーティションのメタデータ(記憶域プリファレンスなど)を更新できます。これは、時間に制限がある同期化を介してシャドウ索引を増分構築する場合に便利です。NOPOPULATE
を指定すると、暗黙的にNOSWAP
が実施されます。 -
NOSWAPの動作:
索引パーティションの再作成中はスワッピングが実行されないため、パーティションに対する問合せは通常どおりに処理されます。スワッピング段階に到達するまで、複数のパーティションにわたる問合せでは、パーティション全体で一貫した結果が戻ります。
DMLと同期化は通常どおりに処理されます。再作成中または構築済(ただし、スワップは未処理)のパーティションに対する最適化の実行では、なにも処理されずに単純に戻ります。再構築されていないパーティションに対する最適化の実行は、通常どおりに処理されます。
グローバル索引と同様に、すべてのパーティションで
NOSWAP
が使用されている場合は、既存の索引とほぼ等しいサイズの追加の記憶域が必要です。 -
SWAPの動作:
索引パーティションのデータとメタデータは索引の再作成後にスワップされるため、複数のパーティションにわたる問合せでは、すべてのパーティションで一貫した結果が戻るわけではありません。しかし、各索引パーティションに関しては常に適切になります。また、パーティションの再作成の終了間際には、索引パーティションのスワップ時に発行した問合せに対して、列が索引付けされていないことを示すエラーが戻る短い時間帯があります。
SWAP
を使用してパーティションが再作成するときは、既存の索引パーティションと等しいサイズの記憶域がさらに必要です。パーティションに対するDMLはブロックされます。スワッピング中は同期化もブロックされます。
-
制限事項:
RECREATE_INDEX_ONLINE
およびCREATE_SHADOW_INDEX
プロシージャでは、CONTEXT
索引にXML_ENABLE
属性があるセクション・グループはサポートされていません。これを行うと、「DRG-10521: CONTEXT索引にXML_ENABLEがある場合は操作はサポートされません
」というエラーが発生します。RECREATE_INDEX_ONLINE
およびCREATE_SHADOW_INDEX
プロシージャは、検索索引ではサポートされていません。
8.38 REMOVE_AUTO_OPTIMIZE
自動最適化の対象である索引のリストから、索引またはパーティションを削除します。この索引に対して、新しい自動最適化はコールされません。削除は、即座に反映されます。
指定した索引が既存の索引リストにない場合は、エラーが発生します。パーティション索引の場合は、パーティション名を指定しないとエラーが発生します。
構文
CTX_DDL.REMOVE_AUTO_OPTIMIZE(
idx_name IN VARCHAR2, part_name IN VARCHAR2 default NULL );
関連項目
8.40 REMOVE_MDATA
ドキュメントから、MDATA
セクションに関連付けられているメタデータ値を削除します。
ADD_MDATAおよびREMOVE_MDATA
をコールできるのは、索引の所有者のみです。
CTX_DDL.REMOVE_MDATA
はトランザクション型であり、コールするセッションで即時に機能します。このプロシージャはそのコールするセッションでのみ表示でき、永続的に機能させるにはコミットが必要です。ROLLBACK
コマンドを使用してこのプロシージャを逆にすることができます。
構文
CTX_DDL.REMOVE_MDATA( idx_name IN VARCHAR2, section_name IN VARCHAR2, values SYS.ODCIVARCHAR2LIST, rowids SYS.ODCIRIDLIST, [part_name] IN VARCHAR2 );
例
この例では、MDATA
セクションBGCOLOR
からMDATA
値blueを削除します。
ctx_ddl.remove_mdata('idx_docs', 'bgcolor', 'blue', 'rows');
ノート
これらの更新は、元表に格納されている実際の内容ではなく索引自体に直接反映されます。したがって、テキスト索引が再構築されるとそれらは存在しなくなります。
8.41 REMOVE_SECTION
REMOVE_SECTION
プロシージャは、指定したセクションを指定のセクション・グループから削除します。セクションは、名前またはIDで指定できます。セクションIDは、CTX_USER_SECTIONS
ビューを使用して表示できます。
構文1
次の構文を使用して、セクション名によるセクションの削除を行います。
CTX_DDL.REMOVE_SECTION( group_name IN VARCHAR2, section_name IN VARCHAR2 );
構文2
次の構文を使用して、セクションIDでセクションを削除します。
CTX_DDL.REMOVE_SECTION( group_name IN VARCHAR2, section_id IN NUMBER );
例
次の例は、Title
というセクションをhtmgroup
から削除します。
begin ctx_ddl.remove_section('htmgroup', 'Title'); end;
8.42 REMOVE_STOPCLASS
ストップクラスをストップリストから削除します。
構文
CTX_DDL.REMOVE_STOPCLASS( stoplist_name IN VARCHAR2, stopclass IN VARCHAR2 );
例
次の例は、ストップクラスNUMBERS
をストップリストmystop
から削除します。
begin ctx_ddl.remove_stopclass('mystop', 'NUMBERS'); end;
関連項目
8.43 REMOVE_STOPTHEME
ストップテーマをストップリストから削除します。
構文
CTX_DDL.REMOVE_STOPTHEME( stoplist_name IN VARCHAR2, stoptheme IN VARCHAR2 );
例
次の例は、ストップテーマbankingをストップリストmystop
から削除します。
begin ctx_ddl.remove_stoptheme('mystop', 'banking'); end;
関連項目
8.44 REMOVE_STOPWORD
ストップワードをストップリストから削除します。ストップワードの削除を索引に反映させる場合は、索引を再構築する必要があります。言語に依存しないストップワードも削除できます。
構文
CTX_DDL.REMOVE_STOPWORD(
stoplist_name IN VARCHAR2, stopword IN VARCHAR2, language IN VARCHAR2 default NULL
);
例
次の例は、ストップワードbecauseをストップリストmystop
から削除します。
begin
ctx_ddl.remove_stopword('mystop','because');
end;
関連項目
"ADD_STOPWORD "
8.45 REMOVE_SUB_LEXER
サブレクサーをマルチレクサー・プリファレンスから削除します。DEFAULT
のレクサーは削除できません。言語に依存しないサブレクサーも削除できます。
構文
CTX_DDL.REMOVE_SUB_LEXER(
lexer_name IN VARCHAR2, language IN VARCHAR2 default NULL
);
例
次の例は、言語german
のサブレクサーgerman_lexerを削除します。
begin
ctx_ddl.remove_sub_lexer('german_lexer','german');
end;
関連項目
8.46 REPLACE_INDEX_METADATA
ローカル・ドメイン索引内のメタデータをグローバル(索引)レベルで置換します。
ノート:
ALTER INDEX PARAMETERS
コマンドはこのプロシージャと同じ機能を実行し、メタデータ以外も置換できます。このため、グローバル(索引)レベルでメタデータを置換する場合には、できるだけこのプロシージャのかわりにALTER INDEX PARAMETERS
を使用するようにしてください。詳細は、「ALTER INDEX PARAMETERS構文」を参照してください。
CTX_REPLACE_INDEX_METADATA
は、Oracle Textの将来のリリースでは非推奨になる可能性があります。
構文
CTX_DDL.REPLACE_INDEX_METADATA( idx_name IN VARCHAR2, parameter_string IN VARCHAR2 );
ノート
ALTER INDEX REBUILD PARAMETERS ('REPLACE METADATA')
は、索引(グローバル)レベルのローカル・パーティション索引では機能しません。たとえば、索引を再構築せずにフィルタまたはレクサー型などのグローバル・プリファレンスを変更する場合は、ALTER INDEX
構文を使用できません。そのため、ALTER INDEX
のこの制限を補うメソッドとしてCTX_DDL.REPLACE_INDEX_METADATA
が提供されています。また、forward_indexに対してもALTER INDEX REBUILD PARAMETERS ('REPLACE METADATA')
は機能しないので、かわりに'REPLACE STORAGE'
を使用してください。
CTX_DDL.REPLACE_INDEX_METADATA
はローカル・パーティション索引のメタデータの置換を目的としていますが、グローバル非パーティション索引にも使用できます。
パーティション・レベルの同期化のタイプの変更に、REPLACE_INDEX_METADATA
は使用できません。つまり、parameter_stringには'REPLACE METADATA SYNC'
を指定できません。パーティション・レベルで同期化のタイプを変更するには、ALTER INDEX REBUILD PARTITION
を使用してください。
8.47 SET_ATTRIBUTE
プリファレンスの属性を設定します。このプロシージャは、CTX_DDL.CREATE_PREFERENCE
を使用してプリファレンスを作成した後で使用します。
構文
CTX_DDL.SET_ATTRIBUTE( preference_name IN VARCHAR2, attribute_name IN VARCHAR2, attribute_value IN VARCHAR2 );
例
例8-10 ファイル・データ記憶域の指定
次の例では、索引付けするファイルがOracleディレクトリ・オブジェクトに格納されていることをシステムに知らせるfilepref
というデータ記憶域プリファレンスを作成します。その後、CTX_DDL.SET_ATTRIBUTEを使用して、DIRECTORY
属性をディレクトリ/docs
に設定します。
begin ctx_ddl.create_preference('filepref', 'DIRECTORY_DATASTORE'); ctx_ddl.set_attribute('filepref', 'DIRECTORY', '/docs'); end;
例8-11 インメモリー列ストアへのテキスト索引表の格納
この例では、型BASIC_STORAGE
のmysto
という記憶域プリファレンスを作成し、$I
索引表をインメモリー列ストア(IM列ストア)に格納するように指定します。
exec ctx_ddl.create_preference('mysto', 'basic_storage');
exec ctx_ddl.set_attribute('mysto', 'I_TABLE_CLAUSE', 'inmemory’);
8.48 SET_SEC_GRP_ATTR
名前で指定したセクション・グループに、セクション・グループ固有の属性を追加します。
XML対応をサポートするxml_enable
の設定にも使用されます。
構文
CTX_DDL.SET_SEC_GRP_ATTR( group_name IN VARCHAR2, attribute_name IN VARCHAR2, attribute_value IN VARCHAR2 );
8.49 SET_SECTION_ATTRIBUTE
特定のセクションの属性またはプロパティを指定するには、SET_SECTION_ATTRIBUTE
を使用します。
「構文」に示した属性名がサポートされます。属性によっては、トークン化されたセクションにしか適用されません。トークン化されるセクション・タイプは次のとおりです。
-
フィールド・セクション
-
ゾーン・セクション
-
SDATAセクション
構文
CTX_DDL.SET_SECTION_ATTRIBUTE( group_name IN VARCHAR2, section_name IN VARCHAR2, attribute IN VARCHAR2, value IN VARCHAR2 );
- group_name
-
セクション・グループの名前を指定します。
- section_name
-
セクションの名前を指定します。
- attribute
-
SDATAセクションにこの属性を指定します。
-
Visible
セクション属性この属性が機能するのは、フィールド・セクションのみです。フィールド・セクションに関する注意:
ドキュメントの残りの部分でテキストを参照できるようにするには、TRUEを指定します。デフォルトでは、visibleフラグはFALSEです。これは、フィールド・セクション内のテキストがドキュメントの残りの部分とは別のサブドキュメントとしてOracle Textにより索引付けされることを意味します。ただし、フィールド・セクション内のテキストをドキュメント全体の一部として索引付けする場合は、visibleフラグをTRUEに設定できます。
フィールド・セクションの場合、attributeが、CTX_DDL.ADD_FIELD_SECTIONで指定された値より優先されます。
visible
属性をゾーン・セクションに設定しようとすると、エラーがスローされます。visible
属性をトークン化されていないセクションに設定すると、エラーがスローされます。
-
save_copy
TrueまたはFalseに設定します。save_copy
オプションはどのタイプのセクションでも有効ですが、$DからフェッチされるのはSDATA属性のみです。その他のセクションは、表示の目的でのみ格納されます(save_copy
の値によって異なる)。SDATAセクションは、表示の目的では格納されず、フェッチを効率化するために独立して($D表の別の列に)格納されます(save_copy
の値によって異なる)。すべてのセクションに共通(SDATAセクションを除く):save_copy
の値に応じて、セクションはドキュメント・サービス・プロシージャ(スニペット、マークアップ、ハイライト)で表示または破棄されます。 -
optimized_for
セクション属性この属性は、SDATAセクションに検索の最適化、ソートの最適化、および検索とソートの両方の最適化を指定します。これらをアーカイブするには、属性を
search
、sort
またはsort_and_search
に設定します。-
search
を指定すると、SDATAセクションの検索が効率化します。 -
sort
を指定すると、SDATAセクションのソートが効率化します。これはデフォルト値です。 -
sort_and_search
を指定すると、SDATAセクションの検索およびソートが効率化します。
-
-
- value
-
属性の値を指定します。ブール値は、
TRUE
またはFALSE
、T
またはF
、YES
またはNO
、Y
またはN
、ON
またはOFF
、あるいは1
または0
(ゼロ)で指定します。
例
次の例では、sg
という基本セクション・グループを作成し、SDATAセクションをグループに追加して、SDATAセクションをctx_ddl.set_section_attribute
を使用して検索可能にします。
begin exec ctx_ddl.create_section_group('sg', 'basic_section_group'); exec ctx_ddl.add_sdata_section('sg', 'sec1', 'sec1', 'varchar2'); exec ctx_ddl.set_section_attribute('sg', 'sec1', 'optimized_for', 'search'); end;
ノート
CTX_DDL.SET_ATTRIBUTEと同様、このプロシージャもコミットを発行します。
8.50 SYNC_INDEX
索引を同期化し、元表に対する挿入、更新および削除を実行します。
ノート:
CTX_DDL.SYNC_INDEX
は暗黙的なコミットを発行するため、CTX_DDL.SYNC_INDEX
をトリガーでコールすることはお薦めしません。これを行うと、SYNC_INDEX
とコミット後の$R
LOB
のメンテナンスとの両方で同じ$R
LOB
を更新しようとするため、エラーが発生する場合があります。
構文
CTX_DDL.SYNC_INDEX(
idx_name IN VARCHAR2 DEFAULT NULL memory IN VARCHAR2 DEFAULT NULL, part_name IN VARCHAR2 DEFAULT NULL, parallel_degree IN NUMBER DEFAULT 1 maxtime IN NUMBER DEFAULT NULL, locking IN NUMBER DEFAULT LOCK_WAIT );
- idx_name
-
同期化する索引の名前を指定します。
ノート:
idx_name
がnullの場合、変更を保留中のCONTEXT
およびCTXRULE
索引はすべて同期されます。この操作を実行するには、ctxsys
として接続する必要があります。各索引または索引パーティションは、順に従って同期化されます。そのため、個々の同期化は、lockingをNOWAIT
に設定し、maxtimeを0
に設定した状態で実行されます。SYNC_INDEX
のコール時にlockingまたはmaxtimeパラメータに指定した値は無視されます。ただし、memory
およびparallel_degree
パラメータは、個々の同期化ごとに渡されます。 - memory
-
同期化に使用するランタイム・メモリー容量を指定します。この値は、
DEFAULT_INDEX_MEMORY
システム・パラメータをオーバーライドします。memoryパラメータは、索引をディスクにフラッシュする前に、Oracle Textが同期化操作に使用するメモリー量を指定します。大きいメモリー量を指定すると、次のような効果が得られます。
-
I/Oが削減されるため索引付けのパフォーマンスが向上します。
-
断片化が削減されるため問合せのパフォーマンスとメンテナンスが向上します。
-
2つ目の引数に指定される索引付けのメモリー・サイズは、各パラレル・スレーブに適用されます。たとえば、
memory
引数が500M、parallel_degree
が2に設定される場合は、パラレルSYNC_INDEX
のために少なくとも1GBのメモリーをシステムに用意してください。
小さいメモリー量を指定すると、ディスクI/Oおよび索引の断片化が増加しますが、ランタイム・メモリー容量が不足している場合に有効なことがあります。
- part_name
-
使用している索引がローカル索引の場合は、同期化する索引パーティションの名前を指定します。指定しない場合はエラーが戻されます。
使用している索引がグローバルで、非パーティション索引の場合は、NULLを指定します。これはデフォルトです。
- parallel_degree
-
パラレル同期化に対する並列度を指定します。1より大きい数値を指定すると、パラレル同期化が実行されます。実際の並列度は、リソースによっては多少低くなります。
- maxtime
-
操作に対する提案制限時間を分単位で示します。
SYNC_INDEX
は、制限時間内でキュー内のドキュメントを可能なかぎり多数処理します。NULLのmaxtime
値はCTX_DDL.MAXTIME_UNLIMITED
と同等です。このパラメータは、SYNC_INDEX
が索引名なしで起動された場合は無視されます。その場合は、かわりに0のmaxtime
値が使用されます。自動同期化(つまり、SYNC
ON
COMMIT
またはSYNC
EVERY
)では、locking
パラメータは無視されます。指定した制限時間は概算として処理されます。実際の時間は、指定した時間よりも若干短くまたは長くなることがあります。
maxtime
のタイマーは、SYNCロックを取得したときに開始します。 - locking
-
同じ索引または索引パーティションに対して別の同期化がすでに実行されている場合の
SYNC_INDEX
の対応を構成します。SYNC_INDEX
が索引名なしで起動されてlockingが無視される場合は、かわりにLOCK_NOWAIT
のlocking値が使用されます。自動同期化(つまり、SYNC
ON
COMMIT
またはSYNC
EVERY
)では、locking
パラメータは無視されます。locking
のオプションは、次のとおりです。
Lockingのパラメータ | 説明 |
---|---|
|
別の同期化が実行されている場合は、実行中の同期が完了するまで待機してから同期化を開始します。(ロックを取得できない場合は無制限に待機し、 |
|
別の同期化が実行されている場合は、エラーなしで即時に戻ります。 |
|
別の同期化が実行されている場合は、「DRG-51313: DMLまたは最適化ロックを待機中にタイムアウトになりました」というエラーが発生します。 |
例
次の例は、2MBのメモリーで索引myindex
を同期化します。
begin
ctx_ddl.sync_index('myindex', '2M');
end;
次の例は、2MBのメモリーでpart1
索引パーティションを同期化します。
begin
ctx_ddl.sync_index('myindex', '2M', 'part1');
end;
ノート
-
CTX_DDL.SYNC_INDEX
およびCTX_DDL.OPTIMIZE_INDEX
は同時に実行できます。並列度が指定されたCTX_DDL.SYNC_INDEX
およびCTX_DDL.OPTIMIZE_INDEX
も同時に実行できます。ただし、並列度が指定されたCTX_DDL.SYNC_INDEX
をCTX_DDL.OPTIMIZE_INDEX
と同時に実行したり、並列度が指定されたCTX_DDL.SYNC_INDEX
を並列度が指定されたCTX_DDL.OPTIMIZE_INDEX
と同時に実行しないでください。これらのいずれかの組合せを実行する必要がある場合、エラーは生成されませんが、一方の処理が完了してからもう一方の処理が行われます。 -
ステージング表(
$G
)を使用する索引については、ステージング表に挿入された行のしきい値がSTAGE_ITAB_MAX_ROWS
設定の値を超えており、STAGE_ITAB_MAX_ROWS
がゼロ以外の値に設定されている場合、SYNC_INDEX
によって自動的にそのステージング表から永続索引表($I
)にデータがマージされます。このマージ・プロセスでは、並列度4が使用されます。したがって、CTX_DDL.OPTIMIZE_INDEX
をMERGE
モードで明示的に実行する必要も、バックグラウンド・ジョブを同じように手動でスケジュールする必要もありません。ユーザー所有の
DBMS_SCHEDULER
バックグラウンド・ジョブを発行してCTX_DDL.OPTIMIZE_INDEX
をMERGE
モードで実行する場合は、明示的にSTAGE_ITAB_MAX_ROWS
属性を0
に設定する必要があります。これにより、SYNC_INDEX
の実行中に発生する自動マージ・プロセスがオフになります。ユーザーが発行したバックグラウンド・ジョブにより、その後、定期的に$G
から$I
に行がマージされます。 -
STAGE_ITAB_AUTO_OPT
を設定して自動最適化マージを有効にできます。この設定では、バックグラウンドで自動的に$G
から$I
に行がマージされます。STAGE_ITAB_MAX_ROWS
が0
より大きい値に設定されており、STAGE_ITAB_AUTO_OPT
を使用して自動最適化マージが有効になっていない場合、$G
から$I
への行のマージが原因で、一部のSYNC
操作は、完了までに想定外の長い時間がかかることがあります。
関連項目
8.51 UNSET_ATTRIBUTE
プリファレンスから属性の設定を削除します。
構文
CTX_DDL.UNSET_ATTRIBUTE(preference_name varchar2, attribute_name varchar2);
例
次の例では、ドイツ語の代替スペルを使用可能にする方法およびCTX_DDL.UNSET_ATTRIBUTE
を使用して代替スペルを使用禁止にする方法を示します。
begin ctx_ddl.create_preference('GERMAN_LEX', 'BASIC_LEXER'); ctx_ddl.set_attribute('GERMAN_LEX', 'ALTERNATE_SPELLING', 'GERMAN'); end;
代替スペルを使用禁止にするには、次のようにCTX_DDL.UNSET_ATTRIBUTE
プロシージャを使用します。
begin ctx_ddl.unset_attribute('GERMAN_LEX', 'ALTERNATE_SPELLING'); end;
関連項目
8.52 UNSET_SEC_GRP_ATTR
セクション・グループ固有の属性を削除します。
構文
CTX_DDL.UNSET_SEC_GRP_ATTR(group_name varchar2, attribute_name varchar2);
関連項目
8.53 UPDATE_SUB_LEXER
サブレクサーを更新し、そのマルチレクサー・プリファレンス、言語またはサブレクサーを変更します。このプロシージャで、デフォルトのサブレクサーを更新することもできます。このプロシージャは、CTX_DDL.PREFERENCE_IMPLICIT_COMMIT
変数と組み合せて使用できます。
関連項目:
この値の設定に関する詳細は、「PREFERENCE_IMPLICIT_COMMIT」を参照してください
構文
UPDATE_SUB_LEXER ( lexer_name IN VARCHAR2, language IN VARCHAR2, sub_lexer IN VARCHAR2 );
- lexer_name
-
更新が必要なマルチレクサー・プリファレンスの名前を指定します。
- language
-
サブレクサーの言語名を指定します。デフォルトのサブレクサーには
DEFAULT
を使用します。グローバリゼーション・サポートの言語名、またはサブレクサーの略称を指定する方法は、「言語」を参照してください。
- sub_lexer
-
この言語に対して使用するサブレクサーの名前を指定します。
8.54 UPDATE_POLICY
CREATE_POLICY
を使用して作成されたポリシーを更新します。ポリシーのプリファレンスを置換します。NULLの引数は置換されません。
構文
CTX_DDL.UPDATE_POLICY( policy_name IN VARCHAR2, filter IN VARCHAR2 DEFAULT NULL, section_group IN VARCHAR2 DEFAULT NULL, lexer IN VARCHAR2 DEFAULT NULL, stoplist IN VARCHAR2 DEFAULT NULL, wordlist IN VARCHAR2 DEFAULT NULL);
8.55 UPDATE_SDATA
UPDATE_SDATA
は、索引の指定したSDATA
値を変更する索引APIです。元表の列がSDATA
セクションとして使用された可能性がある場合、元表の列値を保存または変更できません。
エクスポート/インポート操作では、指定したプリファレンスを使用して元表から索引を再構築します。UPDATE_SDATA
APIを使用して行われた変更が元表に存在しないため、エクスポート/インポート操作でこれらの変更は保持されません。
UPDATE_SDATA
では元表ではなく、索引表に追加された一時メタデータを変更します。これは直接メタデータの追加には使用できません。永続的なメタデータのエクスポート/インポートの場合、メタデータ値を含む元表の列を作成します。さらに、元表の列を通じてメタデータを更新します。
UPDATE_SDATA
を使用すると、249バイトより大きいデータは切捨てられます。
構文
CTX_DDL.UPDATE_SDATA( idx_name IN VARCHAR2 DEFAULT NULL, section_name IN VARCHAR2 DEFAULT NULL, sdata_value IN sys.anydata, sdata_rowid IN rowid, part_name IN VARCHAR2 DEFAULT NULL);