プライマリ・コンテンツに移動
Oracle® Textリファレンス
11gリリース2(11.2)
B61357-06
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

7 CTX_DDLパッケージ

この章では、テキスト索引に必要なプリファレンス、セクション・グループおよびストップリストを作成および管理するためのPL/SQLパッケージCTX_DDLの使用方法について説明します。

CTX_DDLには、次のストアド・プロシージャおよびファンクションが含まれています。

名前 説明
ADD_ATTR_SECTION
属性セクションをXMLセクション・グループに追加します。
ADD_FIELD_SECTION
フィールド・セクションを作成し、指定したセクション・グループに割り当てます。
ADD_INDEX
索引をカタログ索引プリファレンスに追加します。
ADD_MDATA
ドキュメントのMDATA値を変更します。
ADD_MDATA_COLUMN
FILTER BY列を指定のMDATAセクションにマップします。
ADD_MDATA_SECTION
MDATAメタデータ・セクションをドキュメントに追加します。
ADD_NDATA_SECTION
NDATAセクションをドキュメントに追加します。
ADD_SDATA_COLUMN
FILTER BY列を指定のSDATAセクションにマップします。
ADD_SDATA_SECTION
SDATA構造化データ・セクションをドキュメントに追加します。
ADD_SPECIAL_SECTION
特殊セクションをセクション・グループに追加します。
ADD_STOPCLASS
ストップクラスをストップリストに追加します。
ADD_STOP_SECTION
停止セクションを自動セクション・グループに追加します。
ADD_STOPTHEME
ストップテーマをストップリストに追加します。
ADD_STOPWORD
ストップワードをストップリストに追加します。
ADD_SUB_LEXER
サブレクサーをマルチレクサー・プリファレンスに追加します。
ADD_ZONE_SECTION
ゾーン・セクションを作成し、それを指定されたセクション・グループに追加します。
COPY_POLICY
ポリシーのコピーを作成します。
CREATE_INDEX_SET
CTXCAT索引タイプの索引セットを作成します。
CREATE_POLICY
ORA:CONTAINS()で使用するポリシーを作成します。
CREATE_PREFERENCE
テキスト・データ・ディクショナリにプリファレンスを作成します。
CREATE_SECTION_GROUP
テキスト・データ・ディクショナリにセクション・グループを作成します。
CREATE_SHADOW_INDEX
受け取った索引に対してポリシーを作成します。非パーティション索引の場合は、索引表も作成します。
CREATE_STOPLIST
ストップリストを作成します。
DROP_INDEX_SET
索引セットを削除します。
DROP_POLICY
ポリシーを削除します。
DROP_PREFERENCE
テキスト・データ・ディクショナリからプリファレンスを削除します。
DROP_SECTION_GROUP
テキスト・データ・ディクショナリからセクション・グループを削除します。
DROP_SHADOW_INDEX
シャドウ索引を削除します。
DROP_STOPLIST
ストップリストを削除します。
EXCHANGE_SHADOW_INDEX
シャドウ索引のメタデータとデータをスワップします。
OPTIMIZE_INDEX
索引を最適化します。
POPULATE_PENDING
元表または表パーティション内のROWIDすべてを含めた保留キューを移入します。
RECREATE_INDEX_ONLINE
受け取った索引を再作成します。
REMOVE_INDEX
CTXCAT索引プリファレンスから索引を削除します。
REMOVE_MDATA
ドキュメントからMDATA値を削除します。
REMOVE_SECTION
セクション・グループからセクションを削除します。
REMOVE_STOPCLASS
ストップクラスをストップリストから削除します。
REMOVE_STOPTHEME
ストップリストからストップテーマを削除します。
REMOVE_STOPWORD
ストップリストからストップワードを削除します。
REMOVE_SUB_LEXER
サブレクサーをマルチレクサー・プリファレンスから削除します。
REPLACE_INDEX_METADATA
ローカル・ドメイン索引のメタデータを置換します。
SET_ATTRIBUTE
プリファレンスの属性を設定します。
SYNC_INDEX
索引を同期化します。
UNSET_ATTRIBUTE
プリファレンスから属性の設定を削除します。
UPDATE_POLICY
ポリシーを更新します。

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'

ADD_FIELD_SECTION

フィールド・セクションを作成し、そのセクションを既存のセクション・グループに追加します。これによって、WITHIN演算子を使用してフィールド・セクション内を検索できます。

フィールド・セクションは開始および終了タグで区切られます。デフォルトでは、フィールド・セクション内のテキストは、ドキュメントの残りの部分とは別のサブドキュメントとして索引付けされます。

ゾーン・セクションとは異なり、フィールド・セクションはネストまたはオーバーラップできません。このため、フィールド・セクションは非繰返しセクション、非オーバーラップ・セクション(電子メール型またはニュース型ドキュメントのTITLEAUTHORマークアップなど)に最適です。

フィールド・セクションの索引付けによって、フィールド・セクションに対する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つのセクション・グループに対して最大64のフィールド・セクションを追加できます。同じグループ内では、セクション・ゾーン名とセクション・フィールド名は同じ名前にできません。

section_name

group_nameに追加するセクションの名前を指定します。この名前は、問合せでセクションを識別する場合に使用します。英数字以外の文字(_など)は問合せでエスケープされるため、これらの文字を含む名前は使用しないでください。セクション名の大/小文字は区別されません。

同じグループ内では、ゾーン・セクション名とフィールド・セクション名は同じ名前にできません。語句PARAGRAPHおよびSENTENCEは、特殊セクション用に予約されています。

セクション名はタグ内で一意である必要はありません。詳細を検索しやすいように、同じセクション名を複数のタグに割り当てることができます。

tag

セクションの開始をマークするタグを指定します。たとえば、タグが<H1>の場合は、H1を指定します。指定する開始タグは、セクション・グループ内で一意であることが必要です。

group_nameHTML_SECTION_GROUPの場合は、METAタグのNAME/CONTENT属性の組に対してフィールド・セクションを作成できます。それには、tagmeta@namevalueとして指定します。この場合、namevalueNAME属性の値で、対応するCONTENT属性がセクションとして索引付けられます。<META>タグに対するセクションの作成」の例を参照してください。

Oracle Textは、セクション・グループ作成時に指定したgroup_typeパラメータから終了タグを認識します。

visible

ドキュメントの残りの部分でテキストを参照できるようにするには、TRUEを指定します。

デフォルトでは、visibleフラグはFALSEです。これは、フィールド・セクション内のテキストがドキュメントの残りの部分とは別のサブドキュメントとしてOracle Textにより索引付けされることを意味します。ただし、フィールド・セクション内のテキストをドキュメント全体の一部として索引付けする場合は、visibleフラグをTRUEに設定できます。

Visibleなフィールド・セクションおよびInvisibleなフィールド・セクション

次の例は、BASIC_SECTION_GROUP型のセクション・グループbasicgroupを定義します。次に、<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問合せで繰返しセクションを区別するには、これらをゾーン・セクションとして定義します。

ADD_INDEX

サブ索引をカタログ索引プリファレンスに追加します。このプリファレンスを作成するには、元表の1つ以上の列に名前を付けます。

サブ索引を作成して構造化問合せの応答時間を改善するため、問合せ時には、追加する列をCATSEARCH演算子のstructured_query句で使用する必要があります。

構文

CTX_DDL.ADD_INDEX(set_name in varchar2,
column_list varchar2,
storage_clause varchar2);
set_name

索引セットの名前を指定します。

column_list

索引にカンマで区切られた列のリストを指定します。索引付け時は、このリストの列の元表での行の値が、必ずNULL以外である必要があります。索引付け時にいずれかの行がNULLであると、エラーが発生します。

