Oracle Textでは、Oracle Textの索引を作成および索引プリファレンスを指定するための、索引付け要素を提供します。この章では、Oracle Textの索引の作成に使用できる索引付け要素について説明します。
索引の作成にCREATE INDEX文を使用する場合、または索引の管理にALTER INDEX文を使用する場合は、オプションでパラメータ文字列に索引付けプリファレンス、ストップリストおよびセクション・グループを指定できます。
プリファレンス、ストップリストまたはセクション・グループを指定することによって、Oracle Textがテキストを索引付けする方法を1つずつ設定できます。
プリファレンス・クラス | 説明 |
---|---|
データストア | ドキュメントの保存方法 |
フィルタ | ドキュメントのプレーン・テキストへの変換方法 |
レクサー | 索引付けされる言語 |
ワードリスト | ステミング問合せおよびファジー問合せの拡張方法 |
記憶域 | 索引表の格納方法 |
ストップリスト | 索引付けしないワードまたはテーマ |
セクション・グループ | セクション内の問合せの使用可能化、およびドキュメント・セクションの定義方法 |
この章では、各プリファレンスの設定方法について説明します。オプションを使用可能にするには、この章で説明する型の1つを使用してプリファレンスを作成します。
たとえば、ドキュメントを外部ファイルに格納するように指定するには、FILE_DATASTORE型を使用してmydatastore
というデータストア・プリファレンスを作成できます。mydatastore
をデータストア・プリファレンスとしてCREATE
INDEX
文のPARAMETERS句に指定します。
データストア、レクサー、フィルタ、分類、ワードリストまたは記憶域プリファレンスを作成するには、CTX_DDL.CREATE_PREFERENCEプロシージャを使用し、この章で説明する型の1つを指定します。一部の型に対しては、CTX_DDL.SET_ATTRIBUTEプロシージャで属性も設定できます。
索引付けの型は、索引プリファレンスの作成に使用できる索引付けオブジェクトのクラスに名前を付けます。したがって、型は抽象IDですが、プリファレンスは型に対応するエンティティです。システム定義プリファレンスの多くには、型と同じ名前(例: BASIC_LEXER
)が付いていますが、正確な対応は保証されていません。たとえば、DEFAULT_DATASTORE
プリファレンスはDIRECT_DATASTORE
型を使用しますが、CHARSET_FILTER
型に対応するシステム・プリファレンスはありません。索引付けの型やシステム・プリファレンスの存在または性質を推測する場合には、注意が必要です。
CREATE
INDEX
文とALTER
INDEX
文で索引付けプリファレンスを指定します。索引付けプリファレンスにより、索引の作成方法が決定します。たとえば、レクサー・プリファレンスは、索引付けするテキストの言語を示します。独自のユーザー定義のプリファレンスを作成して指定したり、システム定義のプリファレンスを利用することもできます。
ストップリストを作成するには、CTX_DDL.CREATE_STOPLISTプロシージャを使用します。ストップリストにストップワードを追加するには、CTX_DDL.ADD_STOPWORD
を使用します。
セクション・グループを作成するには、CTX_DDL.CREATE_SECTION_GROUPを使用してセクション・グループの型を指定します。セクション・グループにセクションを追加するには、CTX_DDL.ADD_ZONE_SECTION
またはCTX_DDL.ADD_FIELD_SECTION
プロシージャを使用します。
データストア型を使用して、テキストの格納方法を指定します。データストア・プリファレンスを作成するには、表2-1で説明するデータストア型のうちいずれか1つを使用する必要があります。
表2-1 データストア型
データストア型 | 使用する場合 |
---|---|
|
データをテキスト列に内部的に格納する場合。各列が単一のドキュメントとして索引付けされます。 |
|
データをテキスト表の複数の列に格納する場合。列が連結され、各行に1つずつ仮想ドキュメントが作成されます。 |
|
データをテキスト列に内部的に格納する場合。ドキュメントがディテール表のテキスト列にある1つ以上の行で構成され、ヘッダー情報はマスター表に格納されます。 |
|
データをオペレーティング・システム・ファイルに外部的に格納する場合。ファイル名が、テキスト列の各行に1つずつ格納されます。 |
|
データをNESTED TABLEに格納する場合。 |
|
データをインターネットまたはイントラネット上にあるファイルに外部的に格納する場合。Uniform Resource Locator(URL)がテキスト列に格納されます。 |
|
ドキュメントが、索引付け時にユーザー定義ストアド・プロシージャによって合成されます。 |
テキスト列の各行にドキュメントが1つずつ直接格納されるテキストには、DIRECT_DATASTORE
型を使用します。DIRECT_DATASTORE
型には属性がありません。
CHAR
、VARCHAR
、VARCHAR2
、BLOB
、CLOB
、BFILE
、XMLType
およびURIType
の列型がサポートされています。
注意: 列がBFILE の場合、索引所有者は、BFILEs によって使用されるすべてのディレクトリに対して読取り権限を持っている必要があります。 |
次の例では、テキスト・データを格納するCLOB
列がある表を作成します。その後、2つの行にテキスト・データを移入し、システム定義プリファレンス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 direct_datastore example'); commit; create index myindex on mytable(docs) indextype is ctxsys.context parameters ('DATASTORE CTXSYS.DEFAULT_DATASTORE');
テキストが複数の列に格納されている場合は、MULTI_COLUMN_DATASTORE
データストアを使用します。索引付け時、システムはテキスト列を連結し、列テキストにタグ付けして、テキストを単一ドキュメントとして索引付けします。XMLに似たタグ付けはオプションです。バイナリ列をフィルタ処理して連結するように、システムを設定することもできます。
MULTI_COLUMN_DATASTORE
データストアには、表2-2に示す属性があります。
表2-2 MULTI_COLUMN_DATASTORE属性
索引付けには、CREATE
INDEX
文で指定するダミー列を作成する必要があります。この列の内容は、その列名が列属性で指定されていないかぎり、仮想ドキュメントの一部にはなりません。
索引は、ダミー列の更新時にのみ同期化されます。必要に応じて、変更内容を伝播するためにトリガーを作成できます。
XMLType
列を持つ複数列のデータストアは作成できません。MULTI_COLUMN_DATA_STORE
では、XMLType
はサポートされていません。第1章「Oracle TextのSQL文と演算子」で説明したように、XMLType
列にはCONTEXT
索引を作成できます。
次の例では、3つのテキスト列を持つmy_multi
という複数列のデータストア・プリファレンスを作成します。
begin
ctx_ddl.create_preference('my_multi', 'MULTI_COLUMN_DATASTORE'); ctx_ddl.set_attribute('my_multi', 'columns', 'column1, column2, column3');
end;
次の例では、複数列のデータストア・プリファレンスを作成して、bar
列がAUTO_FILTER
でフィルタ処理されることを示します。
ctx_ddl.create_preference('MY_MULTI','MULTI_COLUMN_DATASTORE'); ctx_ddl.set_attribute('MY_MULTI', 'COLUMNS','foo,bar'); ctx_ddl.set_attribute('MY_MULTI','FILTER','N,Y');
複数列のデータストアは、foo
列およびbar
列の内容をフェッチして、bar
をフィルタ処理し、複合ドキュメントを次のように構成します。
<FOO> foo contents </FOO> <BAR> bar filtered contents (probably originally HTML) </BAR>
Nフラグを指定する必要はありません。また、列ごとにフラグを設定する必要もありません。適用する列を示すカンマを付けて、Yフラグのみを指定してください。次に例を示します。
ctx_ddl.create_preference('MY_MULTI','MULTI_COLUMN_DATASTORE'); ctx_ddl.set_attribute('MY_MULTI', 'COLUMNS','foo,bar,zoo,jar'); ctx_ddl.set_attribute('MY_MULTI','FILTER',',,Y');
これにより、列zoo
のみがフィルタ処理されます。
索引付け時、列ごとに仮想ドキュメントが作成されます。仮想ドキュメントは、リスト順に連結され自動的に列名タグが追加された列の内容で構成されています。次に例を示します。
create table mc(id number primary key, name varchar2(10), address varchar2(80)); insert into mc values(1, 'John Smith', '123 Main Street'); exec ctx_ddl.create_preference('mymds', 'MULTI_COLUMN_DATASTORE'); exec ctx_ddl.set_attibute('mymds', 'columns', 'name, address');
これによって、次の仮想テキストが索引付けのために作成されます。
<NAME> John Smith </NAME> <ADDRESS> 123 Main Street </ADDRESS>
システムでは、タグ自体は無視して、タグで囲まれたテキストを索引付けします。
タグをセクションとして索引付けするには、オプションで、BASIC_SECTION_GROUP
を使用してフィールド・セクションを作成できます。
注意: MULTI_COLUMN_DATASTORE を使用した場合、セクション・グループは作成されません。これらのタグに対してセクションを作成するには、セクション・グループを作成する必要があります。 |
式またはファンクションを使用する場合、列別名が使用されていないかぎり、タグは使用する式の最初の30文字で構成されます。
たとえば、次の式を使用するとします。
exec ctx_ddl.set_attibute('mymds', 'columns', '4 + 17');
次の仮想テキストが生成されます。
<4 + 17> 21 </4 + 17>
次の式を使用するとします。
exec ctx_ddl.set_attibute('mymds', 'columns', '4 + 17 col1');
次の仮想テキストが生成されます。
<col1> 21 <col1>
列名または列別名が小文字で二重引用符で囲まれていないかぎり、タグは大文字になります。次に例を示します。
exec ctx_ddl.set_attibute('mymds', 'COLUMNS', 'foo');
次の仮想テキストが生成されます。
<FOO> content of foo </FOO>
小文字のタグを生成するには、次のようにします。
exec ctx_ddl.set_attibute('mymds', 'COLUMNS', 'foo "foo"');
この式によって、次のタグが生成されます。
<foo> content of foo </foo>
データベースのディテール表に直接格納されているテキストには、DETAIL_DATASTORE
型を使用します。この場合、マスター表に索引付けされたテキスト列があります。
DETAIL_DATASTORE
型には、表2-3に示す属性があります。
表2-3 DETAIL_DATASTORE属性
属性 | 属性値 |
---|---|
Oracle Textに Oracle Textに |
|
ディテール表の名前(必要な場合は |
|
ディテール表の外部キー列の名前を指定します。 |
|
ディテール表の順序列の名前を指定します。 |
|
ディテール表のテキスト列の名前を指定します。 |
ディテール表が変更された場合、索引の同期化時に再索引付け操作はトリガーされません。マスター表の索引付けされた列が変更された場合のみ、索引の同期化時に再索引付け操作がトリガーされます。
ディテール表にトリガーを作成すると、マスター表の行の索引付けされた列に変更内容を伝播できます。
この例では、マスター表およびディテール表が互いにどのように関連しているかを示します。
マスター表は、マスター/ディテールの関係にあるドキュメントを定義します。各ドキュメントに識別番号を割り当てます。次の表は、my_master
というマスター表の例です。
列名 | 列型 | 説明 |
---|---|---|
article_id |
NUMBER |
各ドキュメントに一意のドキュメントID(主キー) |
author |
VARCHAR2(30) |
ドキュメントの作成者 |
title |
VARCHAR2(50) |
ドキュメントのタイトル |
body |
CHAR(1) |
CREATE INDEX 内で指定するダミー列 |
注意: DETAIL_DATASTORE 型を使用する場合は、マスター表に主キー列を組み込む必要があります。 |
ディテール表にはドキュメントのテキストがあり、通常、その内容はいくつかの行に分散して格納されます。次のディテール表my_detail
は、article_id
列でマスター表my_master
と関連しています。この列によって、各ディテール表の行(サブドキュメント)が属するマスター・ドキュメントを識別します。
列名 | 列型 | 説明 |
---|---|---|
article_id |
NUMBER |
マスター表に関連するドキュメントID |
seq |
NUMBER |
article_id で定義されるマスター表のドキュメント順序 |
text |
VARCHAR2 |
ドキュメント・テキスト |
この例で、DETAIL_DATASTORE
属性には次の値が指定されます。
属性 | 属性値 |
---|---|
binary |
TRUE |
detail_table |
my_detail |
detail_key |
article_id |
detail_lineno |
seq |
detail_text |
text |
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;
このマスター/ディテールの関係で定義されたドキュメントを索引付けするには、CREATE
INDEX
文でマスター表の列を指定します。指定する列は、許容される型のいずれかである必要があります。
この例ではbody
列を使用します。この列には、マスター/ディテールの索引の作成を可能にし、コードの可読性を向上させる機能があります。my_detail_pref
プリファレンスは、必要な属性でDETAIL_DATASTORE
に設定されます。
CREATE INDEX myindex on my_master(body) indextype is ctxsys.context parameters('datastore my_detail_pref');
この例では、title
またはauthor
列を指定して索引を作成することもできます。ただし、これを指定すると、これらの列が変更された場合に、索引の再作成操作がトリガーされます。
FILE_DATASTORE
型は、ローカル・ファイル・システム上のファイルに格納されているテキストに使用します。
注意: FILE_DATASTORE 型は、特定のタイプのリモート・マウント・ファイル・システムでは機能しないことがあります。 |
FILE_DATASTORE
型には、表2-4に示す属性があります。
ファイル・システムに外部的に格納されたファイルのフル・ディレクトリ・パス名を指定します。このようにフル・ディレクトリ・パスを指定する場合、テキスト列に組み込む必要があるのはファイル名のみです。
path
属性には複数のパスを指定できます(パスは、UNIXの場合はコロン(:)、Windowsの場合はセミコロン(;)で区切ります)。ファイル名は、テキスト表のテキスト列に格納されます。
この属性を使用して外部ファイルのパスを指定しない場合、テキスト列にあるファイル名にパスを組み込む必要があります。
ファイル名を変換するためにファイル・データストアで使用する、有効なOracleキャラクタ・セット名(30文字以内)を指定します。通常、Oracle Databaseでは、オペレーティング・システムとは異なるキャラクタ・セットを使用できます。このため、索引付けされた列にオペレーティング・システムのキャラクタ・セットに変換できない文字が含まれている場合は、ファイルの検索で問題が発生する(DRG-11513エラーが発生する)可能性があります。デフォルトでは、ファイル・データストアはファイル名をWE8ISO8859p1(ASCIIプラットフォームの場合)またはWE8EBCDIC1047(EBCDICプラットフォームの場合)に変換します。
ただし、WE8ISO8859p1およびWE8EBCDIC1047ではマルチバイト文字がサポートされていないため、データベースとオペレーティング・システムの両方でマルチバイト・キャラクタ・セットを使用するアプリケーションについては、これでは対応できない場合があります。filename_charset
属性によってこの問題を解決します。この属性を指定すると、データストアはデータベース・キャラクタ・セットを、ISO8859またはEBCDICではなく、指定のキャラクタ・セットに変換します。
filename_charset
属性がデータベース・キャラクタ・セットと同じ場合は、そのファイル名がそのまま使用されます。filename_charset
が有効なキャラクタ・セットでない場合は、エラー「DRG-10763: 値%sは有効なキャラクタ・セットではありません」が発生します。
PATH
属性には、次の制限事項があります。
PATH
属性を指定した場合、索引付けされた列では単純なファイル名のみ使用できます。ファイル名の一部としてPATH
属性をパスと結合することはできません。ファイルが複数のフォルダまたはディレクトリに存在する場合、PATH
属性を設定せずに、索引付けされた列にPATH
を含む完全なファイル名を指定する必要があります。
Windowsシステムでは、ファイルはローカル・ドライブに配置する必要があります。リモート・ドライブがローカル・ドライブ文字にマップされているかどうかに関係なく、ファイルをリモート・ドライブに配置することはできません。
ファイル・データストアおよびURLデータストアを使用すると、実際のデータベース・ディスク上のファイルにアクセスできます。Oracleユーザーがアクセス可能なファイル・システムをすべてのユーザーが参照できるため、これは、セキュリティが重要な場合は望ましくありません。FILE_ACCESS_ROLE
システム・パラメータを使用すると、FILE
またはURL
データストアを使用して索引を作成する権限のあるデータベース・ロールの名前を設定できます。データベース・ロールを設定すると、FILE
またはURL
データストアを使用して索引を作成しようとするユーザーはこのロールが必要になり、このロールを持たないユーザーは索引の作成に失敗します。SYS
だけがFILE_ACCESS_ROLE
を設定できます。他のユーザーが変更しようとすると、エラーが発生します。FILE_ACCESS_ROLE
がデフォルトのNULLの場合、アクセスできません。したがって、デフォルトで、ユーザーはファイルまたはURLデータストアを使用する索引を作成できません。以前のリリースの動作を保存する場合、ユーザーは必要に応じてFILE_ACCESS_ROLE
をPUBLIC
に設定できます。
たとえば、次の文でデータベース・ロールの名前を設定します。
ctx_adm.set_parameter('FILE_ACCESS_ROLE','TOPCAT');
TOPCATは、ファイル・データストアまたはURLデータストアを使用して索引を作成する権限があるロールです。権限が付与されたロールを持たないユーザーがファイル・データストアまたはURLデータストアを使用して索引を作成しようとすると、CREATE
INDEX
操作は失敗します。次に例を示します。
CREATE INDEX myindex ON mydocument(TEXT) INDEXTYPE IS ctxsys.context PARAMETERS('DATASTORE ctxsys.file_datastore')
ここで、ユーザーがTOPCATロールを持たない場合は、索引作成が失敗してエラーが戻されます。ユーザーがTOPCATロールを持っている場合、索引作成は通常どおり処理されます。
データストアにアクセスするたびに、権限が付与されたロール名がチェックされます。これには、索引の作成、索引の同期化、CTX_DOC.HIGHLIGHT
などのドキュメント・サービスの呼出しが含まれます。
この例では、パス/mydocs
を持つCOMMON_DIR
というファイル・データストア・プリファレンスを作成します。
begin ctx_ddl.create_preference('COMMON_DIR','FILE_DATASTORE'); ctx_ddl.set_attribute('COMMON_DIR','PATH','/mydocs'); end;
mytable
表にデータを移入する場合、テキスト列にはファイル名の挿入のみが必要となります。path属性によって、索引付け操作中に検索する場所がシステムに示されます。
create table mytable(id number primary key, docs varchar2(2000)); insert into mytable values(111555,'first.txt'); insert into mytable values(111556,'second.txt'); commit;
次のように索引を作成します。
create index myindex on mytable(docs) indextype is ctxsys.context parameters ('datastore COMMON_DIR');
次のファイルに格納されるテキストには、URL_DATASTORE
型を使用します。
HTTPまたはFTPを使用してアクセスするWorld Wide Web上のファイル
ファイル・プロトコルを使用してアクセスするローカル・ファイル・システム内のファイル
各URLを単一のテキスト・フィールドに格納します。
テキスト・フィールドに格納するURLの構文は、次のとおりです(カッコ内は、オプションのパラメータです)。
[URL:]<access_scheme>://<host_name>[:<port_number>]/[<url_path>]
access_scheme
文字列は、ftp、httpまたはfileのいずれかです。次に例を示します。
http://mymachine.example.com/home.html
注意: login:password@ 構文がURL内でサポートされるのは、FTPアクセス・スキームの場合のみです。 |
この構文はRFC1738仕様に部分的に適合しているため、次の制限がURLの構文に適用されます。URLには、印字可能なASCII文字のみが含まれる必要があります。印字できないASCII文字およびマルチバイト文字は、%xx表記法でエスケープする必要があります。このxxは特殊文字の16進コードを表します。
URL_DATASTORE
には次の属性があります。
表2-5 URL_DATASTORE属性
属性 | 属性値 |
---|---|
|
この属性の値は無視されます。これは下位互換性の目的で提供されています。 |
|
この属性の値は無視されます。 |
|
この属性の値は無視されます。これは下位互換性の目的で提供されています。 |
|
この属性の値は無視されます。これは下位互換性の目的で提供されています。 |
|
この属性の値は無視されます。これは下位互換性の目的で提供されています。 |
|
HTTPプロキシ・サーバーのホスト名を指定します。オプションで、 |
|
FTPプロキシ・サーバーのホスト名を指定します。オプションで、 |
|
非プロキシ・サーバーのドメインを指定します。カンマで区切られた文字列を使用して、最大16個のドメイン名が指定できます。 |
この属性の値は無視されます。これは下位互換性の目的で提供されています。
この属性の値は無視されます。URL_DATASTORE
はシングル・スレッドです。これは下位互換性の目的で提供されています。
この属性の値は無視されます。これは下位互換性の目的で提供されています。
この属性の値は無視されます。これは下位互換性の目的で提供されています。
この属性の値は無視されます。これは下位互換性の目的で提供されています。
Oracle TextがインストールされているマシンのHTTPプロキシ(ゲートウェイ)として機能するホスト・マシンの完全修飾名を指定します。オプションで、hostname:port
という形式でコロンを使用してポート番号を指定できます。
この属性の設定が必要なのは、ファイアウォールの外側にあるWebファイルにアクセスするためにプロキシ・サーバーによる認証が必要なイントラネット上にマシンがある場合です。
Oracle TextがインストールされているサーバーのFTPプロキシ(ゲートウェイ)として機能するホスト・マシンの完全修飾名を指定します。オプションで、hostname:port
という形式でコロンを使用してポート番号を指定できます。
この属性の設定が必要なのは、ファイアウォールの外側にあるWebファイルにアクセスするためにプロキシ・サーバーによる認証が必要なイントラネット上にマシンがある場合です。
イントラネット上のマシンのほとんどすべてにあるドメイン文字列(16個以内、カンマで区切られている)を指定します。ドメインの1つがホスト名内で検出されると、ftp_proxy
およびhttp_proxy
に指定されたサーバーには要求が送られません。かわりに、要求は、URL内で指定されたホスト・マシンによって直接処理されます。
たとえば、no_proxy
にus.example.comまたはuk.example.comという文字列を指定した場合、ホスト名にこのドメインのいずれかが含まれているマシンへのすべてのURL要求は、プロキシ・サーバーでは処理されません。
ファイル・データストアおよびURLデータストアのファイル・アクセス・セキュリティを制御する方法については、「FILE_DATASTOREとセキュリティ」を参照してください。
この例では、URL_PREF
というURL_DATASTORE
プリファレンスを作成します。このプリファレンスには、http_proxy
、no_proxy
およびtimeout
属性を設定します。属性を設定しない場合は、デフォルトが使用されます。
begin ctx_ddl.create_preference('URL_PREF','URL_DATASTORE'); ctx_ddl.set_attribute('URL_PREF','HTTP_PROXY','www-proxy.example.com'); ctx_ddl.set_attribute('URL_PREF','NO_PROXY','example.com'); ctx_ddl.set_attribute('URL_PREF','Timeout','300'); end;
表を作成し、その表に値を挿入します。
create table urls(id number primary key, docs varchar2(2000)); insert into urls values(111555,'http://context.example.com'); insert into urls values(111556,'http://www.sun.com'); commit;
索引を作成するには、データストアとしてURL_PREF
を指定します。
create index datastores_text on urls ( docs ) indextype is ctxsys.context parameters ( 'Datastore URL_PREF' );
USER_DATASTORE
型を使用して、索引付け時にドキュメントを合成するストアド・プロシージャを定義します。たとえば、ユーザー・プロシージャによって、1つのドキュメント内に作成者、日付およびテキスト列を合成することで、作成者と日付の情報を索引付けされるドキュメントの一部にすることもできます。
USER_DATASTORE
には次の属性があります。
表2-6 USER_DATASTORE属性
属性 | 属性値 |
---|---|
|
索引付けされるドキュメントを合成するプロシージャを指定します。 このプロシージャは、任意のユーザーが所有し、索引所有者が実行できる必要があります。 |
|
procedureへの2つ目の引数のデータ型を指定します。有効な値は、
|
索引付けされるドキュメントを合成するプロシージャ名を指定します。この指定は、PROCEDURENAME
またはPACKAGENAME.PROCEDURENAME
の形式である必要があります。スキーマの所有者名を指定することもできます。
指定するプロシージャには、次のように定義された2つの引数が必要です。
procedure (r IN ROWID, c IN OUT NOCOPY output_type)
1つ目の引数rは、ROWID
型にしてください。2つ目の引数cは、output_type
型である必要があります。NOCOPYは、可能な場合は参照によってパラメータcを渡すようにOracle Textに指示する、コンパイラ・ヒントです。
注意: プロシージャ名およびその引数には、どのような名前でも付けることができます。この例では、説明を単純にするために、rおよびcという引数を使用しています。 |
ストアド・プロシージャは、索引付けされる行ごとに1回コールされます。現在行のROWIDが引数として渡されるたびに、procedure
は、ドキュメントのテキストを2つ目の引数(output_type
で指定)に書き込む必要があります。
次の制約が、procedure
に適用されます。
すべてのユーザーが所有できますが、そのユーザーには、procedure
を正しく実行するデータベース権限が必要です。
索引所有者が実行できる必要があります。
COMMIT
のようなトランザクション制御文またはDDLは入力できません。
ストアド・プロシージャを変更または編集する場合、そのプロシージャをベースにしている索引には通知されないため、このような索引を手動で再作成する必要があります。ストアド・プロシージャが他の列を使用し、その列の値が変更された場合、行は再索引付けされません。行が再索引付けされるのは、索引列が変更されたときのみです。
次のように定義されたarticles
表のように、作成者、タイトルおよびテキスト・フィールドが分割されている表を考えます。
create table articles( id number, author varchar2(80), title varchar2(120), text clob );
作成者フィールドおよびタイトル・フィールドは、索引付けドキュメントのテキストの一部になります。ユーザーappowner
が、ユーザー・データストア・インタフェースでテキスト、作成者およびタイトル・フィールドからドキュメントを合成するストアド・プロシージャを作成するとします。
create procedure myproc(rid in rowid, tlob in out clob nocopy) is begin for c1 in (select author, title, text from articles where rowid = rid) loop
dbms_lob.writeappend(tlob, length(c1.title), c1.title); dbms_lob.writeappend(tlob, length(c1.author), c1.author); dbms_lob.writeappend(tlob, length(c1.text), c1.text);
end loop; end;
このプロシージャは、ROWIDおよび一時CLOB
ロケータを取得し、すべての列を一時CLOB
に連結します。forループは1回のみ実行されます。
ユーザーappowner
は、次のようにプリファレンスを作成します。
begin
ctx_ddl.create_preference('myud', 'user_datastore'); ctx_ddl.set_attribute('myud', 'procedure', 'myproc'); ctx_ddl.set_attribute('myud', 'output_type', 'CLOB');
end;
appowner
が、このプリファレンスを使用して索引をarticles(text)
に作成する場合、索引付け操作では、ドキュメント・テキストにある作成者およびタイトルが参照されます。
次のプロシージャは、OUTPUT_TYPE
BLOB_LOC
で使用できます。
procedure myds(rid in rowid, dataout in out nocopy blob) is l_dtype varchar2(10); l_pk number; begin select dtype, pk into l_dtype, l_pk from mytable where rowid = rid; if (l_dtype = 'MOVIE') then select movie_data into dataout from movietab where fk = l_pk; elsif (l_dtype = 'SOUND') then select sound_data into dataout from soundtab where fk = l_pk; end if; end;
ユーザーappowner
は、次のようにプリファレンスを作成します。
begin
ctx_ddl.create_preference('myud', 'user_datastore'); ctx_ddl.set_attribute('myud', 'procedure', 'myproc'); ctx_ddl.set_attribute('myud', 'output_type', 'blob_loc');
end;
NESTED_DATASTORE型は、NESTED TABLEに行として格納されているドキュメントを索引付けするために使用します。
表2-7 NESTED_DATASTORE属性
属性 | 属性値 |
---|---|
NESTED TABLE列の名前を指定します。この属性は必須です。列名のみを指定します。スキーマ所有者または格納表の名前は指定しないでください。 |
|
NESTED TABLEの型を指定します。この属性は必須です。所有者名および型を指定する必要があります。 |
|
行を順序付けする、NESTED TABLE内の属性名を指定します。これは、ディテール・データストアの |
|
行のテキストを含むNESTED TABLE型内の列名を指定します。これは、ディテール・データストアの |
|
|
NESTED TABLEデータストアを使用する場合、拡張索引作成機能フレームワークではNESTED TABLE列の索引付けが禁止されているため、ダミー列を索引付けする必要があります。例を参照してください。
NESTED TABLEのDMLは、索引付けに使用されたダミー列には自動的に伝播されません。NESTED TABLEのDMLをダミー列に伝播するには、アプリケーション・コードまたはトリガーによって、ダミー列を明示的に更新する必要があります。
索引に対するフィルタのデフォルトは、nested_text
列の型によって異なります。
妥当性チェックの間に、その型が存在するかどうか、およびnested_lineno
とnested_text
に対して指定した属性がNESTED TABLE型に存在するかどうかがOracle Textによりチェックされます。指定されたNESTED TABLE列が索引付けされた表に存在するかどうかはチェックされません。
この項では、NESTED_DATASTORE
型を使用して、NESTED TABLEの行として格納されたドキュメントを索引付けする例を示します。
次のコードは、NESTED TABLEおよびNESTED TABLEの記憶表mytabを作成します。
create type nt_rec as object ( lno number, -- line number ltxt varchar2(80) -- text of line ); create type nt_tab as table of nt_rec; create table mytab ( id number primary key, -- primary key dummy char(1), -- dummy column for indexing doc nt_tab -- nested table ) nested table doc store as myntab;
次のコードは、NESTED TABLEの親行で、IDが1であるものに値を挿入します。
insert into mytab values (1, null, nt_tab()); insert into table(select doc from mytab where id=1) values (1, 'the dog'); insert into table(select doc from mytab where id=1) values (2, 'sat on mat '); commit;
次のコードは、NESTED TABLE型nt_tab
および親表mytab
の定義に従って、NESTED_DATASTORE
にプリファレンスおよび属性を設定します。
begin -- create nested datastore pref ctx_ddl.create_preference('ntds','nested_datastore'); -- nest tab column in main table ctx_ddl.set_attribute('ntds','nested_column', 'doc'); -- nested table type ctx_ddl.set_attribute('ntds','nested_type', 'scott.nt_tab'); -- lineno column in nested table ctx_ddl.set_attribute('ntds','nested_lineno','lno'); --text column in nested table ctx_ddl.set_attribute('ntds','nested_text', 'ltxt'); end;
フィルタ型を使用して、ドキュメントをフィルタ処理して索引付けテキスト文字列を取得するためのプリファレンスを作成します。フィルタ処理によって、ワード・プロセッサ形式のドキュメント、形式設定されたドキュメント、プレーン・テキスト、HTMLおよびXMLドキュメントの索引付けができるようになります。
形式設定されたドキュメントについては、ドキュメントをその固有の形式で格納した後、フィルタを使用してそのドキュメントの一時的なプレーン・テキストまたはHTML形式を作成します。Oracle Textにより、プレーン・テキストまたはHTMLで形式設定されたドキュメントから導出されたワードが索引付けされます。
フィルタ・プリファレンスを作成するには、次の型のうちいずれか1つを使用する必要があります。
表2-8 フィルタ型
フィルタ | 使用される場合 |
---|---|
|
キャラクタ・セット変換フィルタです。 |
|
形式設定されたドキュメントのフィルタ処理用Autoフィルタです。 |
|
フィルタ処理は必要ありません。プレーン・テキスト、HTMLまたはXMLドキュメントの索引付けに使用します。 |
|
|
|
カスタム・フィルタ処理に使用するユーザー定義外部フィルタです。 |
|
カスタム・フィルタ処理に使用するユーザー定義ストアド・プロシージャ・フィルタです。 |
CHARSET_FILTER
を使用して、非データベース・キャラクタ・セットからデータベースで使用されるキャラクタ・セットにドキュメントを変換します。
CHARSET_FILTER
には、表2-9に示す属性があります。
表2-9 CHARSET_FILTER属性
属性 | 属性値 |
---|---|
変換元キャラクタ・セットのグローバリゼーション・サポート名を指定します。 UTF16AUTOを設定すると、このフィルタは、キャラクタ・セットの設定がUTF16 big-endianであるか、little-endianであるかを自動的に識別します。 日本語キャラクタ・セットの自動識別にはJAAUTOを指定します。このフィルタは、JA16EUCまたはJA16SJISのカスタム文字仕様を自動的に識別し、データベース・キャラクタ・セットに変換します。このフィルタは、データ・ファイルにキャラクタ・セットが混在する場合の日本語に有効です。 JAAUTOは、JA16EUC、JA16SJIS、UTF8などのキャラクタ・セットを使用するデータベースにのみ指定できます。 Oracle Databaseがサポートするキャラクタ・セット(表2-10を参照)を |
charset
列または属性をAUTO
に設定すると、CHARSET_FILTER
は、ドキュメントのキャラクタ・セットを自動的に識別し、識別したキャラクタ・セットからデータベース・キャラクタ・セットにドキュメントを変換します。表2-10に、CHARSET_FILTER
で識別でき、サポートされているキャラクタ・セットを示します。
表2-10 CHARSET_FILTERの自動識別でサポートされているキャラクタ・セット
キャラクタ・セット | |
---|---|
AL16UTF16 |
JA16EUC |
AL32UTF8 |
JA16SJIS |
AR8ISO8859P6 |
KO16KSC5601 |
AR8MSWIN1256 |
TH8TISASCII |
CL8ISO8859P5 |
WE8ISO8859P1 |
CL8KOI8R |
WE8ISO8859P9 |
CL8MSWIN1251 |
WE8MSWIN1252 |
EE8ISO8859P2 |
ZHS16CGB231280 |
EE8MSWIN1250 |
ZHS32GB18030 |
EL8ISO8859P7 |
ZHT16BIG5 |
EL8MSWIN1253 |
WE8MSWIN1252 |
関連項目: サポートされているグローバリゼーション・キャラクタ・セットの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。 |
キャラクタ・セットがUTF-16の場合、UTF16AUTOを指定するとbig-endianまたはlittle-endianデータを自動的に識別できます。Oracle Textでは、ドキュメント行の最初の2バイトを調べて、自動識別を実行します。
最初の2バイトが0xFE、0xFFの場合、そのドキュメントはbig-endianと認識され、この2バイトを除いた残りのドキュメントが索引付けのために渡されます。
最初の2バイトが0xFF、0xFEの場合、そのドキュメントはlittle-endianと認識され、この2バイトを除いた残りのドキュメントが索引付けのために渡されます。
最初の2バイトがそれ以外の場合、そのドキュメントはbig-endianとみなされ、最初の2バイトを含むドキュメント全体が索引付けのために渡されます。
複合キャラクタ・セット列は、異なるキャラクタ・セットを持つドキュメントを格納する列です。たとえば、1つのテキスト表に、WE8ISO8859P1のドキュメントとUTF8のドキュメントが格納されていることがあります。
異なるキャラクタ・セットのドキュメントを持つ表を索引付けするには、キャラクタ・セット列を持つ元表を作成する必要があります。この列では、ドキュメントのキャラクタ・セットを行ごとに指定します。ドキュメントは、Oracle Textによりデータベース・キャラクタ・セットに変換され、索引付けされます。
キャラクタ・セット変換は、CHARSET_FILTER
で機能します。キャラクタ・セット列がNULL
、または認識されない場合、Oracle Textにより変換元キャラクタ・セットは、charset属性に指定されたものの1つとみなされます。
注意: ドキュメント・フォーマット列がTEXT に設定されている場合、キャラクタ・セット変換はAUTO_FILTER でも機能します。 |
キャラクタ・セット列を持つ表を、次のように作成するとします。
create table hdocs ( id number primary key, fmt varchar2(10), cset varchar2(20), text varchar2(80) );
このフィルタのプリファレンスを作成します。
begin cxt_ddl.create_preference('cs_filter', 'CHARSET_FILTER'); ctx_ddl.set_attribute('cs_filter', 'charset', 'UTF8'); end; /
プレーン・テキストのドキュメントを挿入し、キャラクタ・セット名を指定します。
insert into hdocs values(1, 'text', 'WE8ISO8859P1', '/docs/iso.txt'); insert into hdocs values (2, 'text', 'UTF8', '/docs/utf8.txt'); commit;
索引を作成し、キャラクタ・セット列を指定します。
create index hdocsx on hdocs(text) indextype is ctxsys.context parameters ('datastore ctxsys.file_datastore filter cs_filter format column fmt charset column cset');
AUTO_FILTER
は、PDFおよびMicrosoft Wordのドキュメントを含む、ほとんどのドキュメント形式をフィルタ処理する汎用フィルタです。単一書式および複合書式の両方の列の索引付けに使用します。このフィルタは、プレーン・テキスト、HTML、XHTML、SGMLおよびXMLドキュメントを自動的にバイパスします。
AUTO_FILTER
プリファレンスには次の属性があります。
表2-11 AUTO_FILTER属性
属性 | 属性値 |
---|---|
|
この待機時間がどのように使用されるかは、 この機能は、行に対応しているキャラクタ・セット列やフォーマット列によって この機能を使用して、Oracle Textの索引付け操作が停止中のフィルタ操作を無制限に待機するのを回避します。 |
|
Outside In HTML Exportによる出力が増加した場合に、すべての フィルタ処理が正常に進行中か停止中かに関係なく、 |
|
この属性を設定しても、フィルタのパフォーマンスまたはフィルタの出力に影響はありません。下位互換性の目的でのみ保持されています。 |
Microsoft Wordなどの形式設定されたドキュメントを含むテキスト列を索引付けするには、AUTO_FILTER
を使用します。このフィルタは、ドキュメント形式を自動的に検出します。CTXSYS
.AUTO_FILTER
システム定義プリファレンスを、PARAMETERS句で次のように使用できます。
create index hdocsx on hdocs(text) indextype is ctxsys.context parameters ('datastore ctxsys.file_datastore filter ctxsys.auto_filter');
複合フォーマット列は、複数のドキュメント形式を含むテキスト列です。これには、Microsoft Word、PDF、プレーン・テキストおよびHTMLドキュメントを含む列などがあります。
AUTO_FILTER
によって、複合フォーマット列を索引付けして、プレーン・テキスト、HTMLおよびXML文書を自動的にバイパスできます。ただし、組込みのバイパス・メカニズムを使用しない場合は、行をテキストとして明示的にタグ付けし、AUTO_FILTER
がその行を無視して、ドキュメントを処理しないように指定できます。
元表内のフォーマット列では、テキスト列に含まれるドキュメントのタイプを指定できます。指定できるドキュメント・タイプは、TEXT
、BINARY
およびIGNORE
です。索引付け中に、AUTO_FILTER
は、TEXT
と指定されたすべてのドキュメントを無視します(キャラクタ・セット列が指定されていない場合)。(TEXT
フォーマット列タイプのドキュメントとIGNORE
タイプのドキュメントの相違点は、TEXT
ドキュメントは索引付けされてフィルタには無視されるのに対し、IGNORE
ドキュメントはまったく索引付けされない点です。IGNORE
を使用すると、イメージ・ファイルなどのドキュメントまたは索引付けしない言語のドキュメントが無視されます。IGNORE
はどのフィルタ・タイプにも使用できます。)
AUTO_FILTER
のバイパス・メカニズムを設定するには、元表にフォーマット列を作成する必要があります。
次に例を示します。
create table hdocs ( id number primary key, fmt varchar2(10), text varchar2(80) );
主にWordドキュメントを索引付けすると想定すると、Wordドキュメントをフィルタするために、フォーマット列にBINARY
を指定します。一方、AUTO_FILTER
にHTMLドキュメントを無視させるには、フォーマット列にTEXT
を指定します。
たとえば、次の文によってテキスト表に2つのドキュメントを追加し、1つのドキュメントの形式にBINARY
を、もう1つのドキュメントの形式にTEXT
を割り当てるとします。
insert into hdocs values(1, 'binary', '/docs/myword.doc'); insert in hdocs values (2, 'text', '/docs/index.html'); commit;
索引を作成するには、CREATE
INDEX
を使用して、パラメータ文字列にフォーマット列名を指定します。
create index hdocsx on hdocs(text) indextype is ctxsys.context parameters ('datastore ctxsys.file_datastore filter ctxsys.auto_filter format column fmt');
フォーマット列にTEXT
またはBINARY
を指定しない場合は、BINARY
が使用されます。
注意: AUTO_FILTER を使用する場合は、CREATE INDEX にフォーマット列を指定する必要はありません。 |
ドキュメント形式列がTEXT
に設定されている場合、AUTO_FILTER
はドキュメントをデータベース・キャラクタ・セットに変換します。この場合、AUTO_FILTER
はキャラクタ・セット列を検索して、ドキュメントのキャラクタ・セットを判断します。
キャラクタ・セット列値がOracle Textキャラクタ・セット名でない場合、ドキュメントはキャラクタ・セット変換なしで渡されます。
注意: AUTO_FILTER を使用している場合は、キャラクタ・セット列を指定する必要はありません。 |
キャラクタ・セット列を指定して、フォーマット列を指定しない場合、AUTO_FILTER
はCHARSET_FILTERのように機能します。ただし、この場合、日本語キャラクタ・セットの自動識別は行われません。
NULL_FILTER
型は、プレーン・テキストまたはHTMLが索引付けされ、フィルタ処理を行う必要がない場合に使用します。NULL_FILTER
には属性がありません。
ドキュメント・セット全体が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');
MAIL_FILTER
を使用して、RFC-822、RFC-2045メッセージを索引付け可能なテキストに変換します。入力には、次の制限事項が適用されます。
ドキュメントはUS-ASCIIである必要があります。
行の長さは1024バイト以内にする必要があります。
RFC-822については、ドキュメントは構文的に有効にする必要があります。
無効な入力に対する動作は定義されていません。逸脱すると、フィルタによってエラーなしで確実に処理される場合もあります。フェッチ時またはフィルタ時にエラーが発生することもあります。
MAIL_FILTER
には次の属性があります。
表2-12 MAIL_FILTER属性
属性 | 属性値 |
---|---|
|
出力に保持するフィールドのコロンで区切られたリストを指定します。これらのフィールドは、タグ・マークアップに変換されます。
次のように変換されます。
トップレベルのフィールドのみがこのように変換されます。 |
|
メール・フィルタによって起動される |
|
この属性は以前の |
|
可能な値は、 |
このフィルタは、ドキュメントごとに次のように動作します。
ヘッダー・フィールドの読取りおよび削除
Content-transfer-encodingフィールドの値によって、メッセージ本文のデコード(必要に応じて)
メール・フィルタ構成ファイルで指定されたContent-Typeフィールドの値、およびユーザー指定の動作によって、処理を実行します。(「メール・フィルタ構成ファイル」を参照してください。)有効な処理は、次のとおりです。
出力テキストの本文を作成します(INCLUDE
)。キャラクタ・セットがContent-Typeヘッダー・フィールドのINCLUDE
部分にない場合は、元表のキャラクタ・セット列で指定する値にデフォルト設定されます。作成したキャラクタ・セット列をCREATE
INDEX
コマンドのパラメータ文字列で指定します。
AUTO_FILTER
で本文の内容をフィルタ処理します(AUTO_FILTER
ディレクティブ)。
出力テキストから本文の内容を削除します(IGNORE
)。
構成ファイルの型に動作が指定されていない場合、デフォルトは次のとおりです。
text/*: 出力テキストの本文を作成します。
application/*: AUTO_FILTER
で本文の内容をフィルタ処理します。
image/*、audio/*、video/*、model/*: 無視されます。
マルチパート・メッセージが解析され、メール・フィルタが各パートに再帰的に適用されます。各パートが出力に追加されます。
作成されたテキストはすべて、必要に応じてデータベース・キャラクタ・セットにキャラクタ・セット変換されます。
MAIL_FILTER
フィルタは、メール・ドキュメントのフィルタ処理の方法を指定するディレクティブを含む、メール・フィルタ構成ファイルを使用します。メール・フィルタ構成ファイルは、編集可能なテキスト・ファイルです。このファイルでは、Content-Typeごとにデフォルトの動作をオーバーライドできます。構成ファイルには、IANAからOracleグローバリゼーション・サポートへのキャラクタ・セット名マッピングも含まれています。
ファイルは、ORACLE_HOME
/ctx/configに存在する必要があります。使用するファイル名は、新しいシステム・パラメータMAIL_FILTER_CONFIG_FILE
に格納されます。このファイル名はインストール時にdrmailfl.txtに設定され、デフォルトの内容として有効になります。
独自のメール・フィルタ構成ファイルを作成して、新規バージョンまたはパッチ・セットのインストールにより上書きされないようにすることをお薦めします。メール・フィルタ構成ファイルは、データベース・キャラクタ・セットである必要があります。
ファイルには、BEHAVIOR
およびCHARSETS
という2つのセクションがあります。behaviorセクションの最初の部分は、次のとおりです。
[behavior]
続く行はそれぞれ、MIMEタイプ、空白、動作の指定で始まります。MIME
タイプは、完全なTYPE
/SUBTYPE
またはTYPE
のみで、そのタイプのすべてのサブタイプに適用されます。TYPE
/SUBTYPE
を指定すると、TYPE
の指定がオーバーライドされ、デフォルトの動作がオーバーライドされます。動作は、INCLUDE
、AUTO_FILTER
またはIGNORE
です(定義は「フィルタの動作」を参照)。次に例を示します。
application/zip IGNORE application/msword AUTO_FILTER model IGNORE
"multipart"または"message"タイプに動作を指定することはできません。これらのタイプに動作を指定すると、その行は無視されます。タイプの指定が重複している場合、後に指定した方が優先されます。
行の先頭に#記号を付けることで、メール構成ファイルにコメントを含めることができます。
charsetマッピング・セクションの最初の部分は、次のとおりです。
[charsets]
各行は、次のように、IANA名、空白、Oracleグローバリゼーション・サポート・キャラクタ・セット名で構成されます。
US-ASCII US7ASCI ISO-8859-1 WE8ISO8859P1
メール・フィルタがマッピングを取得する方法は、このファイルのみです。デフォルトはありません。
構成ファイルを変更すると、変更は、それ以降に索引付けされたドキュメントのみに影響します。ファイルを変更した後に、共有プールをフラッシュする必要があります。
次のような形式で、件名行が複数ある他の複数の電子メールが添付されている電子メールがあるとします。
To: somebody@someplace Subject: mainheader Content-Type: multipart/mixed . . . Content-Type: text/plain X-Ref: some_value Subject: subheader 1 . . . Content-Type: text/plain X-Control: blah blah blah Subject: subheader 2 . . .
INDEX_FIELDS
をSubjectに設定し、最初にPART_FIELD_STYLE
をIGNORE
に指定します。
CTX_DDL.CREATE_PREFERENCE('my_mail_filt', 'mail_filter'); CTX_DDL_SET_ATTRIBUTE(my_mail_filt', 'INDEX_FILES', 'subject'); CTX_DDL.SET ATTRIBUTE ('my_mail_filt', 'PART_FIELD_STYLE', 'ignore');
索引が作成され、ファイルが次のように索引付けされます。
<SUBJECT>mainheader</SUBJECT>
PART_FIELD_STYLE
をTAG
に指定した場合は、次のようになります。
<SUBJECT>mainheader</SUBJECT> <SUBJECT>subheader1</SUBJECT> <SUBJECT>subheader2</SUBJECT>
PART_FIELD_STYLE
をFIELD
に指定した場合は、次のようになります。
<SUBJECT>mainheader<SUBJECT> SUBJECT:subheader1 SUBJECT:subheader2
最後に、PART_FIELD_STYLE
をTEXT
に指定した場合は、次のようになります。
<SUBJECT>mainheader</SUBJECT> subheader1 subheader2
USER_FILTER
型を使用して、列内のドキュメントをフィルタ処理するための外部フィルタを指定します。USER_FILTER
には次の属性があります。
注意:
|
列に格納されているすべてのテキストをフィルタ処理するときに使用する、単一外部フィルタの実行可能ファイルを指定します。複数のドキュメント形式が列に格納されている場合、command
に指定された外部フィルタはそれらの形式のすべてを認識し、処理する必要があります。
指定する実行可能ファイルは、$ORACLE_HOME/ctx/bin
ディレクトリ(UNIXの場合)、または%ORACLE_HOME%/ctx/bin
ディレクトリ(Windowsの場合)に存在する必要があります。
次の2つのパラメータで、ユーザー・フィルタ・コマンドを作成します。
1つ目のパラメータは、読み取られる入力ファイルの名前です。
2つ目のパラメータは、書き込まれる出力ファイルの名前です。
すべてのドキュメント形式がAUTO_FILTER
でサポートされている場合は、フィルタ処理以外にドキュメントに対する追加処理が必要でないかぎり、USER_FILTER
のかわりにAUTO_FILTER
を使用します。
USER_FILTER
は、フィルタ処理を必要としないドキュメントをバイパスします。その動作は、フォーマット列とキャラクタ・セット列の値の影響を受けます。さらにUSER_FILTER
は、キャラクタ・セット列の値に従ってキャラクタ・セット変換を実行します。
複合フォーマット列は、複数のドキュメント形式を含むテキスト列です。これには、Microsoft Word、PDF、プレーン・テキストおよびHTMLドキュメントを含む列などがあります。
USER_FILTER
実行可能ファイルによって、複合フォーマット列を索引付けして、テキスト文書を自動的にバイパスできます。ただし、組込みのバイパス・メカニズムを使用しない場合は、行をテキストとして明示的にタグ付けし、USER_FILTER
実行可能ファイルがその行を無視して、ドキュメントを処理しないように指定できます。
元表内のフォーマット列では、テキスト列に含まれるドキュメントのタイプを指定できます。指定できるドキュメント・タイプは、TEXT
、BINARY
およびIGNORE
です。索引付け中に、USER_FILTER
実行可能ファイルは、TEXT
と指定されたすべてのドキュメントを無視します(キャラクタ・セット列が指定されていない場合)。(TEXT
フォーマット列タイプのドキュメントとIGNORE
タイプのドキュメントの相違点は、TEXT
ドキュメントは索引付けされてフィルタには無視されるのに対し、IGNORE
ドキュメントはまったく索引付けされない点です。IGNORE
を使用すると、イメージ・ファイルなどのドキュメントまたは索引付けしない言語のドキュメントが無視されます。IGNORE
はどのフィルタ・タイプにも使用できます。
USER_FILTER
のバイパス・メカニズムを設定するには、元表にフォーマット列を作成する必要があります。次に例を示します。
create table hdocs ( id number primary key, fmt varchar2(10), text varchar2(80) );
主にWordドキュメントを索引付けすると想定すると、Wordドキュメントをフィルタするために、フォーマット列にBINARY
を指定します。一方、USER_FILTER
実行可能ファイルにHTMLドキュメントを無視させるには、フォーマット列にTEXT
を指定します。
たとえば、次の文によってテキスト表に2つのドキュメントを追加し、1つのドキュメントの形式にBINARY
を、もう1つのドキュメントの形式にTEXT
を割り当てるとします。
insert into hdocs values(1, 'binary', '/docs/myword.doc'); insert into hdocs values(2, 'text', '/docs/index.html'); commit;
このファイルの名前がupcase.pl
である場合、次のようにフィルタ・プリファレンスを作成します。
ctx_ddl.create_preference ( preference_name => 'USER_FILTER_PREF', object_name => 'USER_FILTER' ); ctx_ddl.set_attribute ('USER_FILTER_PREF', 'COMMAND', 'upcase.pl');
索引を作成するには、CREATE
INDEX
を使用して、パラメータ文字列にフォーマット列名を指定します。
create index hdocsx on hdocs(text) indextype is ctxsys.context parameters ('datastore ctxsys.file_datastore filter 'USER_FILTER_PREF' format column fmt');
フォーマット列にTEXT
またはBINARY
を指定しない場合は、BINARY
が使用されます。
ドキュメント形式列がTEXT
に設定されている場合、USER_FILTER
実行可能ファイルはドキュメントをデータベース・キャラクタ・セットに変換します。この場合、USER_FILTER
実行可能ファイルはキャラクタ・セット列を検索して、ドキュメントのキャラクタ・セットを判断します。
キャラクタ・セット列値がOracle Textキャラクタ・セット名でない場合、ドキュメントはキャラクタ・セット変換なしで渡されます。
キャラクタ・セット列を指定して、フォーマット列を指定しない場合、USER_FILTER
実行可能ファイルはCHARSET_FILTER
のように機能します。ただし、この場合、日本語キャラクタ・セットの自動識別は行われません。CHARSET_FILTER
の詳細は、「CHARSET_FILTER」を参照してください。
次に、ユーザー・フィルタとして使用されるPerlスクリプトの例を示します。このスクリプトは、1つ目の引数に指定された入力テキスト・ファイルを大文字に変換し、出力を2つ目の引数に指定された場所に書き込みます。
#!/usr/local/bin/perl open(IN, $ARGV[0]); open(OUT, ">".$ARGV[1]); while (<IN>) { tr/a-z/A-Z/; print OUT; } close (IN); close (OUT);
このファイルの名前がupcase.pl
である場合、次のようにフィルタ・プリファレンスを作成します。
begin ctx_ddl.create_preference ( preference_name => 'USER_FILTER_PREF', object_name => 'USER_FILTER' ); ctx_ddl.set_attribute ('USER_FILTER_PREF','COMMAND','upcase.pl'); end;
次のようにSQL*Plusで索引を作成します。
create index user_filter_idx on user_filter ( docs ) indextype is ctxsys.context parameters ('FILTER USER_FILTER_PREF');
ドキュメントをストアド・プロシージャでフィルタ処理するには、PROCEDURE_FILTER
型を使用します。ストアド・プロシージャは、ドキュメントのフィルタ処理が必要になるたびにコールされます。
表2-14に、PROCEDURE_FILTER
の属性を示します。
表2-14 PROCEDURE_FILTER属性
属性 | 用途 | 使用可能な値 |
---|---|---|
|
フィルタのストアド・プロシージャの名前。 |
任意のプロシージャ。プロシージャには、PL/SQLストアド・プロシージャを指定できます。 |
|
ストアド・プロシージャの入力引数の型。 |
|
|
ストアド・プロシージャの出力引数の型。 |
|
|
ROWIDパラメータを含めるか。 |
|
|
formatパラメータを含めるか。 |
|
|
charsetパラメータを含めるか。 |
|
フィルタ処理に使用するストアド・プロシージャの名前を指定します。プロシージャには、PL/SQLストアド・プロシージャを指定できます。プロシージャは、セーフ・コールアウトになることも、セーフ・コールアウトをコールすることもできます。
rowid_parameter
、format_parameter
およびcharset_parameter
をFALSEに設定すると、プロシージャに次のシグネチャのいずれかを設定できます。
PROCEDURE(IN BLOB, IN OUT NOCOPY CLOB) PROCEDURE(IN CLOB, IN OUT NOCOPY CLOB) PROCEDURE(IN VARCHAR, IN OUT NOCOPY CLOB) PROCEDURE(IN BLOB, IN OUT NOCOPY VARCHAR2) PROCEDURE(IN CLOB, IN OUT NOCOPY VARCHAR2) PROCEDURE(IN VARCHAR2, IN OUT NOCOPY VARCHAR2) PROCEDURE(IN BLOB, IN VARCHAR2) PROCEDURE(IN CLOB, IN VARCHAR2) PROCEDURE(IN VARCHAR2, IN VARCHAR2)
1つ目の引数は、データストアによって出力される、フィルタ処理されていない行の内容です。2つ目の引数は、フィルタ処理済のドキュメント・テキストを戻すプロシージャ用の引数です。
プロシージャの属性は必須です。したがって、デフォルトはありません。
フィルタ・プロシージャの入力引数の型を指定します。次のいずれかの型を指定できます。
データ型 | 説明 |
---|---|
procedure |
フィルタのストアド・プロシージャの名前。 |
input_type |
ストアド・プロシージャの入力引数の型。 |
output_type |
ストアド・プロシージャの出力引数の型。 |
rowid_parameter |
ROWIDパラメータを含めるか。 |
input_type
属性は必須ではありません。指定しない場合は、BLOB
がデフォルトになります。
フィルタ・プロシージャの出力引数の型を指定します。次のいずれかの型を指定できます。
データ型 | 説明 |
---|---|
CLOB |
出力引数は、IN OUT NOCOPY CLOB です。プロシージャでは、渡されたCLOB にフィルタ処理済の内容を書き込む必要があります。 |
VARCHAR2 |
出力引数は、IN OUT NOCOPY VARCHAR2 です。プロシージャでは、渡されたVARCHAR2 変数にフィルタ処理済の内容を書き込む必要があります。 |
FILE |
出力引数は、IN VARCHAR2 である必要があります。フィルタ・プロシージャの入力時、出力引数は一時ファイルの名前です。フィルタ・プロシージャでは、この名前が指定されたファイルにフィルタ処理済の内容を書き込む必要があります。
FILE出力型の使用は、プロシージャがファイルへの書込みができるセーフ・コールアウトの場合のみ有効です。 |
output_type
属性は必須ではありません。指定しない場合は、CLOB
がデフォルトになります。
TRUEを指定するとフィルタ処理を行うドキュメントのROWIDが、入力および出力パラメータの前に、1つ目のパラメータとして渡されます。
たとえば、INPUT_TYPE
BLOB
、OUTPUT_TYPE
CLOB
およびROWID_PARAMETER
TRUE
を使用したとします。フィルタ・プロシージャには次のようなシグネチャが必要です。
procedure(in rowid, in blob, in out nocopy clob)
この属性は、プロシージャが他の列または表のデータを要求する場合に有効です。この属性は必須ではありません。デフォルトはFALSE
です。
TRUE
を指定すると、フィルタ処理を行うドキュメントのフォーマット列の値が入力および出力パラメータの前にフィルタ・プロシージャに渡されます。ただし、ROWIDパラメータが有効な場合は、その後に渡されます。
索引付け時にフォーマット列の名前をパラメータ文字列に指定します。このとき、キーワード'format column <columnname>'
を使用します。パラメータ・タイプは、IN
VARCHAR2
である必要があります。
フォーマット列の値は、ROWIDパラメータを介して読み取ることができますが、この属性では、単一フィルタが複数の表構造体で機能できます。これは、format属性が抽象化されており、表またはフォーマット列の名前を認識する必要がないためです。
FORMAT_PARAMETER
は必須ではありません。デフォルトはFALSE
です。
TRUE
を指定すると、フィルタ処理を行うドキュメントのキャラクタ・セット列の値が入力および出力パラメータの前にフィルタ・プロシージャに渡されます。ただし、ROWIDおよびformatパラメータが有効な場合は、その後に渡されます。
索引付け時にキャラクタ・セット列の名前をパラメータ文字列に指定します。このとき、キーワード'charset column <columnname>'
を使用します。パラメータ・タイプは、IN
VARCHAR2
である必要があります。
CHARSET_PARAMETER
属性は必須ではありません。デフォルトはFALSEです。
ROWID_PARAMETER
、FORMAT_PARAMETER
およびCHARSET_PARAMETER
は、すべて非依存型です。順序はrowid、format、次にcharsetとなります。ただし、フィルタ・プロシージャには、必要最小数のパラメータのみが渡されます。
たとえば、INPUT_TYPE
がBLOB
で、OUTPUT_TYPE
がCLOB
とします。フィルタ・プロシージャにすべてのパラメータが必要な場合、そのプロシージャのシグネチャは、次のように指定する必要があります。
(id IN ROWID, format IN VARCHAR2, charset IN VARCHAR2, input IN BLOB, output IN OUT NOCOPY CLOB)
プロシージャで必要なパラメータがROWID
のみの場合、プロシージャのシグネチャは、次のように指定する必要があります。
(id IN ROWID,input IN BLOB, ouput IN OUT NOCOPY CLOB)
フィルタ・プロシージャでは、通常のPL/SQL raise_application_error
機能を使用して、必要に応じてエラーを戻すことができます。戻されたエラーは、フィルタの起動方法に応じて、CTX_USER_INDEX_ERRORSビューに伝播されるか、またはユーザーにレポートされます。
次のシグネチャを使用して定義するフィルタ・プロシージャ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;
レクサー・プリファレンスを使用して、索引付けするテキストの言語を指定します。レクサー・プリファレンスを作成するには、表2-15で説明するレクサー型のうちいずれか1つを使用する必要があります。
表2-15 レクサー型
データ型 | 説明 |
---|---|
|
空白のデリミタ付きワードを使用する英語およびほとんどのヨーロッパ言語で、テキストからのトークンの抽出に使用するレクサー。 |
|
英語、ドイツ語および日本語など、異なる複数言語のドキュメントを含む表の索引付けに使用するレクサー。 |
|
中国語テキストからのトークンの抽出に使用するレクサー。 |
|
中国語テキストからのトークンの抽出に使用するレクサー。このレクサーは、
|
|
日本語テキストからのトークンの抽出に使用するレクサー。 |
|
日本語テキストからのトークンの抽出に使用するレクサー。このレクサーは、
|
|
韓国語テキストからのトークンの抽出に使用するレクサー。 |
|
特定言語を索引付けするために作成するレクサー。 |
|
異なる複数言語のドキュメントを含む表の索引付けに使用する、ドキュメントの言語を自動検出するレクサー。 |
BASIC_LEXER
型を使用して、英語およびサポートされているその他すべての空白のデリミタ付き言語のテキスト索引を作成するために、トークンを識別します。
また、BASIC_LEXER
を使用して、拡張キャラクタ・セットを持つ空白のデリミタ付き言語に対する基本文字変換、コンポジット・ワードの索引付け、大/小文字を区別した索引付けおよび代替スペルを使用可能にします。
英語およびフランス語では、BASIC_LEXER
を使用してテーマの索引付けを使用可能にできます。
注意: 索引付けの前にレクサーがトークンに対して実行した処理(文字の削除や基本文字変換など)は、問合せ時に問合せ語句に対しても実行されます。これによって、問合せ語句は、テキスト索引内のトークンのフォームと確実に一致します。 |
BASIC_LEXER
は、任意のデータベース・キャラクタ・セットをサポートしています。
BASIC_LEXER
には、表2-16に示す属性があります。
表2-16 BASIC_LEXER属性
属性 | 属性値 |
---|---|
|
文字 |
|
文字 |
|
文字 |
|
文字 |
|
文字 |
|
文字 |
|
トークンの先頭にある英数字以外の文字(文字列) |
|
トークンの末尾にある英数字以外の文字(文字列) |
|
文字(文字列) |
|
NEWLINE(\n) CARRIAGE_RETURN(\r) |
|
NO(使用禁止) |
YES(使用可能) |
|
|
GENERIC(デフォルト) |
SPECIFIC |
|
|
TRUE FALSE(デフォルト) |
|
NO(使用禁止) |
YES(使用可能) |
|
|
DEFAULT(コンポジット・ワードの索引付けなし、デフォルト) |
GERMAN(ドイツ語のコンポジット・ワード索引付け) |
|
DUTCH(オランダ語のコンポジット・ワードの索引付け) |
|
0 NONE 1 ENGLISH 2 DERIVATIONAL 3 DUTCH 4 FRENCH 5 GERMAN 6 ITALIAN 7 SPANISH |
|
|
YES(使用可能) |
NO(使用禁止、デフォルト) |
|
NO(使用禁止、デフォルト) |
|
|
YES(使用可能、デフォルト) |
NO(使用禁止) |
|
|
YES(使用可能、デフォルト) |
NO(使用禁止) |
|
|
AUTO(デフォルト) |
(任意のグローバリゼーション・サポート対象言語) |
|
|
GERMAN(ドイツ語の代替スペル) |
DANISH(デンマーク語の代替スペル) |
|
SWEDISH(スウェーデン語の代替スペル) |
|
NONE(代替スペルなし、デフォルト) |
|
|
YES NO(デフォルト) |
ワードが次の行に続き、そのワードを1つのトークンとして索引付けする必要があることを示す文字を指定します。最も一般的な連結文字はハイフン'-'および円記号'\'です。
数字列の中で使用する場合に、1つの大きな数字の集まりをいくつかの桁にグループ分けすることを示す文字を指定します。
たとえば、カンマ','は、数字列の中で使用されている場合、千の位のグループ分けを示すことがあるため、numgroup
文字として定義されることがあります。
数字列の中で使用する場合に、Oracle Textでは数字の文字列を1つの単位またはワードとみなして索引付けするように文字を指定します。
たとえば、ピリオド'.'は、数字列の中で使用される場合、小数点を示すことがあるため、numjoin文字として定義されることがあります。
注意: numjoin およびnumgroup のデフォルト値は、データベースに指定されたグローバリゼーション・サポート初期化パラメータによって決定されます。
通常、 |
英数字以外の文字を指定します。この文字は、ワード内(先頭、中程または末尾)にあれば英数字として処理され、テキスト索引にトークンとともに組み込まれます。連続しているprintjoins
も同様に処理されます。
たとえば、ハイフン'-'およびアンダースコア'_'文字がprintjoin
として定義されている場合、pseudo-intellectualや_file_などの語句は、pseudo-intellectualおよび_file_としてテキスト索引に格納されます。
注意: printjoin 文字が同時にpunctuation 文字としても定義されている場合は、その文字の直後の文字が標準の英数字であるか、printjoin 文字またはskipjoin 文字として定義されていると、その文字は英数字としてのみ処理されます。 |
ワードの末尾に使用される場合に、文の終わりを示す英数字以外の文字のリストを指定します。デフォルトは、ピリオド'.'、疑問符'?'および感嘆符'!'です。
punctuation
として定義されている文字は、テキストの索引付け前にトークンから削除されます。ただし、punctuation
文字がprintjoin
文字としても定義されている場合は、その文字がトークンの最後の文字である場合にのみ削除されます。
たとえば、ピリオド(.)がprintjoin
文字とpunctuation
文字の両方に定義されている場合は、索引付けおよび問合せのときに次のように変換されます。
トークン | 索引付けされたトークン |
---|---|
.doc | .doc |
dog.doc | dog.doc |
dog..doc | dog..doc |
dog. | dog |
dog... | dog.. |
また、BASIC_LEXER
は、punctuation
文字をnewline
文字およびwhitespace
文字と組み合せて使用し、文/段落検索用の文デリミタおよび段落デリミタを決定します。
英数字以外の文字を指定します。この文字がワード内で使用されている場合は、そのワードを単一のトークンとして識別します。ただし、その文字はテキスト索引内にトークンとともに格納されません。
たとえば、ハイフン文字'-'がskipjoin
として定義されている場合、ワードpseudo-intellectualは、テキスト索引にpseudointellectualとして格納されます。
注意: printjoin およびskipjoin は相互に排他的です。同じ文字を両方の属性に指定できません。 |
startjoin
は、トークンの最初の文字として検出された場合、明示的にトークンの始まりを識別する文字を指定します。その文字は、そのすぐ後に続く他のstartjoin
文字と同様に、トークンに対するテキスト索引内のエントリに含まれます。また、startjoin
文字列の最初のstartjoin
文字は、前のトークンを暗黙的に終了させます。
endjoin
は、トークンの最後の文字として検出された場合、明示的にトークンの終わりを識別する文字を指定します。その文字は、そのすぐ後に続く他のstartjoin
文字と同様に、トークンに対するテキスト索引内のエントリに含まれます。
次の規則は、startjoinsとendjoinsの両方に適用されます。
startjoin
/endjoin
に指定された文字は、BASIC_LEXER
のその他の属性には指定できません。
startjoin
/endjoin
文字は、トークンの最初または最後にのみ使用できます。
printjoinは、endjoinおよびstartjoinと異なり、使用場所の制限はありません。たとえば、$がstartjoin
またはprintjoin
の場合、$35は1つのトークンとして索引付けられますが、endjoin
として定義されている場合は2つのトークンとして索引付けられます。
トークン間で空白として扱われる文字を指定します。BASIC_LEXER
は、文および段落検索用の文デリミタとして機能する文字列を識別するため、whitespace
文字をpunctuation
文字およびnewline
文字と組み合せて使用します。
whitespace
の事前定義のデフォルト値は、space
とtab
です。これらの値は変更できません。whitespace
として文字を指定すると、これらのデフォルト値に追加されます。
テキストの行の終わりを示す文字を指定します。BASIC_LEXER
は、文および段落検索用の段落デリミタとして機能する文字列を識別するため、newline
文字をpunctuation文字およびwhitespace文字と組み合せて使用します。
newline
に対する有効値は、NEWLINE
およびCARRIAGE_RETURN
(改行)のみです。デフォルトはNEWLINE
です。
発音区別記号(ウムラウト、セディーユ、揚音アクセントなど)を持つ文字を、テキスト索引に格納する前に、基本形に変換するかどうかを指定します。デフォルトはNO(基本文字変換は使用禁止)です。基本文字変換およびbase_letter_type
の詳細は、「基本文字変換」を参照してください。
GENERIC
またはSPECIFIC
を指定します。
GENERIC
値はデフォルトで、基本文字変換の際、全言語に適用する変換表を1つ使用します。基本文字変換およびbase_letter_type
の詳細は、「基本文字変換」を参照してください。
base_letter
とalternate_spelling
を同時に有効にすると、シリアル変換によって予期しない結果が生じないように、base_letter
のオーバーライドが必要になることがあります。「代替スペルによる基本文字変換のオーバーライド」を参照してください。デフォルトはFALSE
です。
レクサーがトークンをテキストに表示されたままにするか、またはすべて大文字に変換するかを指定します。デフォルトではNO(トークンはすべて大文字に変換される)です。
注意: Oracle Textでは、ワード問合せを、問合せされる索引の大/小文字の区別に確実に一致させます。そのため、テキスト索引に対して大/小文字の区別を有効にすると、その索引に対する問合せでは常に大文字と小文字が区別されます。 |
GERMAN
またはDUTCH
テキストに対して、コンポジット・ワードの索引付けを使用可能または使用禁止にするかどうかを指定します。デフォルトはDEFAULT
(コンポジット・ワードの索引付けは使用禁止)です。
ドイツ語ディクショナリで通常1エントリであるワードは、複合語幹に分割されませんが、ディクショナリのエントリでないワードは、複合語幹に分割されます。
索引付けされた複合語幹を取得するには、ステミング問合せ(例: $bahnhof)を入力する必要があります。ワードリスト・ステマーの言語は、複合語幹の言語と一致している必要があります。
独自の言語のユーザー・ディクショナリを作成し、ワードの分解方法をカスタマイズできます。表2-17にこのユーザー・ディクショナリを示します。
表2-17 ステミング・ユーザー・ディクショナリ
ディクショナリ | stemmer |
---|---|
|
フランス語 |
|
ドイツ語 |
|
オランダ語 |
|
イタリア語 |
|
スペイン語 |
|
英語と派生語 |
ステミング・ユーザー・ディクショナリは、表2-17の言語以外の言語に対してはサポートされていません。
このユーザー・ディクショナリの書式は、次のとおりです。
output term <tab> input term
分解されたワードの個々の部分は、#文字で区切る必要があります。ドイツ語のワードHauptbahnhofに対するエントリの例を次に示します。
Hauptbahnhof<tab>Haupt#Bahnhof Hauptbahnhofes<tab>Haupt#Bahnhof Hauptbahnhof<tab>Haupt#Bahnhof Hauptbahnhoefe<tab>Haupt#Bahnhof
英語またはフランス語のテーマ情報の索引付けには、YES
を指定します。これによってABOUT
問合せがより正確になります。index_themes
属性およびindex_text
属性の両方にNO
を指定することはできません。デフォルトはYES
です。
このパラメータは、CTXCAT
も含めたすべての索引タイプに対してTRUE
に設定できます。CATSEARCH
でABOUT
問合せを入力する場合は、CONTEXT
文法による問合せテンプレートを使用してください。
注意: index_themes を使用するには、ナレッジ・ベースがインストールされている必要があります。ナレッジ・ベースは、Oracle Textとともにインストールされていない場合があります。ナレッジ・ベースの詳細は、『Oracle Textアプリケーション開発者ガイド』を参照してください。 |
テーマを検証するには、YES
を指定します。テーマの検証では、ドキュメント内の関連テーマが検索されます。関連テーマが検索されない場合、親テーマはそのドキュメントから排除されます。
テーマの検証は大規模なドキュメントに対して使用可能です。ワード数の少ない短い記述のテキストで親テーマが検証されることはほとんどなく、結果的にABOUT
問合せによる再コールでのパフォーマンスが低下します。
テーマの検証によって、ABOUT
問合せの精度が向上し、再コール数が減少(戻される行が減少)します。ABOUT
問合せでの再コールが増加し、検索精度が低下する可能性がある場合は、テーマの検証を使用禁止にできます。デフォルトはYES
です。
prove_themes
属性は、CONTEXT
索引およびCTXRULE
索引に対してサポートされています。
index_themes
がYES
に設定されている場合は、テーマ生成にどのナレッジ・ベースを使用するかを指定します。index_themes
がNO
に設定されている場合は、このパラメータを設定しても何も影響はありません。
任意のグローバリゼーション・サポート対象言語またはAUTO
を指定します。指定する言語のナレッジ・ベースが必要です。このリリースで提供されているのは、英語とフランス語のナレッジ・ベースのみです。それ以外の言語では、独自のナレッジ・ベースを作成できます。
デフォルトはAUTO
であり、システムがこのパラメータを環境の言語に対応するように設定します。
語幹索引付けに使用するステマーを指定します。次のステマーのいずれかを選択できます。
|
|
索引付け時に、トークンが通常の形式に加えて、単一の基本形にステミングされます。語幹索引付けによって、ステミング($)問合せ(例: $computed)の問合せパフォーマンスが向上します。
ワード情報の索引付けには、YES
を指定します。index_themes属性およびindex_text属性の両方にNO
を指定することはできません。
デフォルトはNO
です。
GERMAN
、DANISH
、SWEDISH
のいずれかを指定して、これらの言語のうちの1つの代替スペルを使用可能にします。代替スペルを使用可能にすると、任意の代替形式でワードを問合せできます。
デフォルトでは、代替スペルはオフになっていますが、Oracleがadmin/defaults
で提供している言語固有のスクリプト(ドイツ語: drdefd.sql
、オランダ語: drdefdk.sql
、スウェーデン語: drdefs.sql
)では、代替スペルがオンになっています。インストールでこれらのスクリプトを使用している場合、代替スペルがオンになります。ただし、代替スペルがない場合は、NONE
を指定します。Oracle Textが使用する代替スペルの規則については、「代替スペル」を参照してください。
BASIC_LEXER
を使用する問合せが、ドイツ語のワードの従来のスペルと改良された(新規の)スペルを戻すかどうかを指定します。new_german_spelling
がYES
に設定されている場合、従来の形式と新規の形式のワードが索引付けされます。NO
に設定されている場合、ワードは問合せに指定されたとおりに索引付けされます。デフォルトはNO
です。
次の例では、printjoin文字を設定し、BASIC_LEXER
を使用してテーマの索引付けを使用禁止にします。
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;
テーマを索引付けせず、前述のprintjoinキャラクタ・セットを使用して索引を作成するには、次の文を入力します。
create index myindex on mytable ( docs ) indextype is ctxsys.context parameters ( 'LEXER mylex' );
MULTI_LEXER
は、異なる複数の言語のドキュメントを含むテキスト列の索引付けに使用します。たとえば、このレクサーを使用して、英語、ドイツ語および日本語のドキュメントを格納するテキスト列を索引付けします。
このレクサーには属性がありません。
元表に言語列が存在する必要があります。マルチ言語表に索引付けするには、索引の作成時に言語列を指定します。
CTX_DDL.CREATE_PREFERENCE
を使用して、マルチレクサー・プリファレンスを作成します。CTX_DDL.ADD_SUB_LEXER
プロシージャを使用して、そのマルチレクサー・プリファレンスに言語固有のレクサーを追加します。
索引付け時に、MULTI_LEXER
は、各行の言語列の値を調べ、言語固有のレクサーに切り替えた後、ドキュメントを処理します。
WORLD_LEXER
レクサーは、マルチ言語の索引付けも実行しますが、個別の言語列に対して実行する必要はありません(つまり、自動言語検出が実行されます)。WORLD_LEXER
の詳細は、「WORLD_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');
CHINESE_VGRAM_LEXER
型は、テキスト索引作成用の中国語テキストのトークンを識別します。
CHINESE_LEXER
型は、テキスト索引作成用の中国語(繁体字および簡体字)テキストのトークンを識別します。
このレクサーは、CHINESE_VGRAM_LEXER
と比較して次の利点があります。
小型の索引の生成
問合せ応答時間の短縮
実ワード・トークンの生成による問合せ精度の向上
ストップワードのサポート
CHINESE_LEXER
は異なるアルゴリズムを使用してトークンを生成するため、索引付けに要する時間は、CHINESE_VGRAM_LEXER
を使用した場合より長くなります。
データベース・キャラクタ・セットが、Oracleでサポートしている中国語キャラクタ・セットまたはUnicodeキャラクタ・セットである場合は、このレクサーを使用できます。
JAPANESE_VGRAM_LEXER
型は、テキスト索引作成用の日本語テキストのトークンを識別します。このレクサーは、STEM($)演算子をサポートしています。
JAPANESE_LEXER
型は、テキスト索引作成用の日本語テキストのトークンを識別します。このレクサーは、STEM($)演算子をサポートしています。
このレクサーは、JAPANESE_VGRAM_LEXER
と比較して次の利点があります。
小型の索引の生成
問合せ応答時間の短縮
実ワード・トークンの生成による問合せ精度の向上
JAPANESE_LEXER
は異なるアルゴリズムを使用してトークンを生成するため、索引付けに要する時間は、JAPANESE_VGRAM_LEXER
を使用した場合より長くなります。
テキスト索引の作成用にJAPANESE_LEXER
を指定すると、JAPANESE_LEXER
によって、文はワードに変換されます。
たとえば、次の複合語(「自然言語処理」)があるとします。
このワードは、次の3つのトークンとして索引付けされます。
文をワードに変換するために、内部ディクショナリが参照されます。内部ディクショナリでワードが検索できない場合、Oracle Textでは、JAPANESE_VGRAM_LEXER
を使用して変換します。
KOREAN_MORPH_LEXER
型は、テキスト索引作成用の韓国語テキストのトークンを識別します。
KOREAN_MORPH_LEXER
は次の4つのディクショナリを使用します。
表2-22 KOREAN_MORPH_LEXERディクショナリ
ディクショナリ | ファイル |
---|---|
システム |
|
文法 |
|
ストップワード |
|
ユーザー定義 |
|
文法、ユーザー定義およびストップワードの各ディクショナリは、KSC 5601またはMSWIN949キャラクタ・セットを使用して作成する必要があります。これらのディクショナリは定義済のルールを使用して変更できます。システム・ディクショナリは変更できません。
未登録のワードは、ユーザー定義ディクショナリ・ファイルに追加できます。新しいワードを指定するルールは、このファイルに含まれています。
データベースで次のいずれかのキャラクタ・セットを使用する場合は、KOREAN_MORPH_LEXER
を使用できます。
KOREAN_MORPH_LEXER
は、大/小文字混在の検索を有効にします。
KOREAN_MORPH_LEXER
は、次をサポートします。
Unicodeで定義されたKSC5601以外の韓国語の文字のワード
追加文字
関連項目: 追加文字の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。 |
韓国語ドキュメントには、KSC5601以外の文字が使用されているものがあります。KOREAN_MORPH_LEXER
は、11,172個の有効な韓国語(ハングル)文字をすべて認識できるため、このような文書も、UTF8またはAL32UTF8キャラクタ・セットを使用することで解析できます。
サロゲート文字を抽出するには、データベースにAL32UTF8キャラクタ・セットを使用します。デフォルトでは、KOREAN_MORPH_LEXER
は、シリーズごとの1つのトークンとして、すべてのシリーズのサロゲート文字を抽出します。
KOREAN_MORPH_LEXER
を使用する場合は、次の属性を指定できます。
表2-23 KOREAN_MORPH_LEXER属性
属性 | 属性値 |
---|---|
動詞、形容詞および副詞の索引付けに対して、 |
|
1つの音節の索引付けに対して、 |
|
数の索引付けに対して、 |
|
ユーザー・ディクショナリの索引付けに対して、 |
|
ストップワード・ディクショナリの使用に対して、 |
|
コンポジット名詞の索引付けスタイルを指定します。 コンポジット名詞のみを索引付けするには、 コンポジット名詞の名詞コンポーネントをすべて索引付けするには、 コンポジット名詞自体の他にコンポジット名詞の単一名詞コンポーネントを索引付けするには、
|
|
語形分析に対して、 |
|
英語の大文字への変換に対して、 |
|
ハンジャ文字を索引付けするには、 |
|
韓国語の16音節を超える長いワードを索引付けするには、 |
|
Unicode(2バイト地域でのみ使用)の日本語の文字を索引付けするには、 |
|
英数字文字列を索引付けするには、 |
composite属性を使用すると、コンポジット名詞の索引付け方法を制御できます。
composite属性に対してNGRAM
を指定すると、コンポジット名詞は、すべてのコンポーネント・トークンとともに索引付けされます。たとえば、次のようなコンポジット名詞(「情報処理規則」)があるとします。
この名詞は、次の6つのトークンとして索引付けされます。
NGRAM
を次のように指定して索引付けします。
begin ctx_ddl.create_preference('my_lexer','KOREAN_MORPH_LEXER'); ctx_ddl.set_attribute('my_lexer','COMPOSITE','NGRAM'); end
索引を作成するには、次のようにします。
create index koreanx on korean(text) indextype is ctxsys.context parameters ('lexer my_lexer');
composite属性に対してCOMPONENT_WORD
を指定すると、コンポジット名詞およびそのコンポーネントが索引付けされます。たとえば、次のようなコンポジット名詞(「情報処理規則」)があるとします。
この名詞は、次の4つのトークンとして索引付けされます。
COMPONENT_WORD
を次のように指定して索引付けできます。
begin ctx_ddl.create_preference('my_lexer','KOREAN_MORPH_LEXER'); ctx_ddl.set_attribute('my_lexer','COMPOSITE','COMPONENT_WORD'); end
索引を作成するには、次のようにします。
create index koreanx on korean(text) indextype is ctxsys.context parameters ('lexer my_lexer');
USER_LEXER
を使用して、ユーザーの言語に固有のレクサー処理ソリューションをプラグインします。こうするとOracle Textでサポートされていない言語のレクサーを定義できます。また、サポートされている言語のレクサーがユーザーのアプリケーションに不適当な場合は、新しいレクサーを定義できます。
ユーザー定義レクサーをOracle Textに登録するには、次の2つのルーチンの指定が必要です。
表2-24 USER_LEXERのユーザー定義ルーチン
ユーザー定義ルーチン | 説明 |
---|---|
索引付けプロシージャ |
ドキュメントとストップワードのトークン化を行うストアド・プロシージャ(PL/SQL)。出力は、この項に記載されているとおりのXMLドキュメントであることが必要です。 |
問合せプロシージャ |
問合せワードのトークン化を行うストアド・プロシージャ(PL/SQL)。出力は、この項に記載されているとおりのXMLドキュメントであることが必要です。 |
このコールバック・ストアド・プロシージャは、ドキュメントまたはストップリスト・オブジェクトにあるストップワードのトークン化が必要になると、Oracle Textによってコールされます。
ユーザー定義レクサーの索引付けプロシージャでは、2つのインタフェースがサポートされています。1つのインタフェースは、ドキュメントまたはストップワードと、XMLとしてコード化された対応するトークンをVARCHAR2
データ型で渡し、もう1つのインタフェースはCLOB
データ型を使用します。この属性は、INDEX_PROCEDURE
属性で指定されたストアド・プロシージャが実装するインタフェースを示します。
表2-33のBASIC_WORDLIST属性では、トークン化するドキュメントまたはストップリスト・オブジェクトのストップワードをVARCHAR2
でOracle Textからストアド・プロシージャに渡し、同様に、トークンをVARCHAR2
でストアド・プロシージャからOracle Textに渡すインタフェースについて説明します。
ユーザー定義レクサーの索引付けプロシージャでは、索引付けする列の全ドキュメントが32512バイト以下で、そのトークンが32512バイト以下で表される場合は、このインタフェースを使用してください。この場合、表2-27に示したCLOB
インタフェースも使用できますが、通常、VARCHAR2
インタフェースはCLOB
インタフェースよりも高速に実行されます。
このプロシージャは、次のパラメータを使用して定義する必要があります。
表2-26 INDEX_PROCEDURESのVARCHAR2インタフェース
パラメータ順序 | パラメータ・モード | パラメータのデータ型 | 説明 |
---|---|---|---|
1 |
|
|
トークン化するドキュメントまたはストップリスト・オブジェクトのストップワード。 ドキュメントが32512バイトを超える場合は、ドキュメント・レベルの索引付けエラーがレポートされます。 |
2 |
|
|
XMLとしてコード化されたトークン。 ドキュメントにトークンが含まれていない場合は、NULLを戻すか、または戻されるXMLドキュメントのトークン要素に子要素を含めないでください。 データのバイト長は、32512以下にしてください。 パフォーマンスを改善するには、このパラメータの宣言時に このプロシージャが戻すXMLドキュメントには不要なwhitespace文字(通常、可読性の向上のために使用する)を含めないでください。これによって、XMLドキュメントのサイズが縮小され、結果として送信時間が短縮されます。 パフォーマンス向上のために、index_procedureの実行時に、対応するXML Schemaに対するXMLドキュメントの妥当性はチェックされません。 このパラメータは、パフォーマンスの目的で |
3 |
|
|
トークン化するドキュメントでのトークンの文字オフセットと文字長がOracle Textで必要な場合、このパラメータは トークン化するドキュメントで検出されたトークンの文字オフセットと文字長がOracle Textで不要な場合、このパラメータは |
表2-27では、トークン化するドキュメントまたはストップリスト・オブジェクトのストップワードをCLOB
でOracle Textからストアド・プロシージャに渡し、同様に、トークンをCLOB
でストアド・プロシージャからOracle Textに渡すCLOB
インタフェースについて説明します。
ユーザー定義レクサーの索引付けプロシージャでは、索引付けする列の1つ以上のドキュメントが32512バイトを超える場合、または対応するトークンが32512バイトを超えるバイト数で表される場合は、このインタフェースを使用してください。
表2-27 INDEX_PROCEDUREのCLOBインタフェース
パラメータ順序 | パラメータ・モード | パラメータのデータ型 | 説明 |
---|---|---|---|
1 |
|
|
トークン化するドキュメントまたはストップリスト・オブジェクトのストップワード。 |
2 |
|
|
XMLとしてコード化されたトークン。 ドキュメントにトークンが含まれていない場合は、NULLを戻すか、または戻されるXMLドキュメントのトークン要素に子要素を含めないでください。 パフォーマンスを改善するには、このパラメータの宣言時に このプロシージャが戻すXMLドキュメントには不要なwhitespace文字(通常、可読性の向上のために使用する)を含めないでください。これによって、XMLドキュメントのサイズが縮小され、結果として送信時間が短縮されます。 パフォーマンス向上のために、index_procedureの実行時に、対応するXML Schemaに対するXMLドキュメントの妥当性はチェックされません。 このパラメータは、パフォーマンスの目的で |
3 |
|
|
トークン化するドキュメントでのトークンの文字オフセットと文字長がOracle Textで必要な場合、このパラメータは トークン化するドキュメントで検出されたトークンの文字オフセットと文字長がOracle Textで不要な場合、このパラメータは |
1番目と2番目のパラメータは一時CLOB
です。これらのCLOB
ロケータを他のロケータ変数に割り当てないでください。仮パラメータのCLOB
ロケータを他のロケータ変数に割り当てると、一時CLOB
の新しいコピーが作成され、パフォーマンスに影響を与えます。
このコールバック・ストアド・プロシージャは、問合せ内のワードのトークン化が必要になると、Oracle Textによってコールされます。問合せ内の空白で区切られた文字のグループ(問合せ演算子を除く)は、ワードとして識別されます。
このプロシージャには、PL/SQLストアド・プロシージャを指定できます。
索引所有者は、このストアド・プロシージャに対するEXECUTE
権限が必要です。
このストアド・プロシージャは、索引の作成後に置換したり削除することはできません。索引の削除後に、このストアド・プロシージャを置換または削除することはできます。
このプロシージャは、次のいずれの操作も実行できません。
ロールバック
現行トランザクションの明示的または暗黙的なコミット
その他のトランザクション制御文の入力
セッション言語または地域の変更
XMLドキュメントのルート要素トークンの子要素は、トークン化される問合せワードでトークンが出現した順序で戻される必要があります。
このストアド・プロシージャの動作は、すべてのパラメータに対して決定的であることが必要です。
表2-28では、ユーザー定義レクサーの問合せプロシージャのインタフェースについて説明します。
表2-28 ユーザー定義レクサーの問合せプロシージャXML Schema属性
パラメータ順序 | パラメータ・モード | パラメータのデータ型 | 説明 |
---|---|---|---|
1 |
|
|
トークン化する問合せワード。 |
2 |
|
|
問合せワード内のワイルド・カード文字(%および_)の文字オフセット。Oracle Textによって渡された問合せワードにワイルド・カード文字が含まれていない場合、この索引付き表は空になります。 問合せワード内のワイルド・カード文字は、ワイルド・カード問合せ機能が正しく実行されるように、戻されるトークンに保持する必要があります。 文字オフセットは0(ゼロ)を基準にしています。オフセット情報はUSC-2コードポイント・セマンティクスに準拠します。 |
3 |
|
|
XMLとしてコード化されたトークン。 問合せワードにトークンが含まれていない場合は、NULLを戻すか、または戻されるXMLドキュメントのトークン要素に子要素を含めないでください。 データの長さは、32512バイト以下であることが必要です。 |
ユーザーのストアド・プロシージャが戻すトークンの順序は、XML 1.0ドキュメントで表す必要があります。このXMLドキュメントは、次の各項で示すXML Schemaに対して妥当であることが必要です。
この機能のパフォーマンスを向上させるために、Oracle TextのXMLパーサーは妥当性チェックを実行しません。また、XMLの機能に完全に適合する正規のパーサーではありません。つまり、最小限のXML機能がサポートされます。次のXML機能はサポートされません。
ドキュメント・タイプ宣言(例: <!DOCTYPE [...]>
)およびエンティティ宣言。lt、gt、amp、quotおよびaposの組込みエンティティのみ参照できます。
CDATAセクション
コメント
処理命令
XML宣言(例: <?xml version="1.0" ?>
)
名前空間
対応するXML Schema以外で定義された要素および属性の使用
文字参照(例: ট)
xml:space属性
xml:lang属性
この項では、3番目のパラメータがFALSE
の場合に、ユーザー定義レクサーの索引付けプロシージャが戻すXMLドキュメントに適用される追加の制約について説明します。戻されるXMLドキュメントは、次のXML Schemaに対して妥当であることが必要です。
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="tokens"> <xsd:complexType> <xsd:sequence> <xsd:choice minOccurs="0" maxOccurs="unbounded"> <xsd:element name="eos" type="EmptyTokenType"/> <xsd:element name="eop" type="EmptyTokenType"/> <xsd:element name="num" type="xsd:token"/> <xsd:group ref="IndexCompositeGroup"/> </xsd:choice> </xsd:sequence> </xsd:complexType> </xsd:element> <!-- Enforce constraint that compMem element must be preceeded by word element or compMem element for indexing --> <xsd:group name="IndexCompositeGroup"> <xsd:sequence> <xsd:element name="word" type="xsd:token"/> <xsd:element name="compMem" type="xsd:token" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:group> <!-- EmptyTokenType defines an empty element without attributes --> <xsd:complexType name="EmptyTokenType"/> </xsd:schema>
次に、このXML Schemaによって適用される制約をいくつか説明します。
ルート要素はトークンです。これは必須です。DIRECT_DATASTOREに属性はありません。
ルート要素には、子要素を指定しないことも、1つ以上の子要素を指定することも可能です。子要素には、eos、eop、num、wordおよびcompMemのいずれかの要素を指定できます。これらの子要素は、特定のトークン型を表します。
compMem要素は、word要素またはcompMem要素の後に指定する必要があります。
eos要素とeop要素に属性はありません。これらは空要素であることが必要です。
num、wordおよびcompMem要素に属性はありません。これらの要素の内容は、Oracle Textによって正規化されます。whitespace文字の空白文字への変換、隣接する複数の空白文字の単一空白文字への縮小、先頭および末尾の空白の削除、エンティティ参照の置換、および64バイトへの切捨てが行われます。
表2-29では、前述のXML Schemaに定義されている要素名について説明します。
表2-29 ユーザー定義レクサーの索引付けプロシージャXML Schema要素名
要素 | 説明 |
---|---|
word |
単純なワード・トークンを表します。この要素の内容はワード自体です。このトークンがストップワードまたは非ストップワードとして識別され、これに対応した処理が行われます。 |
num |
数値トークンを表します。この要素の内容は数値自体です。ストップリスト・プリファレンスに このトークン型のサポートはオプションです。このトークン型をサポートしない場合、 |
eos |
文の終わりを表すトークンです。この情報は、 このトークン型のサポートはオプションです。このトークン型をサポートしない場合、 |
eop |
段落の終わりを表すトークンです。この情報は、 このトークン型のサポートはオプションです。このトークン型をサポートしない場合、 |
compMem |
暗黙的なワード・オフセットが前のワード・トークンと同じであるという点を除いて、word要素と同じです。 このトークン型のサポートはオプションです。 |
ドキュメント: Vom Nordhauptbahnhof und aus der Innenstadt zum Messegelände.
トークン:
<tokens> <word> VOM </word> <word> NORDHAUPTBAHNHOF </word> <compMem>NORD</compMem> <compMem>HAUPT </compMem> <compMem>BAHNHOF </compMem> <compMem>HAUPTBAHNHOF </compMem> <word> UND </word> <word> AUS </word> <word> DER </word> <word> INNENSTADT </word> <word> ZUM </word> <word> MESSEGELÄNDE </word> <eos/> </tokens>
この項では、3番目のパラメータがTRUE
の場合に、ユーザー定義レクサーの索引付けプロシージャが戻すXMLドキュメントに適用される追加の制約について説明します。戻されるXMLドキュメントは、次のXML Schemaに対して妥当であることが必要です。
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="tokens"> <xsd:complexType> <xsd:sequence> <xsd:choice minOccurs="0" maxOccurs="unbounded"> <xsd:element name="eos" type="EmptyTokenType"/> <xsd:element name="eop" type="EmptyTokenType"/> <xsd:element name="num" type="DocServiceTokenType"/> <xsd:group ref="DocServiceCompositeGroup"/> </xsd:choice> </xsd:sequence> </xsd:complexType> </xsd:element> <!-- Enforce constraint that compMem element must be preceeded by word element or compMem element for document service --> <xsd:group name="DocServiceCompositeGroup"> <xsd:sequence> <xsd:element name="word" type="DocServiceTokenType"/> <xsd:element name="compMem" type="DocServiceTokenType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:group> <!-- EmptyTokenType defines an empty element without attributes --> <xsd:complexType name="EmptyTokenType"/> <!-- DocServiceTokenType defines an element with content and mandatory attributes --> <xsd:complexType name="DocServiceTokenType"> <xsd:simpleContent> <xsd:extension base="xsd:token"> <xsd:attribute name="off" type="OffsetType" use="required"/> <xsd:attribute name="len" type="xsd:unsignedShort" use="required"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> <xsd:simpleType name="OffsetType"> <xsd:restriction base="xsd:unsignedInt"> <xsd:maxInclusive value="2147483647"/> </xsd:restriction> </xsd:simpleType> </xsd:schema>
このXML Schemaによって適用される制約は次のとおりです。
ルート要素はトークンです。これは必須です。DIRECT_DATASTOREに属性はありません。
ルート要素には、子要素を指定しないことも、1つ以上の子要素を指定することも可能です。子要素には、eos、eop、num、wordおよびcompMemのいずれかの要素を指定できます。これらの子要素は、特定のトークン型を表します。
compMem要素は、word要素またはcompMem要素の後に指定する必要があります。
eos要素とeop要素に属性はありません。これらは空要素であることが必要です。
num、wordおよびcompMem要素には、2つの必須属性off
とlenがあります。これらの要素の内容は、Oracle Textによって正規化されます。whitespace文字の空白文字への変換、隣接する複数の空白文字の単一空白文字への縮小、先頭および末尾の空白の削除、エンティティ参照の置換、および64バイトへの切捨てが行われます。
off
属性の値には0(ゼロ)から2147483647の整数を指定する必要があります。
len
属性の値には0(ゼロ)から65535の整数を指定する必要があります。
表2-29では、前述のXML Schemaに定義されている要素型について説明します。
表2-30では、前述のXML Schemaに定義されている属性について説明します。
表2-30 ユーザー定義レクサーの索引付けプロシージャXML Schema属性
属性 | 説明 |
---|---|
off |
トークン化するドキュメントに出現するトークンの文字オフセットを表します。 このオフセットは、データストアでフェッチされたドキュメントではなく、ユーザー定義レクサーの索引付けプロシージャに渡された文字ドキュメントに対するものです。データストアでフェッチされたドキュメントは、フィルタ・オブジェクトまたはセクション・グループ・オブジェクト(あるいはその両方)で事前処理されてから、ユーザー定義レクサーの索引付けプロシージャに渡される場合があります。 トークン化するドキュメントの最初の文字のオフセットは0(ゼロ)です。オフセット情報はUSC-2コードポイント・セマンティクスに準拠します。 |
len |
トークン化するドキュメントに出現するトークンの文字長を表します(SQL機能の この長さは、データストアでフェッチされたドキュメントではなく、ユーザー定義レクサーの索引付けプロシージャに渡された文字ドキュメントに対するものです。データストアでフェッチされたドキュメントは、フィルタ・オブジェクトまたはセクション・グループで事前処理されてから、ユーザー定義レクサーの索引付けプロシージャに渡される場合があります。 長さの情報はUSC-2コードポイント・セマンティクスに準拠します。 |
off
属性の値とlen
属性の値の合計は、トークン化するドキュメントの合計文字数以下である必要があります。これによって、ドキュメントのオフセットと参照される文字がドキュメント境界内に保持されます。
この項では、ユーザー定義レクサーの問合せプロシージャが戻すXMLドキュメントに適用される追加の制約について説明します。戻されるXMLドキュメントは、次のXML Schemaに対して妥当であることが必要です。
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="tokens"> <xsd:complexType> <xsd:sequence> <xsd:choice minOccurs="0" maxOccurs="unbounded"> <xsd:element name="num" type="QueryTokenType"/> <xsd:group ref="QueryCompositeGroup"/> </xsd:choice> </xsd:sequence> </xsd:complexType> </xsd:element> <!-- Enforce constraint that compMem element must be preceeded by word element or compMem element for query --> <xsd:group name="QueryCompositeGroup"> <xsd:sequence> <xsd:element name="word" type="QueryTokenType"/> <xsd:element name="compMem" type="QueryTokenType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:group> <!-- QueryTokenType defines an element with content and with an optional attribute --> <xsd:complexType name="QueryTokenType"> <xsd:simpleContent> <xsd:extension base="xsd:token"> <xsd:attribute name="wildcard" type="WildcardType" use="optional"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> <xsd:simpleType name="WildcardType"> <xsd:restriction base="WildcardBaseType"> <xsd:minLength value="1"/> <xsd:maxLength value="64"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="WildcardBaseType"> <xsd:list> <xsd:simpleType> <xsd:restriction base="xsd:unsignedShort"> <xsd:maxInclusive value="378"/> </xsd:restriction> </xsd:simpleType> </xsd:list> </xsd:simpleType> </xsd:schema>
次に、このXML Schemaによって適用される制約をいくつか説明します。
root
要素はトークンです。これは必須です。DIRECT_DATASTOREに属性はありません。
root
要素には、子要素を指定しないことも、1つ以上の子要素を指定することも可能です。子要素には、num
またはword
のいずれかの要素を指定できます。これらの子要素は、特定のトークン型を表します。
compMem
要素は、word
要素またはcompMem
要素の後に指定する必要があります。
compMem
の目的は、USER_LEXER
の問合せで、1つの問合せに対し複数の形式を戻せるようにすることです。たとえば、ユーザー定義のレクサーにより、銀行という語がBANK(FINANCIAL)
およびBANK(RIVER)
として索引付けされている場合、問合せプロシージャはword
要素として1つ目の語句を戻し、compMem
要素として2つ目の語句を戻すことができます。
<tokens> <word>BANK(RIVER)</word> <compMem>BANK(FINANCIAL)</compMem> </tokens>
compMem
要素の詳細は、表2-31の「ユーザー定義レクサーの問合せプロシージャXML Schema属性」を参照してください。
numおよびword要素には、1つのオプション属性wildcardがあります。これらの要素の内容は、Oracle Textによって正規化されます。whitespace文字の空白文字への変換、隣接する複数の空白文字の単一空白文字への縮小、先頭および末尾の空白の削除、エンティティ参照の置換、および64バイトへの切捨てが行われます。
wildcard属性の値は、空白で区切られた整数のリストです。整数の最小数は1で、最大数は64です。0から378の整数値を指定する必要があります。リスト内の整数の順序は任意に指定できます。
表2-29では、前述のXML Schemaに定義されている要素型について説明します。
表2-31では、前述のXML Schemaに定義されている属性について説明します。
表2-31 ユーザー定義レクサーの問合せプロシージャXML Schema属性
属性 | 説明 |
---|---|
|
|
|
問合せ内の%文字または_文字は、ユーザーがエスケープしないかぎり、他の文字で置換されるワイルド・カード文字とみなされます。問合せ内のワイルド・カード文字は、ワイルド・カード問合せ機能が正しく実行されるように、トークン化時に保持する必要があります。この属性は、要素の内容に含まれるワイルド・カード文字の文字オフセットを表します(SQL機能の 要素の内容に含まれる最初の文字のオフセットは0(ゼロ)です。オフセット情報はUSC-2コードポイント・セマンティクスに準拠します。 トークンにワイルド・カード文字が含まれていない場合、この属性は指定できません。 |
WORLD_LEXER
は、異なる複数の言語のドキュメントを含むテキスト列の索引付けに使用します。たとえば、このレクサーを使用して、英語、日本語およびドイツ語のドキュメントを格納するテキスト列を索引付けします。
WORLD_LEXER
は、ドキュメントの言語を自動的に識別するという点で、MULTI_LEXER
と異なります。MULTI_LEXER
と異なり、WORLD_LEXER
は、元表に言語列を設定したり、索引の作成時に言語列を指定したりする必要がありません。さらに、MULTI_LEXER
と同様に、サブレクサーを使用する必要もありません。(「MULTI_LEXER」を参照。)
WORLD_LEXER
は、すべてのデータベース・キャラクタ・セットをサポートしており、キャラクタ・セットがUnicodeベースの言語についてはUnicode 5.0標準をサポートしています。WORLD_LEXER
が機能できる言語のリストについては、「Worldレクサー機能」を参照してください。
ワードリスト・プリファレンスによって、使用している言語に対するステミングやファジー・マッチングなどの問合せオプションを使用可能にします。また、ワードリスト・プリファレンスを使用すると、サブストリングやプリフィックス索引付けを使用可能にでき、CONTAINS
およびCATSEARCH
によるワイルド・カード問合せのパフォーマンスが改善されます。
ワードリスト・プリファレンスを作成するには、BASIC_WORDLIST
を使用する必要があります。使用できるのはこの型のみです。
BASIC_WORDLIST
型を使用して、テキスト索引に対するステミングおよびファジー・マッチングを使用可能にしたり、プリフィックス索引を作成することができます。
表2-33に、BASIC_WORDLIST
の属性を示します。
表2-33 BASIC_WORDLIST属性
テキスト問合せでワード・ステミングに使用するステマーを指定します。STEMMER
に対して値を指定しない場合、デフォルトはENGLISH
です。
AUTO
を指定すると、データベース・セッションの言語設定に従って、システムが自動的にステミング言語を設定します。データベース言語がAMERICAN
またはENGLISH
の場合は、ENGLISH
ステマーが自動的に使用されます。それ以外の場合は、データベース・セッション言語にマップされたステマーが使用されます。
言語に対してステマーが存在しない場合、デフォルトはNULL
です。NULL
ステマーを使用すると、STEM演算子は問合せで無視されます。
独自のステミング・ディクショナリを作成できます。詳細は、「ステミング・ユーザー・ディクショナリ」を参照してください。
注意: BASIC_WORDLIST プリファレンスのSTEMMER 属性が無視されるのは、データベース・セッション言語に対応するために、MULTI_LEXER がwildcard_maxterms またはndata_base_letter と同じ設定のSUB_LEXER を選択する場合です。
この場合は、索引付け時に |
列に使用するファジー・マッチング・ルーチンを指定します。ファジー・マッチングは、現在、英語、日本語および一部のヨーロッパ言語に対してサポートされています。
注意: 中国語および韓国語のfuzzy_match 属性値は、英語および日本語のファジー・マッチング・ルーチンが、中国語および韓国語のテキストに使用されないようにするためのダミー属性値です。 |
fuzzy_match
のデフォルトはGENERIC
です。
AUTO
を指定すると、セッションの言語設定に従って、システムが自動的にファジー・マッチング言語を設定します。
デフォルトのファジー・スコアの下限を指定します。0から80の数を指定します。この数値未満のスコアを含むテキストは戻されません。デフォルトは60です。
ファジー・スコアは、拡張されたワードが問合せワードにどれだけ近いかという計測値です。スコアが高いほど適合する度合いが高くなります。このパラメータを使用して、ファジー拡張を最も適合する度合いに制限できます。
ファジー拡張の最大数を指定します。0から5000の数を指定します。デフォルトは100です。
ファジー拡張を設定することによって、拡張を最も適合するワードの指定値に制限できます。
Oracle TextにTRUE
を指定すると、サブストリング索引が作成されます。サブストリング索引を使用すると、%ingや%benz%のような左側切捨てまたは左右切捨てのワイルド・カード問合せが改善されます。デフォルトはFALSEです。
サブストリングの索引付けによって、索引付け処理およびディスク・リソースに対して、次のような影響があります。
索引作成およびDML処理が、最大4倍遅くなります。
substring_index
を使用可能にして索引を作成すると、サブストリング索引をオフにして作成するよりも、索引のフラッシュ時により多くのロールバック・セグメントが必要になります。サブストリング索引の作成時に、次のいずれかを実行することをお薦めします。
通常の2倍のロールバックを使用可能にします。
ディスクに対する索引フラッシュのサイズを縮小するために索引メモリーを減らします。
yes
を指定すると、プリフィックス索引付けが使用可能になります。プリフィックス索引付けを行うと、TO%のような右側切捨てのワイルド・カード検索のパフォーマンスが改善されます。デフォルトはNO
です。
注意: プリフィックス索引付けを行うと、索引サイズが増加します。 |
プリフィックス索引付けでは、トークンが複数のプリフィックスに切断され、$I表に格納されます。たとえば、TOKEN
やTOY
は、通常、$I表で次のように索引付けされます。
トークン | データ型 | 情報 |
---|---|---|
TOKEN | 0 | DOCID 1 POS 1 |
TOY | 0 | DOCID 1 POS 3 |
プリフィックス索引付けを使用すると、これらのトークンのプリフィックス・サブストリングが、6というトークン型で索引付けされます。
トークン | データ型 | 情報 |
---|---|---|
TOKEN | 0 | DOCID 1 POS 1 |
TOY | 0 | DOCID 1 POS 3 |
T | 6 | DOCID 1 POS 1 POS 3 |
TO | 6 | DOCID 1 POS 1 POS 3 |
TOK | 6 | DOCID 1 POS 1 |
TOKE | 6 | DOCID 1 POS 1 |
TOKEN | 6 | DOCID 1 POS 1 |
TOY | 6 | DOCID 1 POS 3 |
TO%
のようなワイルド・カード検索が高速化されます。これは、語句の拡張と結果セットのマージが実行されないためです。結果の取得に必要なのは、行(TO、6)の検索のみです。
索引付けされたプリフィックスの最小長を指定します。デフォルトは1です。
たとえば、prefix_min_length
を3に設定し、prefix_max_length
を5に設定すると、3から5文字までの長さのすべてのプリフィックスが索引付けされます。
注意: ワイルド・カード検索のパターンが最小長未満または最大長を超える場合は、同等化拡張およびマージという速度の遅い方法で検索が実行されます。 |
索引付けされたプリフィックスの最大長を指定します。デフォルトは64です。
たとえば、prefix_min_length
を3に設定し、prefix_max_length
を5に設定すると、3から5文字までの長さのすべてのプリフィックスが索引付けされます。
注意: ワイルド・カード検索のパターンが最小長未満または最大長を超える場合は、同等化拡張およびマージという速度の遅い方法で検索が実行されます。 |
ワイルド・カード(%)拡張での語句の最大数を指定します。このパラメータを使用して、ワイルド・カード問合せパフォーマンスを受入れ可能な制限内に保持します。ワイルド・カード問合せ拡張がこの制限数を超えると、エラーが戻されます。
注意: ワイルドカード文字しか含まないワイルドカード問合せを指定した検索語句、たとえば、% 、%_% 、%_ はストップワードとしてスレッド処理されます。 |
発音区別記号(ウムラウト、セディーユ、揚音アクセントなど)を持つ文字を、テキスト索引に格納する前またはNDATA
演算子による問合せ前に、基本形に変換するかどうかを指定します。デフォルトはFALSE
(基本文字変換は使用禁止)です。基本文字変換の詳細は、「基本文字変換」を参照してください。
ドイツ語、デンマーク語、およびスウェーデン語の代替スペルを使用可能にするかどうかを指定します。代替スペルを使用可能にすると、代替形式でNDATA
セクション・データの索引付けおよびNDATA
演算子を使用した問合せを実行できます。
ndata_base_letter
とndata_alternate_spelling
を同時に有効にすると、NDATA
セクション・データが代替スペル、基本文字の順にシリアルに変換されます。Oracle Textが使用する代替スペルの規則については、「代替スペル」を参照してください。
代替名前拡張に使用されるシソーラスの名前を指定します。索引付けエンジンはシソーラスのシノニム・リングを使用して、ドキュメントの名前を拡張します。ユーザーはシソーラスの同形異義語を明確にする機能を使用して、一般的なニックネームを区別します。
例を次に示します。
Albert SYN Al SYN Bert Alfred SYN Al SYN Fred
前述の簡単な定義を使用して、Albert、Alfred、Al、Bert、およびFredを同じシノニム・リングに配置します。このため、Bertの拡張にFredが含まれるといった予期しない結果が発生します。これを防止するため、同形異義語を明確にする機能を次のように使用できます。
Albert SYN Al (Albert) SYN Bert (Albert) Alfred SYN Al (Alfred) SYN Fred (Alfred)
Albert-Al-BertとAlfred-Al-Fredの2つのシノニム・リングが作成されます。したがって、Bertの拡張にFredが含まれなくなります。次に、詳細な例を示します。
begin ctx_ddl.create_preference('NDAT_PREF', 'BASIC_WORDLIST'); ctx_ddl.set_attribute('NDATA_PREF', 'NDATA_ALTERNATE_SPELLING', 'FALSE'); ctx_ddl.set_attribute('NDATA_PREF', 'NDATA_BASE_LETTER', 'TRUE'); ctx_ddl.set_attribute('NDATA_PREF', 'NDATA_THESAURUS', 'NICKNAMES'); end;
注意: 名前のサンプルのシソーラスは、$ORACLE_HOME/ctx/sample/thes ディレクトリにあります。このファイルはdr0thsnames.txt です。 |
準拠している名前と結合できるコロンで区切られた名前の不変化詞のリストを指定します。daなどの名前の不変化詞は、da VinciやdaVinciなどの準拠している名前を分割または結合して書き込みます。索引付けエンジンは、このプリファレンスで指定された名前の不変化詞を検索する場合に名前を分割したバージョンと結合したバージョンの両方の索引データを生成します。高度な再コールの問合せ処理も同様です。
次に、BASIC_WORDLIST
型を使用した例を示します。
次の例では、英語に対するステミングおよびファジー・マッチングを使用可能にします。プリファレンスSTEM_FUZZY_PREF
によって、拡張数が許容される最大数に設定されます。また、このプリファレンスによって、左右切捨て検索のパフォーマンスが向上するように、サブストリング索引がシステムで作成されます。
begin ctx_ddl.create_preference('STEM_FUZZY_PREF', 'BASIC_WORDLIST'); ctx_ddl.set_attribute('STEM_FUZZY_PREF','FUZZY_MATCH','ENGLISH'); ctx_ddl.set_attribute('STEM_FUZZY_PREF','FUZZY_SCORE','0'); ctx_ddl.set_attribute('STEM_FUZZY_PREF','FUZZY_NUMRESULTS','5000'); ctx_ddl.set_attribute('STEM_FUZZY_PREF','SUBSTRING_INDEX','TRUE'); ctx_ddl.set_attribute('STEM_FUZZY_PREF','STEMMER','ENGLISH'); end;
索引をSQLで作成するには、次の文を入力します。
create index fuzzy_stem_subst_idx on mytable ( docs ) indextype is ctxsys.context parameters ('Wordlist STEM_FUZZY_PREF');
次の例では、プリフィックスとサブストリングの索引付けに対してワードリスト・プリファレンスを設定します。プリフィックス索引付けに対して、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
wildcard_maxterms属性を使用して、ワイルド・カード拡張で使用できる語句の最大数を設定します。
--- create a sample table drop table quick ; create table quick ( quick_id number primary key, text varchar(80) ); --- insert a row with 10 expansions for 'tire%' insert into quick ( quick_id, text ) values ( 1, 'tire tirea tireb tirec tired tiree tiref tireg tireh tirei tirej'); commit; --- create an index using wildcard_maxterms=100 begin Ctx_Ddl.Create_Preference('wildcard_pref', 'BASIC_WORDLIST'); ctx_ddl.set_attribute('wildcard_pref', 'wildcard_maxterms', 100) ; end; / create index wildcard_idx on quick(text) indextype is ctxsys.context parameters ('Wordlist wildcard_pref') ; --- query on 'tire%' - should work fine select quick_id from quick where contains ( text, 'tire%' ) > 0; --- now re-create the index with wildcard_maxterms=5 drop index wildcard_idx ; begin Ctx_Ddl.Drop_Preference('wildcard_pref'); Ctx_Ddl.Create_Preference('wildcard_pref', 'BASIC_WORDLIST'); ctx_ddl.set_attribute('wildcard_pref', 'wildcard_maxterms', 5) ; end; / create index wildcard_idx on quick(text) indextype is ctxsys.context parameters ('Wordlist wildcard_pref') ; --- query on 'tire%' gives "wildcard query expansion resulted in too many terms" select quick_id from quick where contains ( text, 'tire%' ) > 0;
記憶域プリファレンスを使用して、テキスト索引に対応付けられた表に対して表領域および作成パラメータを指定します。システムには、BASIC_STORAGE
という単一の記憶域型があります。
BASIC_STORAGE
型は、テキスト索引を構成するデータベース表および索引に対する表領域および作成パラメータを指定します。
指定した句は、索引作成時に内部のCREATE
TABLE
(i_index_clause
の場合はCREATE
INDEX
)文に追加されます。記憶域、LOB記憶域、パーティション化などの句を指定できます。ただし、索引構成表句は指定しないでください。
関連項目: CREATE TABLE 文とCREATE INDEX 文の指定方法の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
BASIC_STORAGE
には次の属性があります。
表2-35 BASIC_STORAGE属性
属性 | 属性値 |
---|---|
dr$索引名$X索引作成用のパラメータ句。内部 この圧縮によってディスク領域が節約され、問合せパフォーマンスが向上するため、デフォルトをオーバーライドする場合は、パラメータ句に |
|
$I表のdr$ROWID列に対する$R索引のstorage句を指定するパラメータ句。内部 この句は、 |
|
dr$索引名$I表作成用のパラメータ句。内部 I表は索引データ表です。 注意: $I LOBに対して「disable storage in row」を指定しないことをお薦めします。指定すると、問合せパフォーマンスが大幅に低下します。 |
|
dr$索引名$K表作成用のパラメータ句。内部 K表はキーマップ表です。 |
|
dr$索引名$R表作成用のパラメータ句。内部 R表はROWID表です。 デフォルト句は、 この属性を変更する場合は、パフォーマンスを向上させるために、この句を必ず含めてください。 |
|
dr$索引名$N表作成用のパラメータ句。内部 N表はネガティブリスト表です。 |
|
内部 |
|
|
dr$索引名$S表作成用のパラメータ句*。内部 * パフォーマンス上の理由から、$S表は、データベース・ブロック・サイズが4KB以上の表領域に、オーバーフロー・セグメントと S表は、
|
デフォルトでは、BASIC_STORAGE
属性は設定されていません。このような場合は、索引所有者のデフォルト表領域にテキスト索引表が作成されます。ユーザーIUSER
によって入力され、BASIC_STORAGE
属性が設定されていない次の文について考えてみます。
create index IOWNER.idx on TOWNER.tab(b) indextype is ctxsys.context;
この例では、テキスト索引はIOWNER
のデフォルトの表領域に作成されます。
次の例では、索引表が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 users storage (initial 1K) lob (data) store as (disable storage in row cache)'); 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) compress 2'); ctx_ddl.set_attribute('mystore', 'P_TABLE_CLAUSE', 'tablespace foo storage (initial 1K)'); ctx_ddl.set_attribute('mystore', 'S_TABLE_CLAUSE', 'tablespace foo storage (initial 1K)'); end;
ドキュメント・セクションに対してWITHIN
問合せを入力するには、セクションを定義する前に、セクション・グループを作成する必要があります。セクション・グループは、CREATE INDEXのPARAMETERS句で指定します。
セクション・グループを作成する場合は、CTX_DDL.CREATE_SECTION_GROUPプロシージャを使用して次のグループ・タイプのいずれかを指定できます。
表2-36 セクション・グループ型
データ型 | 説明 |
---|---|
どのセクションも定義しないか、または |
|
このグループ・タイプを使用して、開始および終了タグが 注意: このグループ・タイプでは、対になっていないカッコ、コメント・タグおよび属性などの入力はサポートされません。これらを入力するには、 |
|
このグループ・タイプを使用して、HTMLドキュメントを索引付けし、HTMLドキュメントのセクションを定義します。 |
|
このグループ・タイプを使用して、XMLドキュメントを索引付けし、XMLドキュメントのセクションを定義します。索引付けされるセクションはすべて、このグループに対して手動で定義する必要があります。 |
|
このグループ・タイプを使用して、XMLドキュメントの開始タグ/終了タグに対して自動的にゾーン・セクションを作成します。XMLタグから導出されるセクション名は、XML内と同様に大/小文字が区別されます。 属性セクションは、属性を持つXMLタグに対して自動的に作成されます。属性セクションは、tag@attributeという形式でネーミングされます。
停止セクション、空のタグ、処理命令およびコメントは、索引付けされません。 自動セクション・グループには次の制限事項が適用されます。
|
|
このグループ・タイプを使用して、XMLドキュメントを索引付けします。このタイプは、 相違点は、このセクション・グループを使用すると、 |
|
このグループ・タイプを使用して、RFC 1036に従ったニュース・グループ形式のドキュメントのセクションを定義します。 |
次に、HTMLドキュメントとXMLドキュメントの両方でセクション・グループを使用する例を示します。
次の文は、HTMLグループ・タイプを使用してhtmgroup
というセクション・グループを作成します。
begin ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP'); end;
CTX_DDL
パッケージでCTX_DDL.ADD_SPECIAL_SECTION
プロシージャまたはCTX_DDL.ADD_ZONE_SECTION
プロシージャを使用して、このグループにオプションでセクションを追加できます。ドキュメントを索引付けするには、次の文を入力します。
create index myindex on docs(htmlfile) indextype is ctxsys.context parameters('filter ctxsys.null_filter section group htmgroup');
次の文は、XML_SECTION_GROUP
グループ・タイプを使用してxmlgroup
というセクション・グループを作成します。
begin ctx_ddl.create_section_group('xmlgroup', 'XML_SECTION_GROUP'); end;
CTX_DDL
パッケージでCTX_DDL.ADD_ATTR_SECTION
プロシージャまたはCTX_DDL.ADD_STOP_SECTION
プロシージャを使用して、このグループにオプションでセクションを追加できます。ドキュメントを索引付けするには、次の文を入力します。
create index myindex on docs(htmlfile) indextype is ctxsys.context parameters('filter ctxsys.null_filter section group xmlgroup');
次の文は、AUTO_SECTION_GROUP
グループ・タイプを使用してauto
というセクション・グループを作成します。このセクション・グループによって、XMLドキュメントのタグから自動的にセクションが作成されます。
begin
ctx_ddl.create_section_group('auto', 'AUTO_SECTION_GROUP');
end; CREATE INDEX myindex on docs(htmlfile) INDEXTYPE IS ctxsys.context PARAMETERS('filter ctxsys.null_filter section group auto');
この項では、CTX_CLS.TRAIN
およびCTXRULE
索引作成のプリファレンスの作成に使用する分類型について説明します。次の2つの分類型がサポートされています。
注意: Oracle Database XE Editionでは、データ・マイニング・オプションが使用できないため、RULE_CLASSIFIER およびSVM_CLASSIFIER はサポートされていません。これは、KMEAN_CLUSTERING も同様です。 |
RULE_CLASSIFIER
型を使用して、問合せルール生成プロシージャCTX_CLS.TRAIN
およびCTXRULE
作成のプリファレンスを作成します。この型を使用して生成されるルールは基本的に問合せ文字列で、簡単に調べることができます。この分類によって生成された問合せは、AND
、NOT
またはABOUT
演算子を使用できます。WITHIN
演算子は、フィールド・セクションに対する問合せの場合のみサポートされています。
この型の属性は、次のとおりです。
表2-37 RULE_CLASSIFIER属性
属性 | データ型 | デフォルト | 最小値 | 最大値 | 説明 |
---|---|---|---|---|---|
|
I |
50 |
1 |
99 |
ルール生成のしきい値(パーセント)を指定します。ルールは、その信頼度レベルがしきい値を超えた場合のみ出力されます。 |
|
I |
100 |
20 |
2000 |
各クラスについて、関連語句のリストがルール生成のために選択されます。各クラスについて選択可能な語句の最大数を指定します。 |
|
I |
500 |
10 |
4000 |
トレーニング用のメモリー使用量(MB)を指定します。大きい値を指定すると、パフォーマンスが向上します。 |
|
F |
0.001 |
0 |
0.90 |
語句選択のしきい値を指定します。関連語句を選択する際の2つのステップを導く2つのしきい値があります。このしきい値は、最初のステップの動作を制御します。このステップでは候補語句が選択されます。この候補語句は、次のステップでさらに検討されます。トレーニング・セット内のドキュメント数に対する語句の出現頻度の割合がこのしきい値を超えた場合に、その語句が選択されます。 |
|
I |
10 |
0 |
100 |
語句選択のしきい値(パーセント)を指定します。このしきい値は、2番目のステップの語句選択を制御します。各候補語句には、特定クラスとの相関関係を示す計算された数量があります。クラス内の全候補語句の最大値に対するこの数量値の割合がこのしきい値を超えた場合のみ、候補語句がそのクラスに対して選択されます。 |
|
I |
75 |
0 |
100 |
対象を広げるために、組込みの決定ツリーを削除する範囲を指定します。大きい値を指定すると、積極的に削除が行われ、生成されたルールの範囲が広くなりますが、精度は下がります。 |
SVM_CLASSIFIER
型を使用して、ルール生成プロシージャCTX_CLS.TRAIN
およびCTXRULE
作成のプリファレンスを作成します。この分類型は、分類のサポート・ベクター・マシン方法を表しており、バイナリ形式のルールを生成します。高精度の分類が必要な場合は、この分類型を使用します。
この型の属性は、次のとおりです。
表2-38 SVM_CLASSIFIER属性
属性名 | データ型 | デフォルト | 最小値 | 最大値 | 説明 |
---|---|---|---|---|---|
|
I |
50 |
10 |
8192 |
1つのドキュメントを表す語句の最大数を指定します。 |
|
I |
3,000 |
1 |
100,000 |
個別の機能の最大数を指定します。 |
|
B |
FALSE |
NULL |
NULL |
テーマを機能として使用するには、 テーマを使用した分類では、ナレッジ・ベースがインストールされている必要があります。ナレッジ・ベースは、Oracle Textとともにインストールされていない場合があります。ナレッジ・ベースの詳細は、『Oracle Textアプリケーション開発者ガイド』を参照してください。 |
|
B |
TRUE |
NULL |
NULL |
通常のトークンを機能として使用するには、 |
|
B |
FALSE |
NULL |
NULL |
ステミングされたトークンを機能として使用するには、 |
|
I |
500 |
10 |
4000 |
おおよそのメモリー・サイズ(MB)を指定します。 |
|
1 |
2 |
0 |
100 |
フィールド・セクションに通常の語として語句を追加するために、出現頻度の乗数を指定します。たとえば、デフォルトでは、"<A>cat</A>"のcatという語はフィールド・セクション語句で、出現頻度が2である通常の語として扱われるように指定できますが、上限は100まで可能です。 |
この項では、CTX_CLS.CLUSTERING
プロシージャのプリファレンスの作成に使用するクラスタ型について説明します。
注意: Oracle Database XE Editionでは、データ・マイニング・オプションが使用できないため、KMEAN_CLUSTERING はサポートされていません。これは、RULE_CLASSIFIER およびSVM_CLASSIFIER も同様です。 |
このクラスタリングの型の属性は、次のとおりです。
表2-39 KMEAN_CLUSTERING属性
属性名 | データ型 | デフォルト | 最小値 | 最大値 | 説明 |
---|---|---|---|---|---|
|
I |
50 |
10 |
8192 |
1つのドキュメントを表す個別の語句の最大数を指定します。 |
|
I |
3,000 |
1 |
500,000 |
個別の機能の最大数を指定します。 |
|
B |
FALSE |
NULL |
NULL |
テーマを機能として使用するには、 テーマを使用したクラスタリングでは、ナレッジ・ベースがインストールされている必要があります。ナレッジ・ベースは、Oracle Textとともにインストールされていない場合があります。ナレッジ・ベースの詳細は、『Oracle Textアプリケーション開発者ガイド』を参照してください。 |
|
B |
TRUE |
NULL |
NULL |
通常のトークンを機能として使用するには、 |
|
B |
FALSE |
NULL |
NULL |
ステミングされたトークンを機能として使用するには、 |
|
I |
500 |
10 |
4000 |
おおよそのメモリー・サイズ(MB)を指定します。 |
|
1 |
2 |
0 |
100 |
フィールド・セクションに通常の語として語句を追加するために、出現頻度の乗数を指定します。たとえば、デフォルトでは、"<A>cat</A>"のcatという語はフィールド・セクション語句で、出現頻度が2である通常の語として扱われるように指定できますが、上限は100まで可能です。 |
|
I |
200 |
2 |
20000 |
生成されるリーフ・クラスタの合計数を指定します。 |
ストップリストによって、言語にある索引付けしないワードが識別されます。英語の場合、索引付けしないストップテーマも識別できます。デフォルトでは、データベースの言語に対応してシステムが提供するストップリストを使用して、テキストの索引付けが行われます。
Oracle Textでは、英語、フランス語、ドイツ語、スペイン語、中国語、オランダ語およびデンマーク語を含むほとんどの言語に対して、デフォルトのストップリストが提供されています。これらのデフォルト・ストップリストには、ストップワードのみが含まれます。
言語固有のストップワードを保持するマルチ言語のストップリストを作成できます。マルチ言語のストップリストは、MULTI_LEXER
を使用した英語、ドイツ語などの異なる言語のドキュメントを含む表の索引付けに有効です。
マルチ言語のストップリストを作成するには、CTX_DLL.CREATE_STOPLISTプロシージャを使用して、MULTI_STOPLIST
というストップリスト・タイプを指定します。CTX_DDL.ADD_STOPWORDを使用して言語固有のストップワードを追加します。
索引付け時に、各ドキュメントの言語列が調べられ、その言語のストップワードのみが排除されます。問合せ時に、セッション言語の設定によって、アクティブなストップワードが特定されます。これは、マルチレクサーの使用時にアクティブなレクサーが特定されるのと同様です。
CTX_DLL.CREATE_STOPLISTプロシージャを使用して、独自のストップリストを作成します。このプロシージャを使用すると、単一言語ストップリストのBASIC_STOPLIST
またはマルチ言語ストップリストのMULTI_STOPLIST
を作成できます。
独自のストップリストを作成して使用する場合は、このリストをCREATE
INDEX
のPARAMETERS句に指定する必要があります。
中国語または日本語のストップリストを作成するには、それぞれCHINESE_LEXER
またはJAPANESE_LEXER
を使用して、該当のレキシコンを@contained_such_stopwordsに更新します。
デフォルトのストップリストは、常にCTXSYS.DEFAULT_STOPLISTという名前です。このストップリストを変更するには、次のプロシージャを使用します。
CTX_DDL.ADD_STOPWORD
CTX_DDL.REMOVE_STOPWORD
CTX_DDL.ADD_STOPTHEME
CTX_DDL.ADD_STOPCLASS
CTX_DDL
パッケージを使用してCTXSYS.DEFAULT_STOPLIST
を変更した場合は、変更を有効にするために索引を再作成する必要があります。
ALTER INDEXを使用して、ストップワードをデフォルトまたはカスタムのストップリストに動的に追加できます。ストップワードを動的に追加する場合、ワードはすぐにストップワードになり、索引から削除されるため、再索引付けする必要はありません。
注意: ストップワードは、索引に動的に追加できますが、動的に削除することはできません。ストップワードを削除するには、CTX_DDL.REMOVE_STOPWORDを使用して索引を削除してから、再度索引付けをする必要があります。 |
Oracle Textをインストールすると、いくつかの索引付けプリファレンスが作成されます。CREATE INDEXのPARAMETERS句にこれらの索引付けプリファレンスを使用することができる他、独自に定義することもできます。
デフォルトの索引パラメータは、この項で説明するシステム定義プリファレンスのいくつかにマップされます。
システム定義のプリファレンスは、次のカテゴリに分類されています。
この項では、データ記憶域プリファレンスに関連付けられた型について説明します。
このプリファレンスは、DIRECT_DATASTORE型を使用します。このプリファレンスを使用して、テキストが列に直接格納されているテキスト列に対して索引を作成します。
この項では、フィルタ処理プリファレンスに関連付けられた型について説明します。
このプリファレンスは、NULL_FILTER型を使用します。
このプリファレンスは、AUTO_FILTER型を使用します。
この項では、レクサー・プリファレンスに関連付けられた型について説明します。
デフォルトのレクサーは、インストール時に使用した言語によって異なります。次の各項では、各言語のCTXSYS.DEFAULT_LEXER
のデフォルト設定について説明します。
使用言語がデンマーク語の場合、このプリファレンスは次のオプションを使用可能にしてBASIC_LEXERを使用します。
代替スペル(alternate_spelling属性をDANISH
に設定)
使用言語がオランダ語の場合、このプリファレンスは次のオプションを使用可能にしてBASIC_LEXERを使用します。
コンポジット索引付け(composite
属性をDUTCH
に設定)
使用言語がドイツ語の場合、このプリファレンスは次のオプションを使用可能にしてBASIC_LEXERを使用します。
大/小文字が区別される索引付け(mixed_case
属性を使用可能)
コンポジット索引付け(composite
属性をGERMAN
に設定)
代替スペル(alternate_spelling
属性をGERMAN
に設定)
使用言語がフィンランド語、ノルウェー語またはスウェーデン語の場合、このプリファレンスは次のオプションを使用可能にしてBASIC_LEXERを使用します。
代替スペル(alternate_spelling属性をSWEDISH
に設定)
使用言語が韓国語の場合、このプリファレンスはKOREAN_MORPH_LEXERを使用します。KOREAN_MORPH_LEXER
用のすべての属性が使用可能になります。
この項では、ストップリスト・プリファレンスに関連付けられた型について説明します。
この項では、記憶域プリファレンスに関連付けられた型について説明します。
この記憶域プリファレンスは、BASIC_STORAGE型を使用します。
この項では、ワードリスト・プリファレンスに関連付けられた型について説明します。
このプリファレンスは、使用するデータベース言語に対して言語ステマーを使用します。使用している言語が表2-33に記載されていない場合、このプリファレンスは、NULL
ステマーおよびGENERIC
ファジー・マッチング属性にデフォルト設定されます。
この項では、Oracle Textのシステム・パラメータについて説明します。システム・パラメータは次のカテゴリに分類されます。
Oracle Textをインストールすると、システム定義プリファレンスの他に、次のシステム・パラメータが設定されます。
表2-40 汎用システム・パラメータ
システム・パラメータ | 説明 |
---|---|
|
|
|
|
|
|
関連項目: 「CTX_DOC.SET_KEY_TYPE」 |
システムのデフォルト値は、CTX_PARAMETERSビューを問い合せて表示します。デフォルトは、CTX_ADM.SET_PARAMETERプロシージャを使用して変更します。
この項では、CONTEXT
索引およびCTXCAT
索引の作成時に使用できる索引パラメータについて説明します。
次のデフォルトのパラメータは、CONTEXT
索引の作成時にCREATE INDEXのPARAMETERS句にプリファレンスを指定しない場合に使用されます。デフォルトの各パラメータによって、データ記憶域、フィルタ処理、レクサー処理などに使用するためにシステム定義プリファレンスが指定されます。
表2-41 デフォルトのCONTEXT索引のパラメータ
パラメータ | 使用される場合 | デフォルト値 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
次のデフォルトの各パラメータは、CREATE
INDEX
を使用したCTXCAT
索引の作成時に、そのパラメータ文字列にパラメータを指定しない場合に使用されます。CTXCAT
索引は、索引セット、レクサー、記憶域、ストップリストおよびワードリストのパラメータのみをサポートしています。デフォルトの各パラメータによって、システム定義プリファレンスが指定されます。
表2-42 デフォルトのCTXCAT索引のパラメータ
パラメータ | 使用される場合 | デフォルト値 |
---|---|---|
|
該当なし |
|
|
|
|
|
|
|
|
|
|
|
|
表2-43に示すデフォルトの各パラメータは、CREATE
INDEX
を使用したCTXRULE
索引の作成時に、そのパラメータ文字列にパラメータを指定しない場合に使用されます。CTXRULE
索引は、レクサー、記憶域、ストップリストおよびワードリストのパラメータのみをサポートしています。デフォルトの各パラメータによって、システム定義プリファレンスが指定されます。
表2-43 デフォルトのCTXRULE索引のパラメータ
パラメータ | 使用される場合 | デフォルト値 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
PARAMETER句に分類プリファレンスが指定されていない場合 |
|
CTXRULE
索引では、次の問合せ演算子をサポートしていません。
FUZZY
SOUNDEX
また、次のBASIC_WORDLIST
属性もサポートしていません。
SUBSTRING_INDEX
PREFIX_INDEX
システムのデフォルト値は、CTX_PARAMETERSビューを問い合せて表示します。たとえば、すべてのパラメータと値を表示する場合は、次の文を入力します。
SQL> SELECT par_name, par_value from ctx_parameters;
CTX_ADM.SET_PARAMETERプロシージャを使用して、別のカスタム・プリファレンス名またはシステム定義プリファレンス名をデフォルト値として指定するように変更します。