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_proxy
、no_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
を使用してください。
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リファレンス』を参照してください。