索引付けの前後に、列にNULL以外の値が設定されていることを確認してください。

storage_clause

記憶域句を指定します。

次のスキーマを使用して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バイトを超えることはできません。

関連項目

「REMOVE_INDEX」

ADD_MDATA

MDATAセクションとして指定されているドキュメントのメタデータを変更します。このコールの後で、名前が付けられたMDATA値を含むMDATA問合せにより、このMDATA値のあるドキュメントが検索されます。

CTX_DDL.ADD_MDATAには2つのバージョンがあります。単一のメタデータ値を単一のROWIDに追加するバージョンと、複数の値または複数のROWID(あるいはその両方)を処理するバージョンです。

CTX_DDL.ADD_MDATAはトランザクション型です。つまり、コールするセッションで即時に機能し、そのコールするセッションのみで表示でき、ROLLBACKコマンドを使用して無効にできます。また、永続的に機能させるには、コミットが必要です。

すでに索引付けされているドキュメントからメタデータ値を削除するには、CTX_DDL.REMOVE_MDATAを使用します。ADD_MDATAおよびREMOVE_MDATAをコールできるのは、索引の所有者のみです。

構文

これは、単一の値を単一のROWIDに追加する構文です。

CTX_DDL.ADD_MDATA(
     idx_name           IN VARCHAR2, 
     section_name       IN VARCHAR2, 
     mdata_value        IN VARCHAR2,
     mdata_rowid        IN VARCHAR2,
     [part_name]        IN VARCHAR2]
);
idx_name

名前が付けられたrowidを含むテキスト索引の名前。

section_name

MDATAセクションの名前。

mdata_value

ドキュメントに追加するメタデータ値。

mdata_rowid

メタデータ値を追加するROWID。

[part_name]

索引パーティションの名前(ある場合)。ローカル・パーティション索引に指定する必要があり、グローバルの非パーティション索引ではNULLである必要があります。

これは、複数の値または複数のROWID(あるいはその両方)を渡す構文です。新しい値またはROWIDの数が多い場合は、このバージョンが効率的です。

CTX_DDL.ADD_MDATA(
     idx_name           IN VARCHAR2, 
     section_name       IN VARCHAR2, 
     mdata_values       SYS.ODCIVARCHAR2LIST,
     mdata_rowids       SYS.ODCIRIDLIST,
     [part_name]        IN VARCHAR2]
);
idx_name

名前が付けられたrowidsを含むテキスト索引の名前。

section_name

MDATAセクションの名前。

mdata_values

メタデータ値のリスト。メタデータ値にカンマが含まれている場合は、円記号でカンマをエスケープする必要があります。

mdata_rowids

メタデータ値を追加するROWID。

[part_name]

索引パーティションの名前(ある場合)。ローカル・パーティション索引に指定する必要があり、グローバルの非パーティション索引ではNULLである必要があります。

この例では、単一の値を更新します。

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にロギングされます。

これらの更新は、元表に格納されている実際の内容ではなく索引自体に直接反映されます。したがって、テキスト索引が再構築されると存続しません。

関連項目

「ADD_MDATA_SECTION」「REMOVE_MDATA」「MDATA」、および『Oracle Textアプリケーション開発者ガイド』の「セクション検索」も参照してください。

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,
);
group_name

セクションを含むグループの名前。

section_name

MDATAセクションの名前。

column_name

MDATAセクションに追加するFILTER BY列の名前。

制限事項

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列の範囲述語が処理されます。これは、MDATAFILTER BY列に対する範囲述語の処理効率が、SDATAとして宣言された場合より低くなるためです。したがって、列に対して範囲検索を行う予定がある場合は、FILTER BY列をMDATAとして追加しないでください。

関連項目

「MDATA」

「ADD_MDATA_SECTION」

「REMOVE_MDATA」

「ADD_SDATA_COLUMN」


関連項目:

『Oracle Textアプリケーション開発者ガイド』の第8章「Oracle Textでのドキュメント・セクションの検索」

ADD_MDATA_SECTION

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, 
);
group_name

MDATAセクションを含むセクション・グループの名前。

section_name

MDATAセクションの名前。

tag

MDATAセクションの値。たとえば、セクションが<AUTHOR>である場合、値はCynthia Kadohata (小説『The Floating World』の著者)などとなります。指定したMDATAセクションに複数のtagを割り当てることができます。

この例では、authというMDATAセクションを作成します。

ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP');
ctx_ddl.add_mdata_section('htmgroup', 'auth', 'author');

関連項目

「ADD_MDATA」

「REMOVE_MDATA」

「MDATA」

「CREATE_SECTION_GROUP」

『Oracle Textアプリケーション開発者ガイド』の「セクション検索」

ADD_NDATA_SECTION

同じようなスペルの一致を検索します。NDATAセクションの値は、他のセクションのようにドキュメント・テキストから抽出されます。ただし、名前データとして索引付けされます。NDATAセクションは、CTX_USER_SECTIONSビューに格納されます。

構文

CTX_DDL.ADD_NDATA_SECTION (
   group_name    IN VARCHAR2,
   section_name  IN VARCHAR2,
   tag           IN VARCHAR2);
group_name

セクションを含むグループの名前。

section_name

NDATAセクションの名前。

tag

セクションの開始をマークするタグの名前。たとえば、タグが<H1>の場合は、H1を指定します。指定する開始タグは、セクション・グループ内で一意であることが必要です。

注意

NDATAセクションは、シングルバイト・データおよびマルチバイト・データをサポートします。ただし、文字および語句ベースで制限があります。索引付けされるNDATAセクション・データには、次の制約があります。

  • 1文字の空白で区切られた語句の文字数

    511

  • 空白で区切られた語句の数

    255

  • 空白を含む文字の総数

    511

これらの制約を超えるNDATAセクション・データは切り捨てられます。

次の例は、BASIC_SECTION_GROUP型のセクション・グループnamegroupを定義します。さらに、firstnameというnamegroupNDATAセクションを作成します。

begin
  ctx_ddl.create_section_group('namegroup', 'BASIC_SECTION_GROUP');
  ctx_ddl.add_ndata_section('namegroup', 'firstname', 'fname1');
end;

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,
);
group_name

セクションを含むグループの名前。

section_name

SDATAセクションの名前。

column_name

SDATAセクションに追加するFILTER BY列の名前。

注意

  • 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セクションおよび列の最大数は32です。

関連項目

「SDATA」

「ADD_SDATA_SECTION」


関連項目:

『Oracle Textアプリケーション開発者ガイド』の第8章「Oracle Textでのドキュメント・セクションの検索」

ADD_SDATA_SECTION

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,
);
group_name

セクションを含むグループの名前。

section_name

SDATAセクションの名前。

tag

SDATAセクションに追加するタグの名前。

datatype

格納されるデータの形式を指定し、後で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は単独で出現します。SDATAタグの複数インスタンスが単一のドキュメントに出現する場合は、後のインスタンスが前のインスタンスで設定された値よりも優先されます。これは、最後に出現するSDATAタグが有効になることを意味します。

  • 指定のドキュメントにSDATAタグがない場合は、NULLSDATA値として処理されます。

  • 空のSDATAタグはNULL値として処理されます。

  • SDATAセクションはネストできません。内部でネストされたセクションは無視されます。

  • SDATAセクションおよび列の最大数は32です。

関連項目

「SDATA」

「ADD_SDATA_COLUMN」


関連項目:

『Oracle Textアプリケーション開発者ガイド』の第8章「Oracle Textでのドキュメント・セクションの検索」

ADD_SPECIAL_SECTION

