CTX_DDL PL/SQLパッケージには、テキスト索引に必要なプリファレンス、セクション・グループおよびストップリストを作成および管理するプロシージャが用意されています。
CTX_DDLには、次のストアド・プロシージャおよびファンクションが含まれています。
| 名前 | 説明 |
|---|---|
属性セクションをXMLセクション・グループに追加します。 |
|
自動最適化の対象である索引のリストに、索引またはパーティションを追加します。 |
|
フィールド・セクションを作成し、指定したセクション・グループに割り当てます。 |
|
索引をカタログ索引プリファレンスに追加します。 |
|
ドキュメントの |
|
|
|
|
|
|
|
|
|
|
|
既存のセクション・グループ属性の値のリストに、セクション・グループ属性値を追加します。 |
|
特殊セクションをセクション・グループに追加します。 |
|
ストップクラスをストップリストに追加します。 |
|
停止セクションを自動セクション・グループに追加します。 |
|
ストップテーマをストップリストに追加します。 |
|
ストップワードをストップリストに追加します。 |
|
サブレクサーをマルチレクサー・プリファレンスに追加します。 |
|
ゾーン・セクションを作成し、それを指定されたセクション・グループに追加します。 |
|
ポリシーのコピーを作成します。 |
|
|
|
|
|
テキスト・データ・ディクショナリにプリファレンスを作成します。 |
|
テキスト・データ・ディクショナリにセクション・グループを作成します。 |
|
受け取った索引に対してポリシーを作成します。非パーティション索引の場合は、索引表も作成します。 |
|
ストップリストを作成します。 |
|
索引セットを削除します。 |
|
ポリシーを削除します。 |
|
テキスト・データ・ディクショナリからプリファレンスを削除します。 |
|
テキスト・データ・ディクショナリからセクション・グループを削除します。 |
|
シャドウ索引を削除します。 |
|
ストップリストを削除します。 |
|
シャドウ索引のメタデータとデータをスワップします。 |
|
索引を最適化します。 |
|
元表または表パーティション内のROWIDすべてを含めた保留キューを移入します。 |
|
CTX_DDLプリファレンスに関連するプロシージャが暗黙的なコミットを発行するかどうか指定します。 |
|
受け取った索引を再作成します。 |
|
既存のセクション・グループ属性の値のリストから、特定のセクション・グループ属性値を削除します。 |
|
自動最適化の対象である索引のリストから、索引またはパーティションを削除します。 |
|
|
|
ドキュメントから |
|
セクション・グループからセクションを削除します。 |
|
ストップクラスをストップリストから削除します。 |
|
ストップリストからストップテーマを削除します。 |
|
ストップリストからストップワードを削除します。 |
|
サブレクサーをマルチレクサー・プリファレンスから削除します。 |
|
ローカル・ドメイン索引のメタデータを置換します。 |
|
プリファレンスの属性を設定します。 |
|
名前で指定したセクション・グループに、セクション・グループ固有の属性を追加します。 |
|
セクション属性を設定します。 |
|
索引を同期化します。 |
|
プリファレンスから属性の設定を削除します。 |
|
サブレクサーを更新します。 |
|
セクション・グループ固有の属性を削除します。 |
|
ポリシーを更新します。 |
|
SDATAセクションを更新します。 |
属性セクションを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);
XMLセクション・グループの名前を指定します。属性セクションは、XMLセクション・グループにのみ追加できます。
属性セクションの名前を指定します。この名前は、属性テキストに対するWITHIN問合せで使用されます。
指定するセクション名には、コロン(:)、カンマ(,)またはドット(.)は使用できません。また、セクション名は、group_nameの中で一意であることが必要です。セクション名の大/小文字は区別されません。
属性セクション名の長さは、64バイト以内にしてください。
属性の名前は、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'
自動最適化の対象である索引のリストに、索引またはパーティションを追加します。パーティション索引の場合はパーティションの名前を指定する必要があり、指定しないとエラーが発生します。グローバル索引の場合はSTAGE_ITABを有効にする必要があり、有効にしないとエラーが発生します。
AUTO_OPTIMIZE機能により、STAGE_ITAB機能を使用する索引の管理性が向上します。STAGE_ITAB機能は、新しく同期化されたドキュメントから投稿を収集するため、$Gステージング表を導入しています。
AUTO_OPTIMIZE機能の目的は、次のとおりです。
索引およびパーティションをバックグラウンドAUTO_OPTIMIZEプロセスに登録できます。
適切な時間に$G表から$Iに行を自動的に移動します。
$Gから$Iへの行の移動が問合せパフォーマンスを最大化する方法で実行されます。
このプロシージャは、まだ起動していない場合にバックグラウンド・プロセスを起動します。自動最適化のプロセスは、CTXロギングによって追跡されます。
このプロシージャによる変更は、ただちに有効になります。
注意:
init.oraパラメータJOB_QUEUE_PROCESSESを1以上に設定する必要があります。JOB_QUEUE_PROCESSESの詳細は、『Oracle Databaseリファレンス』を参照してください。
構文
CTX_DDL.ADD_AUTO_OPTIMIZE(
idx_name IN VARCHAR2,
part_name IN VARCHAR2 default NULL,
optlevel IN VARCHAR2 default CTX_DDL.OPTLEVEL_MERGE
);
追加する索引の名前を指定します。
追加するパーティションの名前を指定します。
CTX_DDL.OPTIMIZE_INDEXプロシージャのoptlevelを指定します。このパラメータで唯一有効な値はmergeです。
注意
自動最適化を使用するときの推奨手順は、次のとおりです。
必要な索引を作成します。
CTX_DDL.ADD_AUTO_OPTIMIZEプロシージャを使用して、自動最適化リストに索引を追加します。
索引の同期化操作によって、自動最適化ジョブの実行は自動的に開始されます(すでに実行中の場合は除く)。このジョブは、処理対象がなくなるまで続行されます。今後の索引同期化でも、すでに実行中でないかぎり、自動最適化ジョブの実行は自動的に始まります。
フィールド・セクションを作成し、そのセクションを既存のセクション・グループに追加します。これによって、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 );
section_nameを追加するセクション・グループの名前を指定します。1つのセクション・グループに追加できるフィールド・セクションの数は無制限です。同じグループ内では、セクション・ゾーン名とセクション・フィールド名は同じ名前にできません。
group_nameに追加するセクションの名前を指定します。この名前は、問合せでセクションを識別する場合に使用します。英数字以外の文字(_など)は問合せでエスケープされるため、これらの文字を含む名前は使用しないでください。セクション名の大/小文字は区別されません。
同じグループ内では、ゾーン・セクション名とフィールド・セクション名は同じ名前にできません。語句PARAGRAPHおよびSENTENCEは、特殊セクション用に予約されています。
セクション名はタグ内で一意である必要はありません。詳細を検索しやすいように、同じセクション名を複数のタグに割り当てることができます。
セクションの開始をマークするタグを指定します。たとえば、タグが<H1>の場合は、H1を指定します。指定する開始タグは、セクション・グループ内で一意であることが必要です。
group_nameがHTML_SECTION_GROUPの場合は、METAタグのNAME/CONTENT属性の組に対してフィールド・セクションを作成できます。それには、tagをmeta@namevalueとして指定します。この場合、namevalueはNAME属性の値で、対応するCONTENT属性がセクションとして索引付けられます。「<META>タグに対するセクションの作成」の例を参照してください。
Oracle Textは、セクション・グループ作成時に指定したgroup_typeパラメータから終了タグを認識します。
ドキュメントの残りの部分でテキストを参照できるようにするには、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問合せで繰返しセクションを区別するには、これらをゾーン・セクションとして定義します。
関連項目
"WITHIN"
サブ索引をカタログ索引プリファレンスに追加します。このプリファレンスを作成するには、元表の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バイトを超えることはできません。
関連項目
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]
);
名前が付けられたrowidを含むテキスト索引の名前。
MDATAセクションの名前。
ドキュメントに追加するメタデータ値。
メタデータ値を追加するROWID。
索引パーティションの名前(ある場合)。ローカル・パーティション索引に指定する必要があり、グローバルの非パーティション索引では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にロギングされます。
これらの更新は、元表に格納されている実際の内容ではなく索引自体に直接反映されます。したがって、テキスト索引が再構築されると存続しません。
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として追加しないでください。
MDATAセクションを値とともに既存のセクション・グループに追加します。MDATAセクションは、NULLセクション・グループ、PATHセクション・グループまたはAUTOセクション・グループには追加できません。
セクション値は簡易正規化されます。
値に隣接する空白は削除されます。
値は64バイトに切り捨てられます。
値は単一の値として索引付けされます。値が複数のワードから構成されていても、分割されません。
大/小文字の区別は保持されます。ドキュメントが動的に生成される場合は、MDATA値を大文字にし、検索対象を大文字のみにすることで大/小文字の無区別を実装します。
セクションを削除するには、CTX_DDL.REMOVE_SECTION を使用します。
構文
CTX_DDL.ADD_MDATA_SECTION(
group_name IN VARCHAR2,
section_name IN VARCHAR2,
tag IN VARCHAR2,
);
例
この例では、authというMDATAセクションを作成します。
ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP');
ctx_ddl.add_mdata_section('htmgroup', 'auth', 'author');
同じようなスペルの一致を検索します。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;
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セクションにマップする必要があります。この章の「CTX_DDL.ADD_MDATA_COLUMN」または「CTX_DDL.ADD_SDATA_COLUMN」を参照してください。
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です。
SDATAセクションをセクション・グループに追加します。デフォルトでは、すべてのFILTER BY列がSDATAとしてマップされます。
構文
構文は、次のとおりです。
CTX_DDL.ADD_SDATA_SECTION(
group_name IN VARCHAR2,
section_name IN VARCHAR2,
tag IN VARCHAR2,
datatype IN VARCHAR2 default NULL,
);
セクションを含むグループの名前。
SDATAセクションの名前。
SDATAセクションに追加するタグの名前。
格納されるデータの形式を指定し、後でSDATA演算子で使用する比較のセマンティクスを指定します。デフォルトはVARCHAR2ですが、指定する場合は次のいずれかの値にする必要があります。
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セクションの最大数は99です。つまり、FILTER BYおよびORDER BYで暗黙的に作成され、CTX_DDL.ADD_SDATA_SECTION() APIで明示的に作成される索引のSDATAセクションの合計は99です。
SDATAは単独で出現します。SDATAタグの複数インスタンスが単一のドキュメントに出現する場合は、後のインスタンスが前のインスタンスで設定された値よりも優先されます。これは、最後に出現するSDATAタグが有効になることを意味します。
指定のドキュメントにSDATAタグがない場合は、NULLのSDATA値として処理されます。
空のSDATAタグはNULL値として処理されます。
SDATAセクションはネストできません。内部でネストされたセクションは無視されます。
SDATAセクションおよび列の最大数は99です。
特殊セクション(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;
関連項目
"WITHIN"
ストップクラスをストップリストに追加します。ストップクラスは、索引付けされていないトークンのクラスです。ストップリストは、ストップパターンを使用した250以上のストップクラスを指定できません。これは、NUMBERSストップクラスを含みません。ストップ・パターンを使用して索引付けする場合、索引付けのパフォーマンスを最適化するために、メモリー設定を少なくとも500MBから1GBにすることをお薦めします。
構文
CTX_DDL.ADD_STOPCLASS( stoplist_name IN VARCHAR2, stopclass IN VARCHAR2, stoppattern IN VARCHAR2 default NULL );
ストップリストの名前を指定します。
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です。
ストップリストに追加するストップ・パターンを指定します。ストップクラスをパターン・クラスとして指定する場合は、ストップ・パターンを指定する必要があります。ストップ・パターンの指定には、Oracle正規表現を使用できます。
ストップリストに複数のストップ・パターンを追加するには、ADD_STOPCLASSプロシージャを複数回コールします。ストップクラスに複数のストップ・パターンを追加するには、異なるストップクラス名を指定する必要があります。
デフォルトでは、ストップ・パターンの大/小文字は区別されませんが、MIXED_CASEレクサー・プリファレンスを有効にすると、大/小文字を区別して動作するようになります。ストップ・パターンには、最大で512まで指定できます。ストップ・パターンを使用して索引付けする場合、索引付けのパフォーマンスを最適化するために、メモリー設定を少なくとも500MBから1GBにすることをお薦めします。
関連項目:
Oracle正規表現の構文の詳細は、『Oracle Database開発ガイド』を参照してください
例
次の例は、ストップクラス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に一致します。
停止セクションを自動セクション・グループに追加します。停止セクションを追加すると、自動セクションの索引付け操作で、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;
単一のストップテーマをストップリストに追加します。ストップテーマは、索引付けされていないテーマです。
英語では、ABOUT演算子を使用して索引テーマを問い合せます。
構文
CTX_DDL.ADD_STOPTHEME( stoplist_name IN VARCHAR2, stoptheme IN VARCHAR2 );
例
次の例では、ストップテーマbankingをストップリストmystopに追加します。
begin
ctx_ddl.add_stoptheme('mystop', 'banking');
end;
単一のストップワードをストップリストに追加します。
ストップワードのリストを作成するには、ワードごとにこのプロシージャを1回コールする必要があります。
構文
CTX_DDL.ADD_STOPWORD(
stoplist_name IN VARCHAR2,
stopword IN VARCHAR2,
language IN VARCHAR2 default NULL,
language_dependent IN BOOLEAN default TRUE
);
ストップリストの名前を指定します。
追加するストップワードを指定します。
言語固有のストップワードは、その言語固有の他のストップワードとの間で一意であることが必要です。たとえば、ドイツ語のdieと英語のdieを同じストップリスト内に含めることは有効です。
ストップリストに追加できるストップワード、ストップテーマおよびストップクラスの数の最大値は4095です。
stoplist_nameで指定したストップリストがMULTI_STOPLIST型の場合は、stopwordの言語を指定します。Oracle Textがサポートしている言語のグローバリゼーション・サポート名または略称を指定する必要があります。
ストップワードを複数の言語でアクティブにするには、このパラメータにALLを指定します。たとえば、任意の言語で停止が必要な英語のフラグメントを含む国際文書の場合は、ALLストップワードを定義すると便利です。
ALLストップワードは、すべての言語でアクティブです。マルチレクサーを使用すると、そのストップワードの言語固有のレクサー処理が発生します。この状態は、そのストップワードを複数の特定言語に繰り返し追加した場合と同じです。
それ以外の場合は、NULLを指定します。
ユーザー定義の任意の文字列を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;
注意:
ストップワードは、ALTER INDEXを使用して索引を作成した後に追加します。
ALLストップワードの追加
次の例では、ワードtheをALLストップワードとして、マルチ言語のストップリストgloballistに追加します。
begin
ctx_ddl.add_stopword('globallist','the','ALL');
end;
サブレクサーをマルチレクサー・プリファレンスに追加します。サブレクサーは、マルチレクサー(マルチ言語)・プリファレンスで言語を識別します。複数の言語を索引付けする必要がある場合は、マルチレクサー・プリファレンスを使用します。
構文
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
);
マルチレクサー・プリファレンスの名前を指定します。
サブレクサーのグローバリゼーション・サポート言語の名前または略称を指定します。たとえば、日本語に対してはJAPANESEまたはJAを指定します。
sub_lexerで指定したサブレクサーは、言語列が、languageの略称グローバリゼーション・サポート名と同等の値(大/小文字を区別しない)を持つ場合に使用されます。
元表内の言語列の値がNULL、無効またはサブレクサーにマップされていない場合は、DEFAULTを指定し、デフォルトのサブレクサーを割り当てます。DEFAULTレクサーも、ストップワードの解析に使用されます。
指定したlanguageに対するサブレクサー定義がすでに存在する場合は、このコールで置換されます。
この言語に対して使用するサブレクサーの名前を指定します。
オプションで、languageの代替値を指定します。
languageに対してDEFAULTを指定した場合、alt_valueは指定できません。
alt_valueは30バイトに制限されており、グローバリゼーション・サポート言語の名前、略称またはDEFAULTは指定できません。
ユーザー定義の任意の文字列を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は参照のみを記録します。サブレクサーの値は索引作成時に、索引値の記憶域にコピーされます。
ゾーン・セクションを作成し、そのセクションを既存のセクション・グループに追加します。これによって、WITHIN演算子を使用してゾーン・セクション内を検索できます。
ゾーン・セクションは、開始および終了タグで区切られたセクションです。たとえば、HTMLの<B>および</B>タグは、ボールド体で表示されるワードの範囲をマークします。
ゾーン・セクションは、ゾーン・セクション内で互いにネストしたりオーバーラップすることが可能です。また、1つのドキュメント内で複数出現させることが可能です。
構文
CTX_DDL.ADD_ZONE_SECTION( group_name IN VARCHAR2, section_name IN VARCHAR2, tag IN VARCHAR2 );
section_nameを追加するセクション・グループの名前を指定します。
group_nameに追加するセクションの名前を指定します。この名前は、WITHIN問合せでセクションを識別する場合に使用します。英数字以外の文字(_など)の多くは特殊であり、問合せでエスケープされるため、これらの文字を含む名前は使用しないでください。セクション名の大/小文字は区別されません。
同じグループ内では、ゾーン・セクション名とフィールド・セクション名は同じ名前にできません。語句PARAGRAPHおよびSENTENCEは、特殊セクション用に予約されています。
セクション名はタグ内で一意である必要はありません。詳細を検索しやすいように、同じセクション名を複数のタグに割り当てることができます。
セクションの開始をマークするパターンを指定します。たとえば、<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"
CTX_DOC.POLICY_*プロシージャおよびORA:CONTAINSファンクションで使用するポリシーを作成します。ORA:CONTAINSは、existsNode()を使用したXPATH問合せ式内で使用するファンクションです。
関連項目:
『Oracle XML DB開発者ガイド』
構文
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','0');
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');
テキスト・データ・ディクショナリにプリファレンスを作成します。プリファレンスは、CREATE INDEXまたはALTER INDEX のパラメータ文字列で指定します。
注意:
CTX_DDL.CREATE_PREFERENCEでは、ALTER SESSION SET current_schemaによって設定された現行のスキーマは考慮されません。したがって、別のユーザーが所有するプリファレンスを作成または削除する必要がある場合は、その状態を明示的に記述する必要があります。そのためにはCREATE ANY TABLEシステム権限が必要です。
My Oracle Support (https://support.oracle.com)のNote 249991.1「Oracle Text Overview of New Features in Release 10g」を参照してください。この資料では、Oracle Databaseリリース10g以降に関連する技術の概要を説明しています。
構文
CTX_DDL.CREATE_PREFERENCE(preference_name in varchar2,
object_name in varchar2);
作成するプリファレンスの名前を指定します。
プリファレンス型の名前を指定します。
関連項目:
プリファレンス型および関連する属性の完全なリストは、「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;
次の例では、索引付けするファイルがオペレーティング・システムに格納されていることをシステムに知らせるmyprefというデータ記憶域プリファレンスを作成します。その後、CTX_DDL.SET_ATTRIBUTE を使用して、PATH属性をディレクトリ/docsに設定します。
begin
ctx_ddl.create_preference('mypref', 'FILE_DATASTORE');
ctx_ddl.set_attribute('mypref', 'PATH', '/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');
テキスト列にセクションを定義するためのセクション・グループを作成します。
セクション・グループを作成する場合は、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 );
作成するセクション・グループ名を[user.]section_group_nameのように指定します。このパラメータは、1人の所有者内で一意であることが必要です。
セクション・グループのタイプを指定します。group_typeパラメータは次のいずれかです。
| セクション・グループ・プリファレンス | 説明 |
|---|---|
|
どのセクションも定義しないか、またはSENTENCEかPARAGRAPHセクションのみを定義する場合は、このグループ・タイプを使用します。これはデフォルトです。 |
|
このグループ・タイプを使用して、開始および終了タグが 注意: このグループ・タイプでは、対になっていないカッコ、コメント・タグおよび属性などの入力はサポートされません。これらを入力するには、 |
|
このグループ・タイプを使用して、HTMLドキュメントを索引付けし、HTMLドキュメントのセクションを定義します。 |
このグループを使用してJSON対応コンテキスト索引を作成します。 |
|
|
このグループ・タイプを使用して、XMLドキュメントを索引付けし、XMLドキュメントのセクションを定義します。 |
|
このグループ・タイプを使用して、XMLドキュメントの開始タグ/終了タグに対して自動的にゾーン・セクションを作成します。XMLタグから導出されるセクション名は、XML内と同様に大/小文字が区別されます。 属性セクションは、属性を持つXMLタグに対して自動的に作成されます。属性セクションは、attribute@tagという形式でネーミングされます。 停止セクション、空のタグ、処理命令およびコメントは、索引付けされません。 自動セクション・グループには次の制限事項が適用されます。
|
|
このグループ・タイプを使用して、XMLドキュメントを索引付けします。このタイプは、 相違点は、このセクション・グループを使用すると、 |
|
このグループ・タイプを使用して、RFC 1036に従ったニュース・グループ形式のドキュメントのセクションを定義します。 |
例
次のコマンドは、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"
指定した索引に対して索引メタデータ(またはポリシー)を作成します。索引がパーティション化されていない場合は、索引表も作成します。このプロシージャは、Oracle DatabaseのEnterprise Editionのみでサポートされています。
次の変更はサポートされていません。
非コンポジット・ドメイン索引からコンポジット・ドメイン索引の変換、またはコンポジット・ドメイン索引の列の変更
索引表がパーティション化されている索引($I、$P、$Kなど)の再構築
注意:
パーティション索引の場合は、最初にこのプロシージャをコールして、シャドウ索引メタデータを作成する必要があります。このプロシージャでは索引表は作成されません。問合せ、DML、同期化または最適化の各操作への影響はありません。
構文
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は、オンライン保留キューにロギングされ、後で処理されます。
CTX_DDL.SYNC_INDEXでの同期化は、通常、索引に対して実行されます。OPTIMIZE_INDEXの実行では、なにも処理されませんが、エラーも戻りません。
関連項目
ALTER INDEX のPOPULATE | NOPOPULATE
「Oracle TextのSQL文と演算子」の「CREATE INDEX」
CTX_DDL.DROP_SHADOW_INDEX
CTX_DDL.EXCHANGE_SHADOW_INDEX
CTX_DDL.SYNC_INDEX
CTX_DDL.POPULATE_PENDING
新しい空のストップリストを作成します。ストップリストには、索引付けしないワードまたはテーマを含めることができます。
言語固有のストップワードを保持するマルチ言語のストップリストを作成することもできます。マルチ言語のストップリストは英語、ドイツ語および日本語などの異なる言語のドキュメントを含む表の索引付けに有効です。索引付けを実行する場合は、テキスト表に言語列が含まれている必要があります。
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');
作成するストップリストの名前を指定します。
単一言語のストップリストを作成するには、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;
DROP_PREFERENCEプロシージャは、指定したプリファレンスをテキスト・データ・ディクショナリから削除します。プリファレンスを削除しても、そのプリファレンスを使用して作成された索引には影響を与えません。
例
次の例は、プリファレンスmy_lexerを削除します。
begin
ctx_ddl.drop_preference('my_lexer');
end;
関連項目
「CTX_DDL.CREATE_PREFERENCE 」
DROP_SECTION_GROUPプロシージャは、指定したセクション・グループおよびそのグループ内のすべてのセクションをテキスト・データ・ディクショナリから削除します。
例
次の例は、セクション・グループhtmgroupおよびそのすべてのセクションを削除します。
begin
ctx_ddl.drop_section_group('htmgroup');
end;
指定した索引のシャドウ索引を削除します。シャドウ索引を削除するときに、その索引がパーティション化されている場合は、このシャドウ索引のメタデータと、このシャドウ索引のパーティションすべてのメタデータが削除されます。このプロシージャは、シャドウ索引表もすべて削除し、オンライン保留キューをクリーン・アップします。
例
次の例は、シャドウ索引myshadowidxを削除します。
begin
ctx_ddl.drop_shadow_index('myshadowidx');
end;
関連項目
CTX_DDL.CREATE_SHADOW_INDEX
テキスト・データ・ディクショナリからストップリストを削除します。ストップリストを削除した場合は、変更を有効にするために索引を再作成または再構築する必要があります。
例
次の例は、ストップリストmystopを削除します。
begin
ctx_ddl.drop_stoplist('mystop');
end;
関連項目
「CTX_DDL.CREATE_STOPLIST 」
このプロシージャは、索引(または索引パーティション)メタデータと索引(または索引パーティション)データをスワップします。
非パーティション索引の場合は、メタデータと索引データの両方がスワップされ、オンライン保留キューが処理されます。
構文
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の場合は、索引メタデータがスワップされます。ローカル・パーティション索引をオンラインで再作成する場合は、このプロシージャを手順の最後に実行します。
索引を最適化します。索引の最適化は、同期化の後に実行します。索引を最適化すると、古いデータが削除され、索引の断片化が最小限度に抑えられます。その結果、問合せ応答時間を短縮できます。問合せおよび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列のパーティション化スキームは使用できません。
トークン・モードでは、最適化する特定のトークンを指定します(たとえば、ワードelectionsを含むドキュメントを持つ行すべて)。このモードを使用して、参照頻度の低いトークンの最適化に要する時間を節約しながら、検索頻度の高い索引トークンを最適化します。トークンを最適化すると、問合せ応答時間を短縮できます(最適化されたトークンで問い合せる場合のみ)。
トークン型の最適化はトークン・モードに似ていますが、最適化がフィールド・セクション、MDATAセクション、またはSDATAセクション(たとえば、<A>タグのあるセクション)で実行される点が異なります。これは、重要なフィールドまたはMDATAセクションを最適な状態に保持する場合に有効です。
DML操作で多用されるCONTEXT索引の$I表を最適化するには、マージ・モードを使用します。マージ処理によって$G表から古いデータが削除され(行が削除され)、既存のデータが$G表に圧縮されて、そのデータが$I表にコピーされます。特定のトークンにマージ最適化を使用すると、そのトークンのみが$G表から$I表にコピーされます。
索引を最適化する一般的な方法は、参照頻度の高い語句で通常のトークン・モードの最適化を実行し、再構築モードの最適化はあまり実行しないという方法です。(実行頻度の高い問合せを見つけるには、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
);
索引の名前を指定します。索引名を指定しない場合は、Oracle Textによって最適化する索引が1つ選択されます。
最適化レベルを文字列で指定します。最適化には、次のいずれかの方法を指定できます。
| optlevelの値 | 説明 |
|---|---|
|
この方法では、断片化した行が圧縮されます。ただし、古いデータは削除されません。
|
|
このモードでは、索引全体または索引の一部を最適化できます。この方法では行が圧縮され、古いデータ(削除済の行)が削除されます。完全モードでの最適化は、削除済の行が存在しない場合でも実行されます。 完全最適化は、 |
|
この
|
|
この方法では、最適化する特定のトークンを指定します。Oracle Textでは、tokenで指定されたトークンに対して完全最適化を実行します。指定されたトークン型がない場合は、0(ゼロ)がデフォルトとして使用されます。 検索頻度の高いトークンの最適化には、この方法を使用します。
|
|
この最適化レベルでは、入力トークン型に一致する索引内のすべてのトークンがオンデマンドで最適化されます。
|
|
このoptlevelは、 特定のトークンにこのオプションを使用すると、そのトークンのみが$G表から$I表にコピーされます。 マージ最適化は、 |
$S索引表に対するCTX_DDL.OPTIMIZE_INDEXの動作は、次のとおりです。
| optlevelの値 | $S索引表の最適化 | 注意 |
|---|---|---|
|
いいえ |
|
|
はい |
|
|
はい |
|
|
いいえ |
|
|
はい |
|
FULLモードでの最適化の最大時間を分単位で指定します。
記号CTX_DDL.MAXTIME_UNLIMITEDを指定した場合(またはNULLで渡した場合)は、索引全体が最適化されます。これはデフォルトです。
最適化するトークンを指定します。
使用している索引がローカル索引の場合は、同期化する索引パーティションの名前を指定します。指定しない場合はエラーが戻されます。
使用している索引がグローバルで、非パーティション索引の場合は、NULLを指定します。これはデフォルトです。
最適化するtoken_typeを指定します。
パラレル最適化に対する並列度を数値で指定します。実際の並列度は、リソースによって異なります。
optlevel値ではシリアルに実行されるため、この設定ではこれらの値は無視されます。
TOKENまたはCTX_DDL.OPTLEVEL_TOKEN
FASTまたはCTX_DDL.OPTLEVEL_FAST
例
次の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;
注意
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と同時に実行すること。
これらのいずれかの組合せを実行する必要がある場合、エラーは生成されませんが、一方の処理が完了してからもう一方の処理が行われます。
元表または表パーティション内の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を保持するための十分な領域がこの表にあることを確認してください。
この変数は、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;
指定した索引を再作成します。あるいは、索引がローカル・パーティション索引の場合は、受け取った索引パーティションを再作成します。パーティション化されていないグローバル索引の場合、この手順は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 );
有効なCONTEXT索引タイプの名前。
索引がグローバル非パーティション索引である場合は、ALTER INDEXの場合と同様に、同じ索引レベルのパラメータ文字列を指定します。NULL以外の場合、パラメータ文字列はREPLACEで開始する必要があります。必要に応じてSWAPまたはNOSWAPを指定します。デフォルトはSWAPです。
予備。並列度を指定します。現在のリリースでは、パラレル操作はサポートされていません。
ローカル・パーティション索引に対して有効な索引パーティション名を指定します。名前を指定しない場合、デフォルトは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は許可され、通常どおりに処理されます。RECREATE_INDEX_ONLINE中に発生するDML文はすべて、オンライン保留キューにロギングされます。
再作成操作の終了間際には、索引の進捗状態を示すエラーによって、DMLが失敗となる短い時間帯があります。処理中にDMLが再度ハング状態になる場合があり、その長さは再作成処理の開始以降にオンライン保留キューにロギングされたDMLの数によって異なります。
索引の再作成操作が完了した後は、RECREATE_INDEX_ONLINEの開始以降に保留となったすべてのDMLから、新しい情報が即時に反映されない場合があることに注意してください。INDEXTYPE IS ctxsys.context ONLINEを使用した索引の作成と同様に、索引の再作成操作が完了した後は、その索引を同期化して最新の状態にする必要があります。
関連項目:
再作成の各段階を手動で実行し、各手順を必要な時期に実行するようにスケジュールする方法は、「CTX_DDL.CREATE_SHADOW_INDEX」および「CTX_DDL.EXCHANGE_SHADOW_INDEX」を参照してください。
「CONTEXT索引タイプの構文」のONLINEパラメータ"
再作成操作の過程で索引に対して発行された同期化は、古い既存のデータと照合して処理されます。問合せでエラーが戻る時間帯と同じ時間帯には、同期化もブロックされます。再作成操作の過程で索引に対して発行された最適化コマンドは、なにも実行されずにエラーなしで即時に戻ります。
再作成操作の間、索引は、ほぼ通常どおりに問い合せることができます。問合せでは、最後のスワップが終わるまで、既存の索引とポリシー(またはメタデータ)に基づいて結果が戻ります。
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が実施されます。
索引パーティションの再作成中はスワッピングが実行されないため、パーティションに対する問合せは通常どおりに処理されます。スワッピング段階に到達するまで、複数のパーティションにわたる問合せでは、パーティション全体で一貫した結果が戻ります。
DMLと同期化は通常どおりに処理されます。再作成中または構築済(ただし、スワップは未処理)のパーティションに対する最適化の実行では、なにも処理されずに単純に戻ります。再構築されていないパーティションに対する最適化の実行は、通常どおりに処理されます。
グローバル索引と同様に、すべてのパーティションでNOSWAPが使用されている場合は、既存の索引とほぼ等しいサイズの追加の記憶域が必要です。
索引パーティションのデータとメタデータは索引の再作成後にスワップされるため、複数のパーティションにわたる問合せでは、すべてのパーティションで一貫した結果が戻るわけではありません。しかし、各索引パーティションに関しては常に適切になります。また、パーティションの再作成の終了間際には、索引パーティションのスワップ時に発行した問合せに対して、列が索引付けされていないことを示すエラーが戻る短い時間帯があります。
SWAPを使用してパーティションが再作成するときは、既存の索引パーティションと等しいサイズの記憶域がさらに必要です。
パーティションに対するDMLはブロックされます。スワッピング中は同期化もブロックされます。
自動最適化の対象である索引のリストから、索引またはパーティションを削除します。この索引に対して、新しい自動最適化はコールされません。削除は、即座に反映されます。
指定した索引が既存の索引リストにない場合は、エラーが発生します。パーティション索引の場合は、パーティション名を指定しないとエラーが発生します。
構文
CTX_DDL.REMOVE_AUTO_OPTIMIZE(
idx_name IN VARCHAR2,
part_name IN VARCHAR2 default NULL
);
関連項目
ドキュメントから、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');
注意
これらの更新は、元表に格納されている実際の内容ではなく索引自体に直接反映されます。したがって、テキスト索引が再構築されると存続しません。
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;
ストップクラスをストップリストから削除します。
構文
CTX_DDL.REMOVE_STOPCLASS( stoplist_name IN VARCHAR2, stopclass IN VARCHAR2 );
例
次の例は、ストップクラスNUMBERSをストップリストmystopから削除します。
begin
ctx_ddl.remove_stopclass('mystop', 'NUMBERS');
end;
関連項目
ストップテーマをストップリストから削除します。
構文
CTX_DDL.REMOVE_STOPTHEME( stoplist_name IN VARCHAR2, stoptheme IN VARCHAR2 );
例
次の例は、ストップテーマbankingをストップリストmystopから削除します。
begin
ctx_ddl.remove_stoptheme('mystop', 'banking');
end;
関連項目
ストップワードをストップリストから削除します。ストップワードの削除を索引に反映させる場合は、索引を再構築する必要があります。言語に依存しないストップワードも削除できます。
構文
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 "
サブレクサーをマルチレクサー・プリファレンスから削除します。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;
関連項目
ローカル・ドメイン索引内のメタデータをグローバル(索引)レベルで置換します。
注意:
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を使用してください。
プリファレンスの属性を設定します。このプロシージャは、CTX_DDL.CREATE_PREFERENCE を使用してプリファレンスを作成した後で使用します。
構文
CTX_DDL.SET_ATTRIBUTE(
preference_name IN VARCHAR2,
attribute_name IN VARCHAR2,
attribute_value IN VARCHAR2
);
例
ファイル・データ記憶域の指定
次の例では、索引付けするファイルがオペレーティング・システムに格納されていることをシステムに知らせるfileprefというデータ記憶域プリファレンスを作成します。その後、CTX_DDL.SET_ATTRIBUTE を使用し、PATH属性をディレクトリ/docsに設定します。
begin
ctx_ddl.create_preference('filepref', 'FILE_DATASTORE');
ctx_ddl.set_attribute('filepref', 'PATH', '/docs');
end;
名前で指定したセクション・グループに、セクション・グループ固有の属性を追加します。
XML対応をサポートするxml_enableの設定にも使用されます。
構文
CTX_DDL.SET_SEC_GRP_ATTR(
group_name IN VARCHAR2,
attribute_name IN VARCHAR2,
attribute_value IN VARCHAR2
);
例
exec ctx_ddl.create_section_group('secgroup', 'PATH_SECTION_GROUP');
exec ctx_ddl.set_sec_grp_attr('secgroup', 'xml_enable', 'TRUE');
exec ctx_ddl.set_sec_grp_attr('json_group', 'json_enable', 'TRUE';
例8-10 JSON対応例
exec ctx_ddl.create_section_group('json_group', 'PA
TH_SECTION_GROUP');
/*A new 'json_enable' section attribute will be ava
ilable in 12.1.0.2 to enable json mode of context index*/
exec ctx_ddl.set_sec_grp_attr('json_group', 'json_enable', 't');
create table jtab2(j varchar2(4000) check (j is json));
insert into jtab2 values(
'{"person" : {"id" : ''124'', "name" : ''John Smith''}}');
insert into jtab2 values(
'{"person" : {"id" : ''125'', "name" : ''JennifierHwang'',
"college_majors" : [''cs'', ''literature'', ''english '']}}');
insert into jtab2 values(
'{"person" : {"id" : ''126'', "name" : ''Mark Dwight'',
"likeFootBall" : ''Y''}}');
insert into jtab2 values(
'{"person" : {"id" : ''127'', "name" : ''Zhen Hua Liu'',
"MachineLearning" : ''Y''}}');
insert into jtab2 values(
'{"person" : {"id" : ''128'', "name" : ''Jeffery Tang'',
"address" : {"city" : ''San Francisco''}}}');
insert into jtab2 values(
'{"person" : {"id" : ''129'', "name" : ''Cecilia Sutton'',
"address" : {"city" : ''San Mateo''}}}');
commit;
drop index jsn_ctx_idx ;
/* create json enabled text index */
create index jsn2_ctx_idx on jtab2 (j) indextype is
ctxsys.context parameters
(' section group json_group');
関連項目
特定のセクションの属性またはプロパティを指定するには、SET_SECTION_ATTRIBUTEを使用します。
「構文」に示した属性名がサポートされます。属性によっては、トークン化されたセクションにしか適用されません。トークン化されるセクション・タイプは次のとおりです。
フィールド・セクション
ゾーン・セクション
SDATAセクション
構文
CTX_DDL.SET_SECTION_ATTRIBUTE(
group_name IN VARCHAR2,
section_name IN VARCHAR2,
attribute IN VARCHAR2,
value IN VARCHAR2
);
セクション・グループの名前を指定します。
セクションの名前を指定します。
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の値に応じて、セクションはドキュメント・サービス・プロシージャ(スニペット、マークアップ、ハイライト)で表示または破棄されます。
属性の値を指定します。ブール値は、TRUEまたはFALSE、TまたはF、YESまたはNO、YまたはN、ONまたはOFF、あるいは1または0(ゼロ)で指定します。
例
次の例は、フィールド・セクションのvisible属性を有効にします。
begin
ctx_ddl.create_section_group('fieldgroup', 'BASIC_SECTION_GROUP');
ctx_ddl.add_field_section('fieldgroup', 'author', 'AUTHOR');
ctx_ddl.set_section_attribute('fieldgroup', 'author', 'visible', 'true');
end;
注意
CTX_DDL.SET_ATTRIBUTE と同様、このプロシージャもコミットを発行します。
関連項目
『Oracle Textアプリケーション開発者ガイド』の「Oracle Textでのドキュメント・セクションの検索」の章も参照してください。
索引を同期化し、元表に対する挿入、更新および削除を実行します。
注意:
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がnullの場合、変更を保留中のCONTEXTおよびCTXRULE索引はすべて同期されます。この操作を実行するには、ctxsysとして接続する必要があります。各索引または索引パーティションは、順に従って同期化されます。そのため、個々の同期化は、lockingをNOWAITに設定し、maxtimeを0に設定した状態で実行されます。SYNC_INDEXのコール時にlockingまたはmaxtimeパラメータに指定した値は無視されます。ただし、memoryおよびparallel_degreeパラメータは、個々の同期化ごとに渡されます。
同期化に使用するランタイム・メモリー容量を指定します。この値は、DEFAULT_INDEX_MEMORYシステム・パラメータをオーバーライドします。
memoryパラメータは、索引をディスクにフラッシュする前に、Oracle Textが同期化操作に使用するメモリー量を指定します。大きいメモリー量を指定すると、次のような効果が得られます。
I/Oが削減されるため索引付けのパフォーマンスが向上します。
断片化が削減されるため問合せのパフォーマンスとメンテナンスが向上します。
2つ目の引数に指定される索引付けのメモリー・サイズは、各パラレル・スレーブに適用されます。たとえば、memory引数が500M、parallel_degreeが2に設定される場合は、パラレルSYNC_INDEXのために少なくとも1GBのメモリーをシステムに用意してください。
小さいメモリー量を指定すると、ディスクI/Oおよび索引の断片化が増加しますが、ランタイム・メモリー容量が不足している場合に有効なことがあります。
使用している索引がローカル索引の場合は、同期化する索引パーティションの名前を指定します。指定しない場合はエラーが戻されます。
使用している索引がグローバルで、非パーティション索引の場合は、NULLを指定します。これはデフォルトです。
パラレル同期化に対する並列度を指定します。1より大きい数値を指定すると、パラレル同期化が実行されます。実際の並列度は、リソースによっては多少低くなります。
操作に対する提案制限時間を分単位で示します。SYNC_INDEXは、制限時間内でキュー内のドキュメントを可能なかぎり多数処理します。NULLのmaxtime値はCTX_DDL.MAXTIME_UNLIMITEDと同等です。このパラメータは、SYNC_INDEXが索引名なしで起動された場合は無視されます。その場合は、かわりに0のmaxtime値が使用されます。自動同期化(つまり、SYNC ON COMMITまたはSYNC EVERY)では、lockingパラメータは無視されます。
指定した制限時間は概算として処理されます。実際の時間は、指定した時間よりも若干短くまたは長くなることがあります。maxtimeのタイマーは、SYNCロックを取得したときに開始します。
同じ索引または索引パーティションに対して別の同期化がすでに実行されている場合の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と同時に実行しないでください。これらのいずれかの組合せを実行する必要がある場合、エラーは生成されませんが、一方の処理が完了してからもう一方の処理が行われます。
関連項目
"ALTER INDEX "
プリファレンスから属性の設定を削除します。
構文
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;
関連項目
セクション・グループ固有の属性を削除します。
構文
CTX_DDL.UNSET_SEC_GRP_ATTR(group_name varchar2,
attribute_name varchar2);
関連項目
サブレクサーを更新し、そのマルチレクサー・プリファレンス、言語またはサブレクサーを変更します。このプロシージャで、デフォルトのサブレクサーを更新することもできます。このプロシージャは、CTX_DDL.PREFERENCE_IMPLICIT_COMMIT変数と組み合せて使用できます。
関連項目:
"この変数の設定については、「PREFERENCE_IMPLICIT_COMMIT」を参照してください。
構文
UPDATE_SUB_LEXER (
lexer_name IN VARCHAR2,
language IN VARCHAR2,
sub_lexer IN VARCHAR2
);
更新が必要なマルチレクサー・プリファレンスの名前を指定します。
サブレクサーの言語名を指定します。デフォルトのサブレクサーにはDEFAULTを使用します。
グローバリゼーション・サポートの言語名、またはサブレクサーの略称を指定する方法は、「言語」を参照してください。
この言語に対して使用するサブレクサーの名前を指定します。
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);
UPDATE_SDATAは、索引の指定したSDATA値を変更する索引APIです。元表の列がSDATAセクションとして使用された可能性がある場合、元表の列値を保存または変更できません。
エクスポート/インポート操作では、指定したプリファレンスを使用して元表から索引を再構築します。UPDATE_SDATA APIを使用して行われた変更が元表に存在しないため、エクスポート/インポート操作でこれらの変更は保持されません。
UPDATE_SDATAでは元表ではなく、索引表に追加された一時メタデータを変更します。これは直接メタデータの追加には使用できません。永続的なメタデータのエクスポート/インポートの場合、メタデータ値を含む元表の列を作成します。さらに、元表の列を通じてメタデータを更新します。
構文
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);