C カスタム索引プリファレンスの例

この付録では、いくつかのカスタム索引プリファレンスの例について説明します。

この付録の内容は次のとおりです。

C.1 データストア例

次に、ダイレクト、複数列、URLおよびファイルのデータストアの設定例を示します。

DIRECT_DATASTOREの指定

この例では、テキスト・データを格納するCLOB列がある表を作成します。その後、2行のテキスト・データを移入し、DIRECT_DATASTOREプリファレンス型を使用するシステム定義のCTXSYS.DEFAULT_DATASTOREプリファレンスを使用して表を索引付けします。

create table mytable(id number primary key, docs clob); 

insert into mytable values(111555,'this text will be indexed');
insert into mytable values(111556,'this is a default datastore example');
commit;

create index myindex on mytable(docs) 
  indextype is ctxsys.context 
  parameters ('DATASTORE CTXSYS.DEFAULT_DATASTORE');

MULTI_COLUMN_DATASTOREの指定

この例では、これらのテキスト列は、連結されて索引付けされます。3つのテキスト列にmy_multiという複数列のデータストア・プリファレンスを作成します。

begin
ctx_ddl.create_preference('my_multi', 'MULTI_COLUMN_DATASTORE');
ctx_ddl.set_attribute('my_multi', 'columns', 'column1, column2, column3');
end;

URLデータ記憶域の指定

この例では、my_urlというURL_DATASTOREプリファレンスを作成し、http_proxyno_proxyおよびtimeoutの各属性を設定します。timeout属性は300秒に設定されます。属性を設定しない場合は、デフォルトが使用されます。

begin
 ctx_ddl.create_preference('my_url','URL_DATASTORE');
 ctx_ddl.set_attribute('my_url','HTTP_PROXY','www-proxy.us.example.com');
 ctx_ddl.set_attribute('my_url','NO_PROXY','us.example.com');
 ctx_ddl.set_attribute('my_url','TIMEOUT','300');
end;

ノート:

Oracle Database 20c以降、Oracle TextのURL_DATASTORE型は非推奨になりました。かわりに、NETWORK_DATASTOREを使用してください。

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

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

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

ノート:

Oracle Database 20c以降、Oracle TextのFILE_DATASTORE型は非推奨になりました。かわりに、DIRECTORY_DATASTOREを使用してください。

関連項目:

データ記憶域の詳細は、『Oracle Textリファレンス』を参照してください。

C.2 NULL_FILTER例: HTMLドキュメントの索引付け

ドキュメント・セット全体がHTMLである場合は、フィルタ・プリファレンスに(フィルタ処理を行わない) NULL_FILTERを使用することをお薦めします。

たとえば、HTMLドキュメント・セットを索引付けするには、NULL_FILTERおよびHTML_SECTION_GROUPに対するシステム定義プリファレンスを指定します。

create index myindex on docs(htmlfile) indextype is ctxsys.context 
  parameters('filter ctxsys.null_filter
  section group ctxsys.html_section_group');

C.3 PROCEDURE_FILTERの例

次のシグネチャを使用して定義するCTXSYS.NORMALIZEフィルタ・プロシージャを考えてみます。

PROCEDURE NORMALIZE(id IN ROWID, charset IN VARCHAR2, input IN CLOB, 
output IN OUT NOCOPY VARCHAR2);

このプロシージャをフィルタとして使用するには、フィルタ・プリファレンスを設定します。

begin
ctx_ddl.create_preference('myfilt', 'procedure_filter');
ctx_ddl.set_attribute('myfilt', 'procedure', 'normalize');
ctx_ddl.set_attribute('myfilt', 'input_type', 'clob');
ctx_ddl.set_attribute('myfilt', 'output_type', 'varchar2');
ctx_ddl.set_attribute('myfilt', 'rowid_parameter', 'TRUE');
ctx_ddl.set_attribute('myfilt', 'charset_parameter', 'TRUE');
end;

C.4 BASIC_LEXER例: printjoin文字の設定

printjoin文字は、索引トークンに組み込まれる英数字以外の文字を指します。vice-presidentのようなワードを、vice-presidentとして索引付けする場合に使用します。

次の例では、BASIC_LEXERを使用して、printjoin文字をハイフンとアンダースコアに設定します。

begin
ctx_ddl.create_preference('mylex', 'BASIC_LEXER');
ctx_ddl.set_attribute('mylex', 'printjoins', '_-');
end;

前述のように、printjoin文字を設定した索引を作成します。

create index myindex on mytable ( docs ) 
  indextype is ctxsys.context 
  parameters ( 'LEXER mylex' ); 

C.5 MULTI_LEXER例: マルチ言語表の索引付け

異なる言語のドキュメントを含む列を索引付けするには、MULTI_LEXERプリファレンス型を使用します。たとえば、テキスト列に英語、ドイツ語およびフランス語のドキュメントが格納されている場合は、このプリファレンス型を使用します。

最初のステップは、主キー、テキスト列および言語列を持つマルチ言語表を作成します:

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_attribute('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を使用して、英語のレクサーをデフォルトに設定します。

ctx_ddl.add_sub_lexer('global_lexer','default','english_lexer');

CTX_DDL.ADD_SUB_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');

PARAMETERS句にマルチレクサー・プリファレンスおよび言語列を指定して、globalx索引を作成します。

create index globalx on globaldoc(text) indextype is ctxsys.context
parameters ('lexer global_lexer language column lang');

C.6 BASIC_WORDLIST例: サブストリングとプリフィックスの索引付けの有効化

この例では、プリフィックスとサブストリングの索引付けに対してワードリスト・プリファレンスを設定してワイルドカード問合せのパフォーマンスを改善します。プリフィックス索引付けに対して、3から4文字の長さのトークン・プリフィックスを作成します。

begin 
ctx_ddl.create_preference('mywordlist', 'BASIC_WORDLIST'); 
ctx_ddl.set_attribute('mywordlist','PREFIX_INDEX','TRUE');
ctx_ddl.set_attribute('mywordlist','PREFIX_MIN_LENGTH', '3');
ctx_ddl.set_attribute('mywordlist','PREFIX_MAX_LENGTH', '4');
ctx_ddl.set_attribute('mywordlist','SUBSTRING_INDEX', 'YES');
end;

C.7BASIC_WORDLIST例: ワイルドカード索引の有効化

ワイルドカード索引付けでは、すべてのワイルドカード式について高速かつ効率的なワイルドカード検索をサポートします。

この例ではワードリスト・プリファレンスを作成し、ワイルドカード(K-gram)索引を有効にします。デフォルトでは、K-gramのK値は3です。

begin
     ctx_ddl.create_preference('mywordlist','BASIC_WORDLIST');
     ctx_ddl.set_attribute('mywordlist','WILDCARD_INDEX','TRUE');
end;

関連項目:

BASIC_WORDLIST属性表とWILDCARD_INDEXおよびWILDCARD_INDEX_K属性の詳細は、『Oracle Textリファレンス』を参照してください。