特殊セクション(SENTENCEまたはPARAGRAPH)をセクション・グループに追加します。これによって、WITHIN演算子を使用して、ドキュメントの文または段落内を検索できるようになります。

ドキュメントの特殊セクションは、ゾーン・セクションおよびフィールド・セクションとして明示的にタグ付けされていないセクションです。索引が作成されると、特殊セクションの開始および終了が検出されます。Oracle Textでは、段落および文の2つのセクションparagraphおよびsentenceをサポートします。

文および段落の境界は、レクサーが判断します。たとえば、レクサーはSENTENCEセクションまたはPARAGRAPHセクションの境界を次のように認識します。

表7-1 PARAGRAPHセクションとSENTENCEセクションの境界

特殊セクション 境界

SENTENCE

WORD/PUNCT/WHITESPACE


WORD/PUNCT/NEWLINE

PARAGRAPH

WORD/PUNCT/NEWLINE/WHITESPACE(インデント・スタイルの段落)


WORD/PUNCT/NEWLINE/NEWLINE(ブロック・スタイルの段落)


punctuation、whitespaceおよびnewlineの各文字は、レクサーの設定によって判断されます。これらの設定は変更できます。

レクサーが境界を認識できない場合、SENTENCEセクションまたはPARAGRAPHセクションはいずれも索引付けされません。

構文

CTX_DDL.ADD_SPECIAL_SECTION(
                 group_name    IN VARCHAR2, 
                 section_name  IN VARCHAR2);
group_name

セクション・グループの名前を指定します。

section_name

SENTENCEまたはPARAGRAPHを指定します。

次の例は、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;

ADD_STOPCLASS

ストップクラスをストップリストに追加します。ストップクラスは、索引付けされていないトークンのクラスです。

構文

CTX_DDL.ADD_STOPCLASS(
  stoplist_name  in   varchar2,
  stopclass      in   varchar2
);
stoplist_name

ストップリストの名前を指定します。

ストップクラス

stoplist_nameに追加するストップクラスを指定します。現在は、NUMBERSクラスのみがサポートされています。カスタム・ストップクラスは作成できません。

NUMBERSには、数値パターンに従ったトークン、つまり小数点、numgroupおよびnumjoinのみが含まれます。したがって、123ABCA123も数値ではありません。これらはMIXEDとしてラベル付けされます。$123は数値ではありません(英数字以外はデフォルトで空白になるため、このトークンはテキスト索引としては一般的ではありません)。米国では、123.45は数値ですが、123.456.789は数値ではありません。numgroupに'.'を使用する欧州では、これとは逆に123.456.789は数値ですが、123.45は数値ではありません。

ストップリストに追加できるストップワード、ストップテーマおよびストップクラスの数の最大値は4095です。

次の例は、ストップクラスNUMBERSをストップリストmystopに追加します。

begin
ctx_ddl.add_stopclass('mystop', 'NUMBERS');
end;

ADD_STOP_SECTION

停止セクションを自動セクション・グループに追加します。停止セクションを追加すると、自動セクションの索引付け操作で、XMLドキュメント内の指定されたセクションが無視されます。


注意:

停止セクションを追加すると、索引内にセクション情報が作成されません。ただし、停止セクション内のテキストは常に検索可能です。

停止セクションを追加することは、ドキュメントに下位レベルの情報タグが多数含まれる場合に有効です。また、停止セクションを追加すると、自動セクション・グループを使用した索引付けのパフォーマンスが向上します。

追加できる停止セクションの数は無制限です。

停止セクションにはセクション名がありません。したがって、セクション・ビューには記録されません。

構文

CTX_DDL.ADD_STOP_SECTION(
                 section_group IN VARCHAR2, 
                 tag  IN VARCHAR2);
section_group

自動セクション・グループの名前を指定します。自動セクション・グループを指定しない場合、このプロシージャはエラーを戻します。

tag

索引付け時に無視するタグを指定します。このパラメータでは、大/小文字が区別されます。また、このように停止タグを定義すると、タグの属性セクションがある場合は、これも停止します。

タグは、(doctype)tagという形式のドキュメント・タイプで修飾します。たとえば、<fluff>タグをmydocドキュメント・タイプ内のみの停止セクションにする場合は、(mydoc)fluffをタグに指定します。

停止セクションの定義

次の例は、タグ<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;

ADD_STOPTHEME

単一のストップテーマをストップリストに追加します。ストップテーマは、索引付けされていないテーマです。

英語では、ABOUT演算子を使用して索引テーマを問い合せます。

構文

CTX_DDL.ADD_STOPTHEME(
  stoplist_name  in   varchar2,
  stoptheme      in   varchar2
);
stoplist_name

ストップリストの名前を指定します。

ストップテーマ

stoplist_nameに追加するストップテーマを指定します。システムではナレッジ・ベースを使用して、入力されたstopthemeを正規化します。正規化されたテーマが複数の場合、ストップテーマは処理されません。したがって、単一のストップテーマを送信することをお薦めします。

ストップリストに追加できるストップワード、ストップテーマおよびストップクラスの数の最大値は4095です。

次の例では、ストップテーマbankingをストップリストmystopに追加します。

begin
ctx_ddl.add_stoptheme('mystop', 'banking');
end;

ADD_STOPWORD

単一のストップワードをストップリストに追加します。

ストップワードのリストを作成するには、ワードごとにこのプロシージャを1回コールする必要があります。

構文

CTX_DDL.ADD_STOPWORD(
stoplist_name  in   varchar2,
stopword       in   varchar2,
language       in varchar2 default NULL
);
stoplist_name

ストップリストの名前を指定します。

ストップワード

追加するストップワードを指定します。

言語固有のストップワードは、その言語固有の他のストップワードとの間で一意であることが必要です。たとえば、ドイツ語のdieと英語のdieを同じストップリスト内に含めることは有効です。

ストップリストに追加できるストップワード、ストップテーマおよびストップクラスの数の最大値は4095です。

language

stoplist_nameで指定したストップリストがMULTI_STOPLIST型の場合は、stopwordの言語を指定します。Oracle Textがサポートしている言語のグローバリゼーション・サポート名または略称を指定する必要があります。

ストップワードを複数の言語でアクティブにするには、このパラメータにALLを指定します。たとえば、任意の言語で停止が必要な英語のフラグメントを含む国際文書の場合は、ALLストップワードを定義すると便利です。

ALLストップワードは、すべての言語でアクティブです。マルチレクサーを使用すると、そのストップワードの言語固有のレクサー処理が発生します。この状態は、そのストップワードを複数の特定言語に繰り返し追加した場合と同じです。

それ以外の場合は、NULLを指定します。

単一言語のストップリスト

次の例では、ストップワード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ストップワードの追加

次の例では、ワードtheALLストップワードとして、マルチ言語のストップリストgloballistに追加します。

begin
ctx_ddl.add_stopword('globallist','the','ALL');
end;

ADD_SUB_LEXER

サブレクサーをマルチレクサー・プリファレンスに追加します。サブレクサーは、マルチレクサー(マルチ言語)・プリファレンスで言語を識別します。複数の言語を索引付けする必要がある場合は、マルチレクサー・プリファレンスを使用します。

制限事項

CTX_DDL.ADD_SUB_LEXERの使用には、次の制限が適用されます。

  • 起動ユーザーは、マルチレクサーまたはCTXSYSの所有者である必要があります。

  • lexer_nameパラメータには、マルチレクサー・レクサーであるプリファレンスが指定されている必要があります。

  • マルチレクサーを索引で使用できるようにするには、デフォルトのレクサーが定義されている必要があります。

  • サブレクサー・プリファレンスの所有者は、マルチレクサー・プリファレンスの所有者と同じである必要があります。

  • サブレクサー・プリファレンスは、マルチレクサー・レクサーにはできません。

  • サブレクサー・プリファレンスは、マルチレクサー・プリファレンスで使用されている間は削除できません。

  • CTX_DDL.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
);
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は指定できません。

