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はエラーなしで完了しますが、エラーはCTX_USER_INDEX_ERRORSにロギングされます。
これらの更新は、元表に格納されている実際の内容ではなく索引自体に直接反映されます。したがって、テキスト索引が再構築されるとそれらは存在しなくなります。
構文
これは、単一の値を単一の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;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です。したがって、FILTERBY列の値は索引付けの際にtextに変換されます。text以外のデータ型の場合は、索引付けの際にFILTERBY列が内部形式に正規化されます。MDATA演算子を使用してセクションを問い合せる場合も、処理の前にMDATA問合せ文字列が内部形式に正規化されます。 -
FILTERBY列をMDATAとしてマップすると、Oracle Textのコストベース・オプティマイザでは、Oracle Textのコンポジット・ドメイン索引を使用しないようにして、そのFILTERBY列の範囲述語が処理されます。これは、MDATAのFILTERBY列に対する範囲述語の処理効率が、SDATAとして宣言された場合より低くなるためです。したがって、列に対して範囲検索を行う予定がある場合は、FILTERBY列をMDATAとして追加しないでください。
関連トピック
関連項目:
『Oracle Textアプリケーション開発者ガイド』の第8章「Oracle Textでのドキュメント・セクションの検索」
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,
);
使用上のノート
-
FILTERBY列のセクションへのマッピングはオプションです。FILTERBY列にセクション・マッピングが存在しない場合、その列はSDATAセクションにマップされ、セクション名はFILTERBY列の名前になります。 -
コンポジット・ドメイン索引の
CREATEINDEX時にセクション・グループを指定しない場合は、デフォルト・セクション・グループ設定が使用され、FILTERBYおよびORDERBYの各列に対してSDATAセクションが作成されます。ノート:
セクション名では特定の特殊文字が使用できず、大/小文字が区別されないため、列名で大/小文字が区別されているかまたは特殊文字が使用されている場合は、エラーが発生します。この問題を回避するには、索引を作成する前に、列をMDATAまたはSDATAセクションにマップする必要があります。 -
MDATAにマップされている列がORDERBY列句でも使用されている場合は、エラーが発生します。 -
列セクション名は、セクション・グループ内で一意です。つまり、
FOOというMDATA列セクションがすでにある場合、MDATA列セクション名にFOOを指定することはできません。また、FOOというSDATA列セクションがすでにある場合、フィールド・セクション名にFOOを使用することはできません。このルールは、列セクションの作成方法が暗黙的(FILTERBYまたはORDERBY句のCREATEINDEXで作成)か、明示的(CTX_DDL.ADD_SDATA_COLUMNで作成)かに関係なく適用されます。 -
1つの
FILTERBY列にマップできるのは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としてマップされます。
Oracle Database 12c リリース2 (12.2)以降では、検索可能な複数値の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プロシージャを使用して設定できます。
構文
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演算子で使用する比較のセマンティクスを指定します。検索可能なSDATAセクションでサポートされるデータ型は次のとおりです:
-
VARCHAR2: 最大249バイトの文字データをデータベース文字セットで格納します。この制限を超えると、ドキュメント単位での索引付けエラーになります。SDATAセクション値の前後の空白は、抽出時にセクショナによって常に切り捨てられます。この処理方法は、SDATA列の場合とは異なります。列の値が切り捨てられることはありません。どのデータ型のSDATAの値についても、レクサー処理は実行されません。 -
NUMBER: 数値リテラルを格納します。 -
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> -
BINARY_FLOAT: 32ビットの浮動小数点数を格納します。 -
BINARY_DOUBLE: 64ビットの浮動小数点数を格納します。 -
TIMESTAMP:TIMESTAMPデータ型は、DATEデータ型の拡張です。日付の年、月、日の値、および、時刻の時、分、および秒の値が格納されます。
DATEデータ型では格納されない小数秒も格納されます。小数秒の精度は、9以下です。TIMESTAMP値は、ISO書式に従う必要があります。TIMESTAMPリテラルは、YYYY-MM-DDTHH:MI:SSの形式で指定できます。次に例を示します:<TAG>1997-11-05T19:20:00</TAG> -
TIMESTAMP_WITH_TIMEZONE:TIMESTAMP_WITH_TIMEZONEデータ型はTIMESTAMPデータ型のバリアントで、値にはタイム・ゾーン・オフセットまたはタイム・ゾーン・リージョン名が含まれます。小数秒の精度は、9以下です。
TIMESTAMP_WITH_TIMEZONE値は、ISO書式に従う必要があります。次に例を示します:<TAG>1997-12-31T19:20:00-05:00</TAG>
ノート:
検索可能な
SDATAセクションでは、CHARおよびRAWデータ型がサポートされません。ソート可能なSDATAセクションでサポートされるデータ型は次のとおりです:
-
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>になります。 -
NUMBER: 数値リテラルを格納します。 -
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>
ノート:
ソート可能な
SDATAセクションでは、ヒットリストでsdata nameを使用して指定されている場合、TIMESTAMPデータ型がサポートされます。この場合、searchまたはsort_and_search属性値のoptimized_for属性を使用して、TIMESTAMPデータ型を明示的に指定する必要があります。この項の最後に、詳細な例を示します。 -
制限事項
-
指定のドキュメントに
SDATAタグがない場合は、NULLのSDATA値として処理されます。 -
空の
SDATAタグはNULL値として処理されます。 -
SDATAセクションはネストできません。内部でネストされたセクションは無視されます。 -
SDATAセクションは、skipjoinsおよびprintjoinsの文字をサポートしていません。
例
-
検索可能なSDATAセクションを作成して問い合せるには:
次の文は、データが2行あるtabという名の表を作成します:
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>');次の文は、
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セクションを作成して問い合せるには:
ここでは、ソート可能なSDATAセクションのヒットリストで
timestampデータ型をsdata nameとともに使用する方法を確認できます。次の文では、
t1という名前の表が作成されます:create table t1(text varchar2(100)); insert into t1 values('Oracle1 <TAG1>1997-01-31T09:26:50.12</TAG1>');次の文は、
sgという名前の基本セクション・グループを作成し、SDATAセクション(sec01)をグループに追加し、timestampデータ型およびoptimized for属性によってSDATAセクションをソート可能にします。exec ctx_ddl.create_section_group('sg','basic_section_group'); exec ctx_ddl.add_sdata_section('sg','sec01','tag1','timestamp'); exec ctx_ddl.set_section_attribute('sg','sec01','optimized_for','sort');次の文では、
sgに索引idx1が作成されます:create index idx1 on t1(text) indextype is ctxsys.context parameters('section group sg');次の文では、
t1を問い合せて、ソート可能なSDATAを示します。ここでは、sdata nameを使用して、ヒットリストでSDATAセクション(sec01)を指定します:select * from ctx_user_index_errors; set long 32000 set pagesize 0 variable displayrs clob; declare rs clob; begin ctx_query.result_set('idx1','Oracle1', '<ctx_result_set_descriptor> <count/> <hitlist start_hit_num="1" end_hit_num="10"> <score/> <sdata name="sec01"/> </hitlist> </ctx_result_set_descriptor>',rs); select rs into :displayrs from dual; dbms_lob.freetemporary(rs); end; / select :displayrs from dual;出力では、キーワード
Oracle1に一致するドキュメントが戻されます。ドキュメントのSDATA属性はw?3、関連性スコアは3です。<ctx_result_set><hitlist><hit><score>3</score> <sdata name="SEC01">w?3'</sdata></hit></hitlist> <count>1</count></ctx_result_set>
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のみを戻します。
関連トピック
「WITHIN」
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');
関連トピック
「WITHIN」
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です。デフォルトでは、CREATEINDEXまたはALTERINDEXに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をコールするユーザーにはCREATETRIGGER権限が必要です。再構築モードの最適化は、次の制限事項で
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索引表は最適化されません。高速最適化は、ローカルのOracle Text検索索引ではサポートされていません。
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
-
索引がグローバル非パーティション索引である場合は、
ALTERINDEXの場合と同様に、同じ索引レベルのパラメータ文字列を指定します。NULL以外の場合、パラメータ文字列はREPLACEで開始する必要があります。必要に応じてSWAPまたはNOSWAPを指定します。デフォルトはSWAPです。 - parallel_degree
-
将来の使用のために予約されています。並列度を指定します。現在のリリースでは、パラレル操作はサポートされていません。
- partition_name
-
ローカル・パーティション索引に対して有効な索引パーティション名を指定します。名前を指定しない場合、デフォルトは
NULLです。索引がパーティション化されている場合は、最初にパーティション名を渡し、次にALTERINDEXREBUILDPARTITIONのパーティション・レベルのパラメータ文字列を指定します。
例
例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から、新しい情報が即時に反映されない場合があることに注意してください。INDEXTYPEISctxsys.contextONLINEを使用した索引の作成と同様に、索引の再作成操作が完了した後は、その索引を同期化して最新の状態にする必要があります。 -
同期化と最適化の動作:
再作成操作の過程で索引に対して発行された同期化は、古い既存のデータと照合して処理されます。問合せでエラーが戻る時間帯と同じ時間帯には、同期化もブロックされます。
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_copyTrueまたは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値が使用されます。自動同期化(つまり、SYNCONCOMMITまたはSYNCEVERY)では、lockingパラメータは無視されます。指定した制限時間は概算として処理されます。実際の時間は、指定した時間よりも若干短くまたは長くなることがあります。
maxtimeのタイマーは、SYNCロックを取得したときに開始します。 - locking
-
同じ索引または索引パーティションに対して別の同期化がすでに実行されている場合の
SYNC_INDEXの対応を構成します。SYNC_INDEXが索引名なしで起動されてlockingが無視される場合は、かわりにLOCK_NOWAITのlocking値が使用されます。自動同期化(つまり、SYNCONCOMMITまたはSYNCEVERY)では、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);