この章では、テキスト索引に必要なプリファレンス、セクション・グループおよびストップリストを作成および管理するための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_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 |
ポリシーを更新します。 |
属性セクションを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'
フィールド・セクションを作成し、そのセクションを既存のセクション・グループに追加します。これによって、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つのセクション・グループに対して最大64のフィールド・セクションを追加できます。同じグループ内では、セクション・ゾーン名とセクション・フィールド名は同じ名前にできません。
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
を定義します。次に、<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
フィールド・セクションはvisibleフラグをFALSEに設定したため、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
問合せで繰返しセクションを区別するには、これらをゾーン・セクションとして定義します。
関連項目
第3章「Oracle Text CONTAINS問合せ演算子」の「WITHIN」演算子
サブ索引をカタログ索引プリファレンスに追加します。このプリファレンスを作成するには、元表の1つ以上の列に名前を付けます。
サブ索引を作成して構造化問合せの応答時間を改善するため、問合せ時には、追加する列をCATSEARCH
演算子のstructured_query
句で使用する必要があります。
構文
CTX_DDL.ADD_INDEX(set_name in varchar2,
column_list varchar2, storage_clause varchar2);
索引セットの名前を指定します。
索引にカンマで区切られた列のリストを指定します。索引付け時は、このリストの列の元表での行の値が、必ずNULL以外である必要があります。索引付け時にいずれかの行がNULLであると、エラーが発生します。
索引付けの前後に、列にNULL以外の値が設定されていることを確認してください。
記憶域句を指定します。
例
次のスキーマを使用して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] );
名前が付けられたrowidを含むテキスト索引の名前。
MDATA
セクションの名前。
メタデータ値のリスト。メタデータ値にカンマが含まれている場合は、円記号でカンマをエスケープする必要があります。
メタデータ値を追加するROWID。
索引パーティションの名前(ある場合)。ローカル・パーティション索引に指定する必要があり、グローバルの非パーティション索引では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アプリケーション開発者ガイド』の「セクション検索」も参照してください。
column_nameで名前が指定されているFILTER
BY
列をsection_nameで名前が指定されているMDATA
セクションにマップします。
構文
構文は、次のとおりです。
CTX_DDL.ADD_MDATA_COLUMN( group_name IN VARCHAR2, section_name IN VARCHAR2, column_name IN VARCHAR2, );
セクションを含むグループの名前。
MDATA
セクションの名前。
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
列の範囲述語が処理されます。これは、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, );
MDATA
セクションを含むセクション・グループの名前。
MDATA
セクションの名前。
MDATA
セクションの値。たとえば、セクションが<AUTHOR>
である場合、値はCynthia Kadohata(小説『The Floating World』の著者)などとなります。指定したMDATA
セクションに複数のtagを割り当てることができます。
例
この例では、AUTHOR
というMDATA
セクションを作成します。
ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP'); ctx_ddl.add_mdata_section('htmgroup', 'auth', 'author');
関連項目
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, );
セクションを含むグループの名前。
SDATA
セクションの名前。
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
セクションをセクション・グループに追加します。デフォルトでは、すべての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
は単独で出現します。SDATA
タグの複数インスタンスが単一のドキュメントに出現する場合は、後のインスタンスが前のインスタンスで設定された値よりも優先されます。これは、最後に出現するSDATA
タグが有効になることを意味します。
指定のドキュメントにSDATA
タグがない場合は、NULL
のSDATA
値として処理されます。
空のSDATA
タグはNULL
値として処理されます。
SDATA
セクションはネストできません。内部でネストされたセクションは無視されます。
関連項目
特殊セクション(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);
セクション・グループの名前を指定します。
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;
関連項目
第3章「Oracle Text CONTAINS問合せ演算子」の「WITHIN」演算子
ストップクラスをストップリストに追加します。ストップクラスは、索引付けされていないトークンのクラスです。
構文
CTX_DDL.ADD_STOPCLASS( stoplist_name in varchar2, stopclass in varchar2 );
ストップリストの名前を指定します。
stoplist_nameに追加するストップクラスを指定します。現在は、NUMBERS
クラスのみがサポートされています。カスタム・ストップクラスは作成できません。
NUMBERS
には、数値パターンに従ったトークン、つまり小数点、numgroup
およびnumjoin
のみが含まれます。したがって、123ABCもA123も数値ではありません。これらはMIXED
としてラベル付けされます。$123は数値ではありません(英数字以外はデフォルトで空白になるため、このトークンはテキスト索引としては一般的ではありません)。米国では、123.45は数値ですが、123.456.789は数値ではありません。numgroupに'.'を使用する欧州では、これとは逆に123.456.789は数値ですが、123.45は数値ではありません。
ストップリストに追加できるストップワード、ストップテーマおよびストップクラスの数の最大値は4095です。
例
次の例は、ストップクラスNUMBERS
をストップリストmystop
に追加します。
begin ctx_ddl.add_stopclass('mystop', 'NUMBERS'); end;
関連項目
停止セクションを自動セクション・グループに追加します。停止セクションを追加すると、自動セクションの索引付け操作で、XMLドキュメント内の指定されたセクションが無視されます。
注意: 停止セクションを追加すると、索引内にセクション情報が作成されません。ただし、停止セクション内のテキストは常に検索可能です。 |
停止セクションを追加することは、ドキュメントに下位レベルの情報タグが多数含まれる場合に有効です。また、停止セクションを追加すると、自動セクション・グループを使用した索引付けのパフォーマンスが向上します。
追加できる停止セクションの数は無制限です。
停止セクションにはセクション名がありません。したがって、セクション・ビューには記録されません。
構文
CTX_DDL.ADD_STOP_SECTION( section_group IN VARCHAR2, tag IN VARCHAR2);
自動セクション・グループの名前を指定します。自動セクション・グループを指定しない場合、このプロシージャはエラーを戻します。
索引付け時に無視するタグを指定します。このパラメータでは、大/小文字が区別されます。また、このように停止タグを定義すると、タグの属性セクションがある場合は、これも停止します。
タグは、(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;
関連項目
単一のストップテーマをストップリストに追加します。ストップテーマは、索引付けされていないテーマです。
英語では、ABOUT演算子を使用して索引テーマを問い合せます。
構文
CTX_DDL.ADD_STOPTHEME( stoplist_name in varchar2, stoptheme in varchar2 );
ストップリストの名前を指定します。
stoplist_name
に追加するストップテーマを指定します。システムではナレッジ・ベースを使用して、入力されたstoptheme
を正規化します。正規化されたテーマが複数の場合、ストップテーマは処理されません。したがって、単一のストップテーマを送信することをお薦めします。
ストップリストに追加できるストップワード、ストップテーマおよびストップクラスの数の最大値は4095です。
例
次の例では、ストップテーマ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
);
ストップリストの名前を指定します。
追加するストップワードを指定します。
言語固有のストップワードは、その言語固有の他のストップワードとの間で一意であることが必要です。たとえば、ドイツ語のdieと英語のdieを同じストップリスト内に含めることは有効です。
ストップリストに追加できるストップワード、ストップテーマおよびストップクラスの数の最大値は4095です。
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ストップワードの追加
次の例では、ワードtheをALL
ストップワードとして、マルチ言語のストップリストgloballistに追加します。
begin
ctx_ddl.add_stopword('globallist','the','ALL');
end;
関連項目
サブレクサーをマルチレクサー・プリファレンスに追加します。サブレクサーは、マルチレクサー(マルチ言語)・プリファレンスで言語を識別します。複数の言語を索引付けする必要がある場合は、マルチレクサー・プリファレンスを使用します。
制限事項
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 );
マルチレクサー・プリファレンスの名前を指定します。
サブレクサーのグローバリゼーション・サポート言語の名前または略称を指定します。たとえば、日本語に対してはJAPANESE
またはJA
を指定します。
sub_lexer
で指定したサブレクサーは、言語列が、language
の略称グローバリゼーション・サポート名と同等の値(大/小文字を区別しない)を持つ場合に使用されます。
元表内の言語列の値がNULL、無効またはサブレクサーにマップされていない場合は、DEFAULT
を指定し、デフォルトのサブレクサーを割り当てます。DEFAULT
レクサーも、ストップワードの解析に使用されます。
指定したlanguage
に対するサブレクサー定義がすでに存在する場合は、このコールで置換されます。
この言語に対して使用するサブレクサーの名前を指定します。
オプションで、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');
ゾーン・セクションを作成し、そのセクションを既存のセクション・グループに追加します。これによって、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', 'headline', '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のみを戻します。
関連項目
第3章「Oracle Text CONTAINS問合せ演算子」の「WITHIN」演算子
既存のポリシーまたは索引から新規ポリシーを作成します。
構文
ctx_ddl.copy_policy( source_policy VARCHAR2, policy_name VARCHAR2 );
コピーするポリシーまたは索引の名前。
コピーした新規ポリシーの名前。
プリファレンス値はsource_policy
からコピーされます。コピー元のポリシーまたは索引と新規ポリシーのどちらも、同じデータベース・ユーザーが所有している必要があります。
CTXCAT
索引タイプの索引セットを作成します。CTXCAT
索引を作成するときは、CREATE
INDEX
のPARAMETERS句でこの索引セット名を指定します。
構文
CTX_DDL.CREATE_INDEX_SET(set_name in varchar2);
索引セットの名前を指定します。CTXCAT
索引を作成するときは、CREATE
INDEX
のPARAMETERS句でこの索引セット名を指定します。
CTX_DOC.POLICY_*
プロシージャおよびORA:CONTAINS
ファンクションで使用するポリシーを作成します。ORA:CONTAINS
は、existsNode()
を使用したXPATH
問合せ式内で使用するファンクションです。
構文
CTX_DDL.CREATE_POLICY( policy_name IN VARCHAR2, filter IN VARCHAR2 DEFAULT NULL, section_group IN VARCHAR2 DEFAULT NULL, lexer IN VARCHAR2 DEFAULT NULL, stoplist IN VARCHAR2 DEFAULT NULL, wordlist IN VARCHAR2 DEFAULT NULL);
新しいポリシーの名前を指定します。ポリシー名とテキスト索引は同じ名前空間を共有します。
使用するフィルタ・プリファレンスを指定します。
使用するセクション・グループを指定します。CONTEXT索引でサポートされている任意のセクション・グループを指定できます。
使用するレクサー・プリファレンスを指定します。INDEX_THEMES
属性を使用禁止にする必要があります。
使用するストップリストを指定します。
使用するワードリストを指定します。
例
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 INDEXまたはALTER INDEXのパラメータ文字列で指定します。
重要: CTX_DDL.CREATE_PREFERENCE では、ALTER SESSION SET current_schema によって設定された現行のスキーマは考慮されません。したがって、別のユーザーが所有するプリファレンスを作成または削除する必要がある場合は、その状態を明示的に記述する必要があります。そのためにはCREATE ANY TABLE システム権限が必要です。
この問題の詳細は、「WebIV note 249991.1」を参照してください。 回避策: <indexname> CONSTANT VARCHAR2(32) := 'XDB.XDB$CI' ; <indexname>は、 |
構文
CTX_DDL.CREATE_PREFERENCE(preference_name in varchar2, object_name in varchar2);
作成するプリファレンスの名前を指定します。
プリファレンス型の名前を指定します。
例
テキストのみの索引の作成
次の例では、テキストのみの索引を指定するレクサー・プリファレンスを作成します。そのためには、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;
次の例では、索引表が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
が指定されている場合、この指定による索引の影響はないため、索引は正しく作成されます。
関連項目
第1章「Oracle TextのSQL文と演算子」の「CREATE INDEX」
テキスト列にセクションを定義するためのセクション・グループを作成します。
セクション・グループを作成する場合は、ADD_ZONE_SECTION、ADD_FIELD_SECTION、ADD_MDATA_SECTIONまたはADD_SPECIAL_SECTIONを使用して、そのセクション・グループにゾーン、フィールドまたは特殊セクションを追加できます。
索引付けする場合は、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パラメータは、次のいずれかです。
例
次のコマンドは、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;
関連項目
第3章「Oracle Text CONTAINS問合せ演算子」の「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 );
有効なCONTEXT
索引タイプの名前。
非パーティション索引の場合は、ALTER
INDEX
の文字列と同じです。パーティション索引の場合は、ALTER
INDEX
PARAMETER
の文字列と同じです。
予備。並列度を指定します。現在、並列度オプションはサポートされていません。
例
例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
INDEX
にNOPOPULATE
が指定されていないかぎり、非パーティション索引の索引表も移入されます。ローカル・パーティション索引の場合は、各パーティションに対して索引表を作成せずに、索引メタデータのみが作成されます。各索引に指定できるシャドウ索引は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」も参照してください。
新しい空のストップリストを作成します。ストップリストには、索引付けしないワードまたはテーマを含めることができます。
言語固有のストップワードを保持するマルチ言語のストップリストを作成することもできます。マルチ言語のストップリストは英語、ドイツ語および日本語などの異なる言語のドキュメントを含む表の索引付けに有効です。索引付けを実行する場合は、テキスト表に言語列が含まれている必要があります。
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
を指定します。
索引付け時に、各ドキュメントの言語列が調べられ、その言語のストップワードのみが排除されます。問合せ時に、セッション言語の設定によって、アクティブなストップワードが特定されます。これは、マルチレクサーの使用時にアクティブなレクサーが特定されるのと同様です。
注意: マルチ言語のストップリストを持つマルチ言語表を索引付けする場合は、表に言語列が含まれている必要があります。 |
例
例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;
関連項目
第1章「Oracle TextのSQL文と演算子」の「CREATE INDEX」
CTX_DDL.CREATE_INDEX_SETを使用して作成されたCTXCAT
索引セットを削除します。
構文
CTX_DDL.DROP_INDEX_SET( set_name IN VARCHAR2 );
削除する索引セットの名前を指定します。
索引セットを削除すると、それに含まれるサブ索引もすべて削除されます。
CTX_DDL.CREATE_POLICYを使用して作成されたポリシーを削除します。
構文
CTX_DDL.DROP_POLICY( policy_name IN VARCHAR2 );
削除するポリシーの名前を指定します。
DROP_PREFERENCE
プロシージャは、指定したプリファレンスをテキスト・データ・ディクショナリから削除します。プリファレンスを削除しても、そのプリファレンスを使用して作成された索引には影響を与えません。
構文
CTX_DDL.DROP_PREFERENCE( preference_name IN VARCHAR2 );
削除するプリファレンスの名前を指定します。
例
次の例は、プリファレンスmy_lexer
を削除します。
begin ctx_ddl.drop_preference('my_lexer'); end;
関連項目
「CTX_DDL.CREATE_PREFERENCE」も参照してください。
DROP_SECTION_GROUP
プロシージャは、指定したセクション・グループおよびそのグループ内のすべてのセクションをテキスト・データ・ディクショナリから削除します。
構文
CTX_DDL.DROP_SECTION_GROUP( group_name IN VARCHAR2 );
削除するセクション・グループの名前を指定します。
例
次の例は、セクション・グループhtmgroup
およびそのすべてのセクションを削除します。
begin ctx_ddl.drop_section_group('htmgroup'); end;
関連項目
「CTX_DDL.CREATE_SECTION_GROUP」も参照してください。
指定した索引のシャドウ索引を削除します。シャドウ索引を削除するときに、その索引がパーティション化されている場合は、このシャドウ索引のメタデータと、このシャドウ索引のパーティションすべてのメタデータが削除されます。このプロシージャは、シャドウ索引表もすべて削除し、オンライン保留キューをクリーン・アップします。
構文
CTX_DDL.DROP_SHADOW_INDEX( idx_name in VARCHAR2 );
シャドウ索引の名前を指定します。
例
次の例は、シャドウ索引myshadowidx
を削除します。
begin ctx_ddl.drop_shadow_index('myshadowidx'); end;
関連項目
「CTX_DDL.CREATE_SHADOW_INDEX」も参照してください。
テキスト・データ・ディクショナリからストップリストを削除します。ストップリストを削除した場合は、変更を有効にするために索引を再作成または再構築する必要があります。
構文
CTX_DDL.DROP_STOPLIST(stoplist_name in varchar2);
ストップリストの名前を指定します。
例
次の例は、ストップリスト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 );
CONTEXT
索引タイプの名前を指定します。
シャドウ索引パーティションの名前を指定します。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度に1つのパーティションのみがスワップされます。このプロシージャをNOSWAP
で再作成されたパーティションに対して実行すると、問合せは次のように処理されます。
複数のパーティションにわたる問合せでは、すべてのパーティションで一貫した結果が戻るわけではありません。
スワップ中のパーティションに対する問合せは、エラーになります。
すでにスワップ済のパーティションに対する問合せは、新しい索引がベースとなります。
スワップされなかったパーティションに対する問合せは、古い索引がベースとなります。
partition_nameがNULLの場合は、索引メタデータがスワップされます。ローカル・パーティション索引をオンラインで再作成する場合は、このプロシージャを手順の最後に実行します。
関連項目
「CTX_DDL.RECREATE_INDEX_ONLINE」、「CTX_DDL.CREATE_SHADOW_INDEX」および「CTX_DDL.DROP_SHADOW_INDEX」も参照してください。
索引を最適化します。索引の最適化は、同期化の後に実行します。索引を最適化すると、古いデータが削除され、索引の断片化が最小限度に抑えられます。その結果、問合せ応答時間を短縮できます。問合せおよびDMLの処理は最適化中にも続行できます。
高速モード、完全モード、再構築モード、トークン・モードまたはトークン型モードで最適化できます。
高速モードではデータは圧縮されますが、行は削除されません。
完全モードではデータが圧縮され、行が削除されます。
再構築モードで最適化すると、$I
表(逆リスト表)全体が再構築されます。索引の再構築は完全最適化を実行したときよりも処理時間が大幅に短いことが多く、特に索引がひどく断片化している場合は、小型の索引を生成する傾向があります。
再構築モードの最適化は、$I
表のさらに圧縮されたコピーを作成し、元の$I
表とコピーを切り替えます。そのため、再構築操作には元の表とコピーを格納する十分な領域が必要です。(REDOロギングが使用可能な場合は、REDOログ用の領域を追加することも必要です。)再構築操作の最後には元の$I
表が削除されるため、領域を再利用できます。
再構築モードで最適化すると、OPTIMIZE_INDEX
APIでは索引および索引の基礎となる$
表の完全な再構築は実行されません。
トークン・モードでは、最適化する特定のトークンを指定します(たとえば、ワードelectionsを含むドキュメントを持つ行すべて)。このモードを使用して、参照頻度の低いトークンの最適化に要する時間を節約しながら、検索頻度の高い索引トークンを最適化します。トークンを最適化すると、問合せ応答時間を短縮できます(最適化されたトークンで問い合せる場合のみ)。
トークン型の最適化はトークン・モードに似ていますが、最適化がフィールド・セクションまたはMDATA
セクション(たとえば、<A>
タグのあるセクション)で実行される点が異なります。これは、重要なフィールドまたはMDATA
セクションを最適な状態に保持する場合に有効です。
索引を最適化する一般的な方法は、参照頻度の高い語句で通常のトークン・モードの最適化を実行し、再構築モードの最適化はあまり実行しないという方法です。(実行頻度の高い問合せを見つけるには、CTX_REPORT.QUERY_LOG_SUMMARYを使用します。)トークン・モードの最適化のかわりに、完全モード、高速モードまたはトークン型モードの最適化を実行できます。
再構築の最適化はあまり実行せず、制限時間を指定して完全最適化を頻繁に実行するという方法もあります。
注意: 索引を最適化することで、初期の索引操作後、元表に対するドキュメントの挿入、削除または更新操作のみが必要な場合は、応答時間がかなり短縮できます。 |
索引の最適化には、ALTER
INDEX
文よりもこのプロシージャを使用することをお薦めします。
大型の索引の最適化には、時間を要することがあります。長時間に及ぶ最適化の進捗状態を監視するには、CTX_OUTPUT.START_LOGを使用して最適化をロギングし、生成されるログファイルを時々チェックしてください。
注意: $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の値 | 説明 |
---|---|
FAST またはCTX_DDL.OPTLEVEL_FAST |
この方法では、断片化した行が圧縮されます。ただし、古いデータは削除されません。
|
FULL またはCTX_DDL.OPTLEVEL_FULL |
このモードでは、索引全体または索引の一部を最適化できます。この方法では行が圧縮され、古いデータ(削除済の行)が削除されます。完全モードでの最適化は、削除済の行が存在しない場合でも実行されます。
完全最適化は、 |
REBUILD またはCTX_DDL.OPTLEVEL_REBUILD |
このoptlevel では、$I 表(逆リスト表)が再構築され、圧縮されたトークン情報の行が生成されます。FULL 最適化のように、このモードでも元表の削除された行に関係する情報が削除されます。
|
TOKEN またはCTX_DDL.OPTLEVEL_TOKEN |
この方法では、最適化する特定のトークンを指定します。Oracle Textでは、tokenで指定されたトークンに対して完全最適化を実行します。指定されたトークン型がない場合は、0(ゼロ)がデフォルトとして使用されます。
検索頻度の高いトークンの最適化には、この方法を使用します。 トークン・モードでの最適化は、 |
TOKEN_TYPE またはCTX_DDL.OPTLEVEL_TOKEN_TYPE |
この最適化レベルでは、入力トークン型に一致する索引内のすべてのトークンがオンデマンドで最適化されます。
token_typeの最適化は、 |
$S索引表に対するCTX_DDL.OPTIMIZE_INDEX
の動作は、次のとおりです。
optlevelの値 | $S索引表の 最適化 |
注意 |
---|---|---|
FAST またはCTX_DDL.OPTLEVEL_FAST |
いいえ | |
FULL またはCTX_DDL.OPTLEVEL_FULL |
はい |
|
REBUILD またはCTX_DDL.OPTLEVEL_REBUILD |
はい |
|
TOKEN またはCTX_DDL.OPTLEVEL_TOKEN |
いいえ | |
TOKEN_TYPE またはCTX_DDL.OPTLEVEL_TOKEN_TYPE |
はい | optlevel => TOKEN_TYPE およびTOKEN_TYPE パラメータをターゲットSDATA_ID に対して設定することで、指定したSDATA_ID の$S行を最適化できます。 |
FULL
モードでの最適化の最大時間を分単位で指定します。
記号CTX_DDL
.MAXTIME_UNLIMITED
を指定した場合(またはNULLで渡した場合)は、索引全体が最適化されます。これはデフォルトです。
最適化するトークンを指定します。
使用している索引がローカル索引の場合は、同期化する索引パーティションの名前を指定します。指定しない場合はエラーが戻されます。
使用している索引がグローバルで、非パーティション索引の場合は、NULLを指定します。これはデフォルトです。
最適化するtoken_type
を指定します。
パラレル最適化に対する並列度を数値で指定します。実際の並列度は、リソースによって異なります。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
およびCTX_DDL.OPTIMIZE
は同時に実行できます。並列度が指定されたCTX_DDL.SYNC
およびCTX_DDL.OPTIMIZE
も同時に実行できます。ただし、次は実行しないでください。
並列度が指定されたCTX_DDL.SYNC
をCTX_DDL.OPTIMIZE
と同時に実行すること。
並列度が指定されたCTX_DDL.SYNC
を並列度が指定されたCTX_DDL.OPTIMIZE
と同時に実行すること。
これらのいずれかの組合せを実行する必要がある場合、エラーは生成されませんが、一方の処理が完了してからもう一方の処理が行われます。
関連項目
「CTX_DDL.SYNC_INDEX」および第1章「Oracle TextのSQL文と演算子」の「ALTER INDEX」も参照してください。
元表または表パーティション内のROWIDすべてを含めた保留キューを移入します。このプロシージャは、CONTEXT
索引に対してのみサポートされています。
このプロシージャは、索引付け処理を連続的に実行する余裕がないために、テキスト索引作成に対する制御を向上させる必要がある大規模なインストール環境で役立ちます。望ましい方法は、空の索引を作成して、すべてのROWIDを保留キューに配置し、CTX_DDL.SYNC_INDEXを介して索引を構築する方法です。
構文
ctx_ddl.populate_pending( idx_name IN VARCHAR2, part_name IN VARCHAR2 DEFAULT NULL );
CONTEXT
索引タイプの名前。
索引パーティションの名前(ある場合)。ローカル・パーティション索引に指定する必要があり、グローバルの非パーティション索引ではNULLである必要があります。
注意
SYNC_INDEX
は処理の間ブロックされます。索引ユニットは完全に空(idx_docid_count
= 0、idx_nextid
= 1)であることが必要です。索引付けを待機している行のROWIDは、表ctxsys.dr$pending
に挿入されます。元表のROWIDを保持するための十分な領域がこの表にあることを確認してください。
関連項目
「SYNC_INDEX」、「CREATE_SHADOW_INDEX」、「DROP_SHADOW_INDEX」、「EXCHANGE_SHADOW_INDEX」、「RECREATE_INDEX_ONLINE」も参照してください。
指定した索引を再作成します。あるいは、索引がローカル・パーティション索引の場合は、受け取った索引パーティションを再作成します。グローバル非パーティション索引の場合、これはワンステップ・プロシージャです。ローカル・パーティション索引の場合は、最初に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
のパーティション・レベルのパラメータ文字列を指定します。
例
例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_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')
例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は許可され、通常どおりに処理されます。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
が実施されます。
索引パーティションの再作成中はスワッピングが実行されないため、パーティションに対する問合せは通常どおりに処理されます。スワッピング段階に到達するまで、複数のパーティションにわたる問合せでは、パーティション全体で一貫した結果が戻ります。
DMLと同期化は通常どおりに処理されます。再作成中または構築済(ただし、スワップは未処理)のパーティションに対する最適化の実行では、なにも処理されずに単純に戻ります。再構築されていないパーティションに対する最適化の実行は、通常どおりに処理されます。
グローバル索引と同様に、すべてのパーティションでNOSWAP
が使用されている場合は、既存の索引とほぼ等しいサイズの追加の記憶域が必要です。
索引パーティションのデータとメタデータは索引の再作成後にスワップされるため、複数のパーティションにわたる問合せでは、すべてのパーティションで一貫した結果が戻るわけではありません。しかし、各索引パーティションに関しては常に適切になります。また、パーティションの再作成の終了間際には、索引パーティションのスワップ時に発行した問合せに対して、列が索引付けされていないことを示すエラーが戻る短い時間帯があります。
SWAP
を使用してパーティションが再作成するときは、既存の索引パーティションと等しいサイズの記憶域がさらに必要です。
パーティションに対するDMLはブロックされます。スワッピング中は同期化もブロックされます。
関連項目
「CREATE_SHADOW_INDEX」、「DROP_SHADOW_INDEX」および「EXCHANGE_SHADOW_INDEX」、さらに『Oracle Textアプリケーション開発者ガイド』も参照してください。
CTXCAT
索引セット・プリファレンスから、指定した列リストを持つ索引を削除します。
注意: このプロシージャは、既存の索引から CTXCAT サブ索引を削除しません。削除するには、索引を削除し、変更した索引セット・プリファレンスを使用して再索引付けする必要があります。 |
構文
CTX_DDL.REMOVE_INDEX(
set_name IN VARCHAR2, column_list IN VARCHAR2 language IN VARCHAR2 default NULL );
索引セットの名前を指定します。
削除する列リストの名前を指定します。
ドキュメントから、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] );
名前が付けられたrowidsを含むテキスト索引の名前。
MDATA
セクションの名前。
メタデータ値のリスト。メタデータ値にカンマが含まれている場合は、円記号でカンマをエスケープする必要があります。
メタデータ値を削除するRowids
。
索引パーティションの名前(ある場合)。ローカル・パーティション索引に指定する必要があり、グローバルの非パーティション索引ではNULLである必要があります。
例
この例では、MDATA
セクションBGCOLOR
からMDATA
値blueを削除します。
ctx_ddl.remove_mdata('idx_docs', 'bgcolor', 'blue', 'rows');
関連項目
「ADD_MDATA」、「ADD_MDATA_SECTION」、「MDATA」、および『Oracle Textアプリケーション開発者ガイド』の「セクション検索」も参照してください。
REMOVE_SECTION
プロシージャは、指定したセクションを指定のセクション・グループから削除します。セクションは、名前またはIDで指定できます。セクションIDは、CTX_USER_SECTIONS
ビューを使用して表示できます。
構文1
次の構文を使用して、セクション名によるセクションの削除を行います。
CTX_DDL.REMOVE_SECTION( group_name in varchar2, section_name in varchar2 );
section_name
を削除するセクション・グループの名前を指定します。
group_name
から削除するセクションの名前を指定します。
構文2
次の構文を使用して、セクションIDでセクションを削除します。
CTX_DDL.REMOVE_SECTION( group_name in varchar2, section_id in number );
section_id
を削除するセクション・グループの名前を指定します。
group_name
から削除するセクションのセクションIDを指定します。
例
次の例は、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 );
ストップリストの名前を指定します。
stoplist_name
から削除するストップテーマを指定します。
例
次の例は、ストップテーマ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
);
ストップリストの名前を指定します。
stoplist_name
から削除するストップワードを指定します。
stoplist_name
で指定するストップリストがMULTI_STOPLIST
型の場合は、削除するstopword
の言語を指定します。Oracle Textがサポートしている言語のグローバリゼーション・サポート名または略称を指定する必要があります。また、ALL
ストップワードも削除できます。
例
次の例は、ストップワードbecauseをストップリストmystop
から削除します。
begin
ctx_ddl.remove_stopword('mystop','because');
end;
関連項目
サブレクサーをマルチレクサー・プリファレンスから削除します。DEFAULTのレクサーは削除できません。
構文
CTX_DDL.REMOVE_SUB_LEXER(
lexer_name in varchar2, language in varchar2 default NULL
);
マルチレクサー・プリファレンスの名前を指定します。
削除するサブレクサーの言語を指定します。Oracle Textがサポートしている言語のグローバリゼーション・サポート名または略称を指定する必要があります。
例
次の例は、言語german
のサブレクサーgerman_lexerを削除します。
begin
ctx_ddl.remove_sub_lexer('german_lexer','german');
end;
関連項目
ローカル・ドメイン索引内のメタデータをグローバル(索引)レベルで置換します。
注意: ALTER INDEX PARAMETERS コマンドはこのプロシージャと同じ機能を実行し、メタデータ以外も置換できます。このため、グローバル(索引)レベルでメタデータを置換する場合には、できるだけこのプロシージャのかわりにALTER INDEX PARAMETERS を使用するようにしてください。詳細は、「ALTER INDEX PARAMETERS構文」を参照してください。
|
構文
CTX_DDL.REPLACE_INDEX_METADATA(idx_name IN VARCHAR2, parameter_string IN VARCHAR2);
メタデータを置換する索引の名前を指定します。
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構文」も参照してください。
プリファレンスの属性を設定します。このプロシージャは、CTX_DDL.CREATE_PREFERENCEを使用してプリファレンスを作成した後で使用します。
構文
CTX_DDL.SET_ATTRIBUTE(preference_name IN VARCHAR2, attribute_name IN VARCHAR2, attribute_value IN VARCHAR2);
プリファレンスの名前を指定します。
属性の名前を指定します。
属性の値を指定します。ブール値は、TRUE
またはFALSE
、T
またはF
、YES
またはNO
、Y
またはN
、ON
または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;
関連項目: データ記憶域の詳細は、第2章「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およびCTXXPATH索引すべてが同期化されます。この操作を実行するには、ctxsys として接続する必要があります。各索引または索引パーティションは、順に従って同期化されます。そのため、個々の同期化は、lockingをNOWAIT に設定し、maxtimeを0 に設定した状態で実行されます。SYNC_INDEX のコール時にlockingまたはmaxtimeパラメータに指定した値は無視されます。ただし、memory およびparallel_degree パラメータは、個々の同期化ごとに渡されます。 |
同期化に使用するランタイム・メモリー容量を指定します。この値は、DEFAULT_INDEX_MEMORY
システム・パラメータをオーバーライドします。
memory
パラメータは、索引をディスクにフラッシュする前に、Oracle Textが同期化操作に使用するメモリー量を指定します。大きいメモリー量を指定すると、次のような効果が得られます。
I/Oが削減されるため索引付けのパフォーマンスが向上します。
断片化が削減されるため問合せのパフォーマンスとメンテナンスが向上します。
小さいメモリー量を指定すると、ディスク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
のオプションは、次のとおりです。
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
およびCTX_DDL.OPTIMIZE
は同時に実行できます。並列度が指定されたCTX_DDL.SYNC
およびCTX_DDL.OPTIMIZE
も同時に実行できます。ただし、並列度が指定されたCTX_DDL.SYNC
をCTX_DDL.OPTIMIZE
と同時に実行したり、並列度が指定されたCTX_DDL.SYNC
を並列度が指定されたCTX_DDL.OPTIMIZE
と同時に実行しないでください。これらのいずれかの組合せを実行する必要がある場合、エラーは生成されませんが、一方の処理が完了してからもう一方の処理が行われます。
関連項目
プリファレンスから属性の設定を削除します。
構文
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;
関連項目
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);
更新するポリシーの名前を指定します。
使用するフィルタ・プリファレンスを指定します。
使用するセクション・グループを指定します。
使用するレクサー・プリファレンスを指定します。
使用するストップリストを指定します。
使用するワードリストを指定します。