この例は、マルチ言語テキスト表の作成方法、および表を索引付けするためのマルチレクサーの設定方法を示しています。

次のように、主キー、テキスト列および言語列を持つマルチ言語表を作成します。

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');

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タグの場合は、tagH1を指定します。指定する開始タグは、セクション・グループ内で一意であることが必要です。

Oracle Textは、セクション・グループ作成時に指定したgroup_typeパラメータから終了タグを認識します。

group_nameHTML_SECTION_GROUPの場合は、METAタグのNAME/CONTENT属性の組に対してゾーン・セクションを作成できます。それには、tagmeta@namevalueとして指定します。この場合、namevalueNAME属性の値で、対応するCONTENT属性がセクションとして索引付けられます。次の例を参照してください。

group_nameXML_SECTION_GROUPの場合は、(doctype)tagという形式でドキュメント・タイプ(ルート要素)を使用し、必要に応じてtagを修飾できます。その場合は、XMLドキュメント・タイプの宣言でのsection_nameが区別されます。次の例を参照してください。

HTMLのセクションの作成

次の例は、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'

<META NAME>タグに対するセクションの作成

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演算子を使用して、セクション内のセクションのテキストを検索するための問合せを記述できます。たとえば、BOOK1BOOK2および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のみを戻します。

COPY_POLICY

既存のポリシーまたは索引から新規ポリシーを作成します。

構文

ctx_ddl.copy_policy(
    source_policy       VARCHAR2,
    policy_name         VARCHAR2    );
source_policy

コピーするポリシーまたは索引の名前。

policy_name

コピーした新規ポリシーの名前。

プリファレンス値はsource_policyからコピーされます。コピー元のポリシーまたは索引と新規ポリシーのどちらも、同じデータベース・ユーザーが所有している必要があります。

CREATE_INDEX_SET

CTXCAT索引タイプの索引セットを作成します。CTXCAT索引を作成するときは、CREATE INDEXのPARAMETERS句でこの索引セット名を指定します。

構文

CTX_DDL.CREATE_INDEX_SET(set_name in varchar2);
set_name

索引セットの名前を指定します。CTXCAT索引を作成するときは、CREATE INDEXのPARAMETERS句でこの索引セット名を指定します。

CREATE_POLICY

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);
policy_name

新しいポリシーの名前を指定します。ポリシー名とテキスト索引は同じ名前空間を共有します。

フィルタ

使用するフィルタ・プリファレンスを指定します。

section_group

使用するセクション・グループを指定します。CONTEXT索引でサポートされている任意のセクション・グループを指定できます。

lexer

使用するレクサー・プリファレンスを指定します。INDEX_THEMES属性を使用禁止にする必要があります。

ストップリスト

使用するストップリストを指定します。

wordlist

使用するワードリストを指定します。

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.oracle.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_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

プリファレンス型の名前を指定します。


関連項目:

プリファレンス型および関連する属性の完全なリストは、第2章「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;

関連項目:

記憶域型

属性のないプリファレンスの作成

属性のない型のプリファレンスを作成する場合は、次の例で示すように、フィルタをNULL_FILTERに設定するプリファレンスのみを作成する必要があります。

begin
ctx_ddl.create_preference('my_null_filter', 'NULL_FILTER');
end;

注意

SDATAがない索引の記憶域プリファレンスに対してs_table_clauseが指定されている場合、この指定による索引の影響はないため、索引は正しく作成されます。

CREATE_SECTION_GROUP

テキスト列にセクションを定義するためのセクション・グループを作成します。

セクション・グループを作成する場合は、ADD_ZONE_SECTIONADD_FIELD_SECTIONADD_MDATA_SECTIONまたはADD_SPECIAL_SECTIONを使用して、そのセクション・グループにゾーン、フィールドまたは特殊セクションを追加できます。

索引付けする場合は、CREATE INDEXまたはALTER INDEXのパラメータ文字列にセクション・グループを指定します。

索引付けした後は、WITHIN演算子を使用して、定義したセクション内を問い合せます。

構文

CTX_DDL.CREATE_SECTION_GROUP(
  group_name     in    varchar2,
  group_type     in    varchar2
);
group_name

作成するセクション・グループ名を[user.]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ドキュメントのセクションを定義します。
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に従ったニュース・グループ形式のドキュメントのセクションを定義します。

次のコマンドは、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;

CREATE_SHADOW_INDEX

指定した索引に対して索引メタデータ(またはポリシー)を作成します。索引がパーティション化されていない場合は、索引表も作成します。このプロシージャは、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
);
idx_name

有効なCONTEXT索引タイプの名前。

parameter_string

非パーティション索引の場合は、ALTER INDEXの文字列と同じです。パーティション索引の場合は、ALTER INDEX PARAMETERの文字列と同じです。

parallel_degree

予備。並列度を指定します。現在、並列度オプションはサポートされていません。

例7-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 INDEXNOPOPULATEが指定されていないかぎり、非パーティション索引の索引表も移入されます。ローカル・パーティション索引の場合は、各パーティションに対して索引表を作成せずに、索引メタデータのみが作成されます。各索引に指定できるシャドウ索引は1つのみです。

非パーティション索引をオンラインで構築するときは、最初にこのプロシージャをコールして索引メタデータと索引表を作成できます。POPULATEを指定すると、索引は移入されますが、スワッピングは実行されません。スワッピングは、必要に応じて後でスケジュールできます。

NOPOPULATEを指定すると、索引表のメタデータが作成されるのみで、移入は実行されません。このプロシージャを実行した後は、POPULATE_PENDING(CTX_DDL.POPULATE_PENDING)を実行して保留キューを移入してから、索引を同期化する必要があります。これは、増分再作成と呼ばれます。

このプロシージャの実行中、すべての問合せは正常に処理されます。

POPULATEを指定すると、移入開始のわずかな間DMLがブロックされ、それ以降のすべてのDMLは、オンライン保留キューにロギングされ、後で処理されます。

CTX_DDL.SYNC_INDEXでの同期化は、通常、索引に対して実行されます。OPTIMIZE_INDEXの実行では、なにも処理されませんが、エラーも戻りません。

関連項目

第1章「Oracle TextのSQL文と演算子」「ALTER INDEX」および「CREATE INDEX」POPULATE | NOPOPULATE、この章の「CTX_DDL.DROP_SHADOW_INDEX」、「CTX_DDL.EXCHANGE_SHADOW_INDEX」、「CTX_DDL.SYNC_INDEX」および「CTX_DDL.POPULATE_PENDING」も参照してください。

CREATE_STOPLIST

新しい空のストップリストを作成します。ストップリストには、索引付けしないワードまたはテーマを含めることができます。

言語固有のストップワードを保持するマルチ言語のストップリストを作成することもできます。マルチ言語のストップリストは英語、ドイツ語および日本語などの異なる言語のドキュメントを含む表の索引付けに有効です。索引付けを実行する場合は、テキスト表に言語列が含まれている必要があります。

ADD_STOPWORDADD_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を指定します。

索引付け時に、各ドキュメントの言語列が調べられ、その言語のストップワードのみが排除されます。問合せ時に、セッション言語の設定によって、アクティブなストップワードが特定されます。これは、マルチレクサーの使用時にアクティブなレクサーが特定されるのと同様です。


注意:

マルチ言語のストップリストを持つマルチ言語表を索引付けする場合は、表に言語列が含まれている必要があります。

例7-2 単一言語のストップリスト

次の例は、mystopというストップリストを作成します。

begin
ctx_ddl.create_stoplist('mystop', 'BASIC_STOPLIST');
end;

例7-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_INDEX_SET

CTX_DDL.CREATE_INDEX_SETを使用して作成されたCTXCAT索引セットを削除します。

構文

CTX_DDL.DROP_INDEX_SET(
     set_name    IN VARCHAR2
);
set_name

削除する索引セットの名前を指定します。

索引セットを削除すると、それに含まれるサブ索引もすべて削除されます。

DROP_POLICY

CTX_DDL.CREATE_POLICYを使用して作成されたポリシーを削除します。

構文

CTX_DDL.DROP_POLICY(
     policy_name    IN VARCHAR2
);
policy_name

削除するポリシーの名前を指定します。

DROP_PREFERENCE

DROP_PREFERENCEプロシージャは、指定したプリファレンスをテキスト・データ・ディクショナリから削除します。プリファレンスを削除しても、そのプリファレンスを使用して作成された索引には影響を与えません。

構文

CTX_DDL.DROP_PREFERENCE(
     preference_name    IN VARCHAR2
);
preference_name

削除するプリファレンスの名前を指定します。

次の例は、プリファレンスmy_lexerを削除します。

begin
ctx_ddl.drop_preference('my_lexer');
end;

関連項目

「CTX_DDL.CREATE_PREFERENCE」も参照してください。

DROP_SECTION_GROUP

DROP_SECTION_GROUPプロシージャは、指定したセクション・グループおよびそのグループ内のすべてのセクションをテキスト・データ・ディクショナリから削除します。

構文

CTX_DDL.DROP_SECTION_GROUP(
     group_name     IN VARCHAR2
);
group_name

削除するセクション・グループの名前を指定します。

次の例は、セクション・グループhtmgroupおよびそのすべてのセクションを削除します。

begin
ctx_ddl.drop_section_group('htmgroup');
end;

関連項目

「CTX_DDL.CREATE_SECTION_GROUP」も参照してください。

DROP_SHADOW_INDEX

指定した索引のシャドウ索引を削除します。シャドウ索引を削除するときに、その索引がパーティション化されている場合は、このシャドウ索引のメタデータと、このシャドウ索引のパーティションすべてのメタデータが削除されます。このプロシージャは、シャドウ索引表もすべて削除し、オンライン保留キューをクリーン・アップします。

構文

CTX_DDL.DROP_SHADOW_INDEX(
     idx_name       in VARCHAR2
);
idx_name

有効なCONTEXT索引タイプの名前。

次の例は、シャドウ索引myshadowidxを削除します。

begin
ctx_ddl.drop_shadow_index('myshadowidx');
end;

関連項目

「CTX_DDL.CREATE_SHADOW_INDEX」も参照してください。

DROP_STOPLIST

テキスト・データ・ディクショナリからストップリストを削除します。ストップリストを削除した場合は、変更を有効にするために索引を再作成または再構築する必要があります。

構文

CTX_DDL.DROP_STOPLIST(stoplist_name in varchar2);
stoplist_name

ストップリストの名前を指定します。

次の例は、ストップリストmystopを削除します。

begin
ctx_ddl.drop_stoplist('mystop');
end;

関連項目

「CTX_DDL.CREATE_STOPLIST」も参照してください。

EXCHANGE_SHADOW_INDEX

このプロシージャは、索引(または索引パーティション)メタデータと索引(または索引パーティション)データをスワップします。

非パーティション索引の場合は、メタデータと索引データの両方がスワップされ、オンライン保留キューが処理されます。

構文

CTX_DDL.EXCHANGE_SHADOW_INDEX(
     idx_name        IN VARCHAR2
     partition_name  IN VARCHAR2 default NULL
);
idx_name

CONTEXT索引タイプの名前を指定します。

partition_name

シャドウ索引パーティションの名前を指定します。NULLも許可されます。

例7-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の場合は、索引メタデータがスワップされます。ローカル・パーティション索引をオンラインで再作成する場合は、このプロシージャを手順の最後に実行します。

関連項目

「CTX_DDL.RECREATE_INDEX_ONLINE」、「CTX_DDL.CREATE_SHADOW_INDEX」および「CTX_DDL.DROP_SHADOW_INDEX」も参照してください。

OPTIMIZE_INDEX

索引を最適化します。索引の最適化は、同期化の後に実行します。索引を最適化すると、古いデータが削除され、索引の断片化が最小限度に抑えられます。その結果、問合せ応答時間を短縮できます。問合せおよびDMLの処理は最適化中にも続行できます。

高速モード、完全モード、再構築モード、トークン・モードまたはトークン型モードで最適化できます。

  • 高速モードではデータは圧縮されますが、行は削除されません。

  • 完全モードではデータが圧縮され、行が削除されます。

  • 再構築モードで最適化すると、$I表(逆リスト表)全体が再構築されます。索引の再構築は完全最適化を実行したときよりも処理時間が大幅に短いことが多く、特に索引がひどく断片化している場合は、小型の索引を生成する傾向があります。

    再構築モードの最適化は、$I表のさらに圧縮されたコピーを作成し、元の$I表とコピーを切り替えます。そのため、再構築操作には元の表とコピーを格納する十分な領域が必要です。(REDOロギングが使用可能な場合は、REDOログ用の領域を追加することも必要です。)再構築操作の最後には元の$I表が削除されるため、領域を再利用できます。

    再構築モードの最適化は、次の制限事項でbasic_storageプリファレンスのi_table_clause属性による$I表のパーティション化をサポートします。

    • $I表をパーティション化する場合、ローカルのBツリー索引を使用してi_index_clauseを指定します。

    • token_firsttoken_last、またはtoken_count列のパーティション化スキームは使用できません。

  • トークン・モードでは、最適化する特定のトークンを指定します(たとえば、ワードelectionsを含むドキュメントを持つ行すべて)。このモードを使用して、参照頻度の低いトークンの最適化に要する時間を節約しながら、検索頻度の高い索引トークンを最適化します。トークンを最適化すると、問合せ応答時間を短縮できます(最適化されたトークンで問い合せる場合のみ)。

  • トークン型の最適化はトークン・モードに似ていますが、最適化がフィールド・セクションまたはMDATAセクション(たとえば、<A>タグのあるセクション)で実行される点が異なります。これは、重要なフィールドまたはMDATAセクションを最適な状態に保持する場合に有効です。

索引を最適化する一般的な方法は、参照頻度の高い語句で通常のトークン・モードの最適化を実行し、再構築モードの最適化はあまり実行しないという方法です。(実行頻度の高い問合せを見つけるには、CTX_REPORT.QUERY_LOG_SUMMARYを使用します。)トークン・モードの最適化のかわりに、完全モード、高速モードまたはトークン型モードの最適化を実行できます。

再構築の最適化はあまり実行せず、制限時間を指定して完全最適化を頻繁に実行するという方法もあります。


注意:

索引を最適化することで、初期の索引操作後、元表に対するドキュメントの挿入、削除または更新操作のみが必要な場合は、応答時間がかなり短縮できます。

索引の最適化には、ALTER INDEX文よりもこのプロシージャを使用することをお薦めします。

大型の索引の最適化には、時間を要することがあります。長時間に及ぶ最適化の進捗状態を監視するには、CTX_OUTPUT.START_LOGを使用して最適化をロギングし、生成されるログ・ファイルを時々チェックしてください。

シリアルの完全モードの最適化とは異なり、optlevelFULLCTX_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); 
); 
idx_name

索引の名前を指定します。索引名を指定しない場合は、Oracle Textによって最適化する索引が1つ選択されます。

optlevel

最適化レベルを文字列で指定します。最適化には、次のいずれかの方法を指定できます。

optlevelの値 説明
FASTまたはCTX_DDL.OPTLEVEL_FAST この方法では、断片化した行が圧縮されます。ただし、古いデータは削除されません。

FAST最適化は、CTXCAT索引に対してサポートされていません。FAST最適化では、$S索引表は最適化されません。

FULLまたはCTX_DDL.OPTLEVEL_FULL このモードでは、索引全体または索引の一部を最適化できます。この方法では行が圧縮され、古いデータ(削除済の行)が削除されます。完全モードでの最適化は、削除済の行が存在しない場合でも実行されます。

完全最適化は、CTXCAT索引に対してサポートされていません。

REBUILDまたはCTX_DDL.OPTLEVEL_REBUILD このoptlevelでは、$I表(逆リスト表)が再構築され、圧縮されたトークン情報の行が生成されます。FULL最適化のように、このモードでも元表の削除された行に関係する情報が削除されます。

REBUILDは、CTCAT索引、CTXRULE索引またはCTXXPATH索引に対してサポートされていません。

REBUILDは、$I表がパーティション化されている場合にはサポートされません。

TOKENまたはCTX_DDL.OPTLEVEL_TOKEN この方法では、最適化する特定のトークンを指定します。Oracle Textでは、tokenで指定されたトークンに対して完全最適化を実行します。指定されたトークン型がない場合は、0(ゼロ)がデフォルトとして使用されます。

検索頻度の高いトークンの最適化には、この方法を使用します。

トークン・モードでの最適化は、CTXCATCTXRULEおよびCTXXPATH索引に対してサポートされていません。

TOKEN_TYPEまたはCTX_DDL.OPTLEVEL_TOKEN_TYPE この最適化レベルでは、入力トークン型に一致する索引内のすべてのトークンがオンデマンドで最適化されます。

optlevelTOKEN_TYPEの場合は、token_typeを指定する必要があります。TOKEN_TYPEでは、入力token_typeの任意のトークンに対してFULL最適化が実行されます。TOKEN最適化のように、TOKEN_TYPE最適化ではFULL最適化の状態は変更されず、各呼出しにおいて最後まで実行されます。

token_typeの最適化は、CTXCATCTXRULEおよびCTXXPATH索引に対してサポートされていません。


$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

最適化するトークンを指定します。

part_name

使用している索引がローカル索引の場合は、同期化する索引パーティションの名前を指定します。指定しない場合はエラーが戻されます。

使用している索引がグローバルで、非パーティション索引の場合は、NULLを指定します。これはデフォルトです。

token_type

最適化するtoken_typeを指定します。

parallel_degree

パラレル最適化に対する並列度を数値で指定します。実際の並列度は、リソースによって異なります。REBUILDを使用する場合は、parallel_degreeを1より大きい値に設定すると、シリアルに実行されます。

次の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;

注意

CTX_DDL.SYNC_INDEXおよびCTX_DDL.OPTIMIZE_INDEXは同時に実行できます。並列度が指定されたCTX_DDL.SYNC_INDEXおよびCTX_DDL.OPTIMIZE_INDEXも同時に実行できます。ただし、次は実行しないでください。

  • 並列度が指定されたCTX_DDL.SYNC_INDEXCTX_DDL.OPTIMIZE_INDEXと同時に実行すること。

  • 並列度が指定されたCTX_DDL.SYNC_INDEXを並列度が指定されたCTX_DDL.OPTIMIZE_INDEXと同時に実行すること。

これらのいずれかの組合せを実行する必要がある場合、エラーは生成されませんが、一方の処理が完了してからもう一方の処理が行われます。

関連項目

「CTX_DDL.SYNC_INDEX」および「ALTER INDEX」も参照してください。

POPULATE_PENDING

元表または表パーティション内のROWIDすべてを含めた保留キューを移入します。このプロシージャは、CONTEXT索引に対してのみサポートされています。

このプロシージャは、索引付け処理を連続的に実行する余裕がないために、テキスト索引作成に対する制御を向上させる必要がある大規模なインストール環境で役立ちます。望ましい方法は、空の索引を作成して、すべてのROWIDを保留キューに配置し、CTX_DDL.SYNC_INDEXを介して索引を構築する方法です。

構文

ctx_ddl.populate_pending(
  idx_name  IN VARCHAR2,
  part_name IN VARCHAR2 DEFAULT NULL
);
idx_name

CONTEXT索引タイプの名前。

part_name

索引パーティションの名前(ある場合)。ローカル・パーティション索引に指定する必要があり、グローバルの非パーティション索引ではNULLである必要があります。

注意

SYNC_INDEXは処理の間ブロックされます。索引ユニットは完全に空(idx_docid_count = 0、idx_nextid = 1)であることが必要です。索引付けを待機している行のROWIDは、表ctxsys.dr$pendingに挿入されます。元表のROWIDを保持するための十分な領域がこの表にあることを確認してください。

RECREATE_INDEX_ONLINE

指定した索引を再作成します。あるいは、索引がローカル・パーティション索引の場合は、受け取った索引パーティションを再作成します。パーティション化されていないグローバル索引の場合、この手順は1ステップで実行できます。ローカル・パーティション索引の場合は、最初にCREATE_SHADOW_INDEXを使用してシャドウ・ポリシー(またはメタデータ)を作成した後で、すべてのパーティションに対してこのプロシージャを個別に実行する必要があります。このプロシージャは、Oracle DatabaseのEnterprise Editionのみでサポートされています。

次の変更はサポートされていません。

  • 非コンポジット・ドメイン索引からコンポジット・ドメイン索引の変換、またはコンポジット・ドメイン索引の列の変更

  • 索引表がパーティション化されている索引($I$P$Kなど)の再構築

構文

CTX_DDL.RECREATE_INDEX_ONLINE(
   idx_name          IN VARCHAR2,
   parameter_string  IN VARCHAR2 default NULL,
   parallel_degree   IN NUMBER default 1,
   partition_name    IN VARCHAR2 default NULL
);
idx_name

有効なCONTEXT索引タイプの名前。

parameter_string

索引がグローバル非パーティション索引である場合は、ALTER INDEXの場合と同様に、同じ索引レベルのパラメータ文字列を指定します。NULL以外の場合、パラメータ文字列はREPLACEで開始する必要があります。必要に応じてSWAPまたはNOSWAPを指定します。デフォルトはSWAPです。

parallel_degree

予備。並列度を指定します。現在のリリースでは、パラレル操作はサポートされていません。

partition_name

ローカル・パーティション索引に対して有効な索引パーティション名を指定します。名前を指定しない場合、デフォルトはNULLです。索引がパーティション化されている場合は、最初にパーティション名を渡し、次にALTER INDEX REBUILD PARTITIONのパーティション・レベルのパラメータ文字列を指定します。

例7-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');

例7-6 一斉スワップによるローカル索引の再作成

次の例は、基本レクサーus_lexerを使用してローカル・パーティション索引idxpを作成します。このローカル・パーティション索引には、idx_p1idx_p2の2つの索引パーティションがあります。パーティションidx_p1を使用してローカル・パーティション索引idxpをオンラインで再作成します。この索引には、新しい記憶域プリファレンスnew_storeが指定されます。パーティション・メタデータと索引パーティション・データのスワッピングは最後に発生します。この例にある複数パーティションにわたる問合せでは、再作成の処理中(EXCHANGE_SHADOW_INDEXの実行終了時を除く)に、パーティション全体で一貫した結果が戻ります。余分に必要な領域は、パーティションidx_p1idx_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')

例7-7 パーティション単位のスワップによるローカル索引の再作成

この例は、各索引パーティションが作成完了時点でスワップされること以外は、「例7-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') 

例7-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');

例7-9 パーティション単位のスワップによるローカル索引の計画的な再作成

この例は、パーティションが使用可能になり次第スワップされる増分再作成を示しています。すべての同期化が終了するまで待機してからシャドウ索引の交換を開始するのではなく、1つの同期化が終了した直後に各パーティションに対してEXCHANGE_SHADOW_INDEXが実行されること以外は、例7-8「一斉スワップによるローカル索引の計画的な再作成」の手順と同じです。

注意

グローバル非パーティション索引でのRECREATE_INDEX_ONLINEの使用

このプロシージャには、グローバル索引を対象にして、索引をオンラインで再作成するワンステップ・プロセスが用意されています。このプロセスでは、索引を新しいプリファレンス値で再作成し、再作成の間も元表DMLと問合せ機能を維持します。


注意:

新しい索引は既存の索引と並行して作成されるため、この操作には、既存の索引とほぼ等しいサイズの追加の記憶域が必要です。

DMLの動作

このプロシージャはオンラインで実行されるため、この操作の間も元表に対するDMLは許可され、通常どおりに処理されます。RECREATE_INDEX_ONLINE中に発生するDML文はすべて、オンライン保留キューにロギングされます。

再作成操作の終了間際には、索引の進捗状態を示すエラーによって、DMLが失敗となる短い時間帯があります。処理中にDMLが再度ハング状態になる場合があり、その長さは再作成処理の開始以降にオンライン保留キューにロギングされたDMLの数によって異なります。

索引の再作成操作が完了した後は、RECREATE_INDEX_ONLINEの開始以降に保留となったすべてのDMLから、新しい情報が即時に反映されない場合があることに注意してください。INDEXTYPE IS ctxsys.context ONLINEを使用した索引の作成と同様に、索引の再作成操作が完了した後は、その索引を同期化して最新の状態にする必要があります。


関連項目:


同期化と最適化の動作

再作成操作の過程で索引に対して発行された同期化は、古い既存のデータと照合して処理されます。問合せでエラーが戻る時間帯と同じ時間帯には、同期化もブロックされます。再作成操作の過程で索引に対して発行された最適化コマンドは、なにも実行されずにエラーなしで即時に戻ります。

問合せの動作

再作成操作の間、索引は、ほぼ通常どおりに問い合せることができます。問合せでは、最後のスワップが終わるまで、既存の索引とポリシー(またはメタデータ)に基づいて結果が戻ります。

RECREATE_INDEX_ONLINE終了間際には、問合せに対して、列が索引付けされていないことを示すエラーが戻る短い時間帯があります。この時間帯は通常の問合せにとっては十分な時間ではありません。この時間は、主にシャドウ索引表と索引表のデータ・セグメントのスワッピングに要する時間と、保留キュー内のすべての行を削除する時間を加算した時間です。これは、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はブロックされます。スワッピング中は同期化もブロックされます。

関連項目

「CREATE_SHADOW_INDEX」「DROP_SHADOW_INDEX」および「EXCHANGE_SHADOW_INDEX」、さらに『Oracle Textアプリケーション開発者ガイド』も参照してください。

REMOVE_INDEX

CTXCAT索引セット・プリファレンスから、指定した列リストを持つ索引を削除します。


注意:

このプロシージャは、既存の索引からCTXCATサブ索引を削除しません。削除するには、索引を削除し、変更した索引セット・プリファレンスを使用して再索引付けする必要があります。

構文

CTX_DDL.REMOVE_INDEX(
    set_name       IN VARCHAR2,
     column_list    IN VARCHAR2
     language       IN VARCHAR2 default NULL
);
set_name

索引セットの名前を指定します。

column_list

削除する列リストの名前を指定します。

REMOVE_MDATA

ドキュメントから、MDATAセクションに関連付けられているメタデータ値を削除します。ADD_MDATAおよびREMOVE_MDATAをコールできるのは、索引の所有者のみです。

構文

CTX_DDL.REMOVE_MDATA(
     idx_name           IN VARCHAR2, 
     section_name       IN VARCHAR2, 
     values             SYS.ODCIVARCHAR2LIST,
     rowids             SYS.ODCIRIDLIST,
     [part_name]        IN VARCHAR2]
);
idx_name

名前が付けられたrowidsを含むテキスト索引の名前。

section_name

MDATAセクションの名前。

values

メタデータ値のリスト。メタデータ値にカンマが含まれている場合は、円記号でカンマをエスケープする必要があります。

rowids

メタデータ値を削除するRowids

[part_name]

索引パーティションの名前(ある場合)。ローカル・パーティション索引に指定する必要があり、グローバルの非パーティション索引ではNULLである必要があります。

この例では、MDATAセクションBGCOLORからMDATAblueを削除します。

ctx_ddl.remove_mdata('idx_docs', 'bgcolor', 'blue', 'rows'); 

関連項目

「ADD_MDATA」「ADD_MDATA_SECTION」「MDATA」、および『Oracle Textアプリケーション開発者ガイド』の「セクション検索」も参照してください。

注意

これらの更新は、元表に格納されている実際の内容ではなく索引自体に直接反映されます。したがって、テキスト索引が再構築されると存続しません。

REMOVE_SECTION

REMOVE_SECTIONプロシージャは、指定したセクションを指定のセクション・グループから削除します。セクションは、名前またはIDで指定できます。セクションIDは、CTX_USER_SECTIONSビューを使用して表示できます。

構文1

次の構文を使用して、セクション名によるセクションの削除を行います。

CTX_DDL.REMOVE_SECTION(
  group_name       in    varchar2, 
  section_name     in    varchar2
);
group_name

section_nameを削除するセクション・グループの名前を指定します。

section_name

group_nameから削除するセクションの名前を指定します。

構文2

次の構文を使用して、セクションIDでセクションを削除します。

CTX_DDL.REMOVE_SECTION(
  group_name     in    varchar2,
  section_id     in    number
);
group_name

section_idを削除するセクション・グループの名前を指定します。

section_id

group_nameから削除するセクションのセクションIDを指定します。

次の例は、Titleというセクションをhtmgroupから削除します。

begin
ctx_ddl.remove_section('htmgroup', 'Title');
end;

REMOVE_STOPCLASS

ストップクラスをストップリストから削除します。

構文

CTX_DDL.REMOVE_STOPCLASS(
  stoplist_name  in   varchar2,
  stopclass      in   varchar2
);
stoplist_name

ストップリストの名前を指定します。

ストップクラス

削除するストップクラスの名前を指定します。

次の例は、ストップクラスNUMBERSをストップリストmystopから削除します。

begin
ctx_ddl.remove_stopclass('mystop', 'NUMBERS');
end;

関連項目

「ADD_STOPCLASS」

REMOVE_STOPTHEME

ストップテーマをストップリストから削除します。

構文

CTX_DDL.REMOVE_STOPTHEME(
  stoplist_name   in   varchar2,
  stoptheme       in   varchar2
);
stoplist_name

ストップリストの名前を指定します。

ストップテーマ

stoplist_nameから削除するストップテーマを指定します。

次の例は、ストップテーマbankingをストップリストmystopから削除します。

begin
ctx_ddl.remove_stoptheme('mystop', 'banking');
end;

関連項目

「ADD_STOPTHEME」

REMOVE_STOPWORD

ストップワードをストップリストから削除します。ストップワードの削除を索引に反映させる場合は、索引を再構築する必要があります。

構文

CTX_DDL.REMOVE_STOPWORD(
stoplist_name  in   varchar2,
stopword       in   varchar2,
language       in   varchar2 default NULL
);
stoplist_name

ストップリストの名前を指定します。

ストップワード

stoplist_nameから削除するストップワードを指定します。

language

stoplist_nameで指定するストップリストがMULTI_STOPLIST型の場合は、削除するstopwordの言語を指定します。Oracle Textがサポートしている言語のグローバリゼーション・サポート名または略称を指定する必要があります。また、ALLストップワードも削除できます。

次の例は、ストップワードbecauseをストップリストmystopから削除します。

begin
ctx_ddl.remove_stopword('mystop','because');
end;

関連項目

「ADD_STOPWORD」

REMOVE_SUB_LEXER

サブレクサーをマルチレクサー・プリファレンスから削除します。DEFAULTのレクサーは削除できません。

構文

CTX_DDL.REMOVE_SUB_LEXER(
lexer_name  in   varchar2,
language    in   varchar2 default NULL
);
lexer_name

マルチレクサー・プリファレンスの名前を指定します。

language

削除するサブレクサーの言語を指定します。Oracle Textがサポートしている言語のグローバリゼーション・サポート名または略称を指定する必要があります。

次の例は、言語germanのサブレクサーgerman_lexerを削除します。

begin
ctx_ddl.remove_sub_lexer('german_lexer','german');
end;

関連項目

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); 
idx_name

メタデータを置換する索引の名前を指定します。

parameter_string

ALTER INDEXに渡すパラメータ文字列を指定します。これは、'REPLACE METADATA'で始まる必要があります。

注意

ALTER INDEX REBUILD PARAMETERS ('REPLACE METADATA')は、索引(グローバル)レベルのローカル・パーティション索引には機能しません。たとえば、ALTER INDEX構文を使用して、索引を再構築せずにフィルタまたはレクサー型などのグローバル・プリファレンスを変更できません。そのため、ALTER INDEXのこの制限を補うメソッドとしてCTX_DDL.REPLACE_INDEX_METADATAが提供されています。

CTX_DDL.REPLACE_INDEX_METADATAはローカル・パーティション索引のメタデータの置換を目的としていますが、グローバル非パーティション索引にも使用できます。

パーティション・レベルの同期化のタイプの変更に、REPLACE_INDEX_METADATAは使用できません。つまり、parameter_stringには'REPLACE METADATA SYNC'を指定できません。パーティション・レベルで同期化のタイプを変更するには、ALTER INDEX REBUILD PARTITIONを使用してください。

関連項目

「ALTER INDEX PARAMETERS構文」および「ALTER INDEX REBUILD構文」も参照してください。

SET_ATTRIBUTE

プリファレンスの属性を設定します。このプロシージャは、CTX_DDL.CREATE_PREFERENCEを使用してプリファレンスを作成した後で使用します。

構文

CTX_DDL.SET_ATTRIBUTE(preference_name IN VARCHAR2,  
                      attribute_name  IN VARCHAR2,  
                      attribute_value IN VARCHAR2); 
preference_name

プリファレンスの名前を指定します。

attribute_name

属性の名前を指定します。

attribute_value

属性の値を指定します。ブール値は、TRUEまたはFALSETまたはFYESまたはNOYまたはNONまたはOFF、あるいは1または0(ゼロ)で指定します。

ファイル・データ記憶域の指定

次の例では、索引付けするファイルがオペレーティング・システムに格納されていることをシステムに知らせるfileprefというデータ記憶域プリファレンスを作成します。その後、CTX_DDL.SET_ATTRIBUTEを使用し、PATH属性をディレクトリ/docsに設定します。

begin
ctx_ddl.create_preference('filepref', 'FILE_DATASTORE');
ctx_ddl.set_attribute('filepref', 'PATH', '/docs'); 
end;

関連項目:

データ記憶域の詳細は、「データストア型」を参照してください。

SET_ATTRIBUTEの使用例は、「CREATE_PREFERENCE」を参照してください。


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の場合は、保留中の変更があるCONTEXTCTXRULEおよびCTXXPATH索引すべてが同期化されます。この操作を実行するには、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および索引の断片化が増加しますが、ランタイム・メモリー容量が不足している場合に有効なことがあります。

part_name

使用している索引がローカル索引の場合は、同期化する索引パーティションの名前を指定します。指定しない場合はエラーが戻されます。

使用している索引がグローバルで、非パーティション索引の場合は、NULLを指定します。これはデフォルトです。

parallel_degree

パラレル同期化に対する並列度を指定します。1より大きい数値を指定すると、パラレル同期化が実行されます。実際の並列度は、リソースによっては多少低くなります。

maxtime

操作に対する提案制限時間を分単位で示します。SYNC_INDEXは、制限時間内でキュー内のドキュメントを可能なかぎり多数処理します。NULLのmaxtime値はCTX_DDL.MAXTIME_UNLIMITEDと同等です。このパラメータは、SYNC_INDEXが索引名なしで起動された場合は無視されます。その場合は、かわりに0のmaxtime値が使用されます。自動同期化(つまり、SYNC ON COMMITまたはSYNC EVERY)では、lockingパラメータは無視されます。

指定した制限時間は概算として処理されます。実際の時間は、指定した時間よりも若干短くまたは長くなることがあります。maxtimeのタイマーは、SYNCロックを取得したときに開始します。

locking

同じ索引または索引パーティションに対して別の同期化がすでに実行されている場合のSYNC_INDEXの対応を構成します。SYNC_INDEXが索引名なしで起動されてlockingが無視される場合は、かわりにLOCK_NOWAITのlocking値が使用されます。自動同期化(つまり、SYNC ON COMMITまたはSYNC EVERY)では、lockingパラメータは無視されます。

lockingのオプションは、次のとおりです。

CTX_DDL.LOCK_WAIT 別の同期化が実行されている場合は、実行中の同期が完了するまで待機してから同期化を開始します。(ロックを取得できない場合は無制限に待機し、maxtime設定は無視されます。)
CTX_DDL.LOCK_NOWAIT 別の同期化が実行されている場合は、エラーなしで即時に戻ります。
CTX_DDL.LOCK_NOWAIT_ERROR 別の同期化が実行されている場合は、「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_INDEXCTX_DDL.OPTIMIZE_INDEXと同時に実行したり、並列度が指定されたCTX_DDL.SYNC_INDEXを並列度が指定されたCTX_DDL.OPTIMIZE_INDEXと同時に実行しないでください。これらのいずれかの組合せを実行する必要がある場合、エラーは生成されませんが、一方の処理が完了してからもう一方の処理が行われます。

関連項目

「ALTER INDEX」

UNSET_ATTRIBUTE

プリファレンスから属性の設定を削除します。

構文

CTX_DDL.UNSET_ATTRIBUTE(preference_name varchar2,
                        attribute_name  varchar2);
preference_name

プリファレンスの名前を指定します。

attribute_name

属性の名前を指定します。

代替スペルの使用可能/使用禁止

次の例では、ドイツ語の代替スペルを使用可能にする方法および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;

関連項目

「SET_ATTRIBUTE」

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);
policy_name

更新するポリシーの名前を指定します。

フィルタ

使用するフィルタ・プリファレンスを指定します。

section_group

使用するセクション・グループを指定します。

lexer

使用するレクサー・プリファレンスを指定します。

ストップリスト

使用するストップリストを指定します。

wordlist

使用するワードリストを指定します。