CREATE HYBRID VECTOR INDEX
CREATE HYBRID VECTOR INDEX
SQL文を使用してハイブリッド・ベクトル索引を作成します。これにより、ドキュメントの索引付けおよび全文検索とベクトル類似検索の組合せを使用した問合せを行うことができます。
用途
ハイブリッド・ベクトル索引と呼ばれる特殊なドメイン索引のクラスを作成します。
ハイブリッド・ベクトル索引は、既存のOracle Text索引データ構造とベクトル索引データ構造を1つの統一構造に組み合せるOracle TextのSEARCH INDEX
型です。これは、ドキュメントのテキスト・フィールドとベクトル・フィールドの両方を格納する単一ドメインの索引です。テキスト検索と類似検索は、それぞれトークン化された語句とベクトルに対して実行されます。2つの検索結果が結合およびスコアリングされて、統合された結果セットが返されます。
ハイブリッド・ベクトル索引の目的は、ユーザーがベクトルとキーワードの両方で検索できるようにすることで、Oracle Text索引の検索関連性を高めることです。従来のキーワードベースのテキスト検索をベクトルベースの類似検索と統合することで、全体的な検索エクスペリエンスを向上させ、より正確な情報をユーザーに提供できます。
使用上の注意
ハイブリッド・ベクトル索引を作成するには、次のような最小限の情報を指定できます:
-
索引を作成する表または列
-
埋込みを生成するためのデータベース内のONNX埋込みモデル
複数の列または表をまとめて索引付けする必要がある場合は、MULTI_COLUMN_DATASTORE
またはUSER_DATASTORE
プリファレンスを指定できます。
他のすべての索引付けパラメータは、ドキュメントの索引付けを容易にするために事前定義されており、ユーザーはテキスト処理、チャンク化または埋込みの戦略のエキスパートである必要はありません。必要に応じて、次のものを使用して事前定義済パラメータを変更できます:
-
索引のベクトル索引の部分のベクトル検索プリファレンス
-
索引のテキスト索引の部分のテキスト検索プリファレンス
-
結合された索引に対するDML操作の索引メンテナンス・プリファレンス
ハイブリッド・ベクトル索引の作成プロセスの詳細、またはハイブリッド・ベクトル索引の概要は、「ハイブリッド・ベクトル索引の理解」を参照してください。
ノート:
ハイブリッド・ベクトル索引を作成および使用する際に注意する必要がある重要な点がいくつかあります。「ハイブリッド・ベクトル索引のガイドラインおよび制限事項」を参照してください。構文
CREATE HYBRID VECTOR INDEX [schema.]index_name ON
[schema.]table_name(column_name)
PARAMETERS ('paramstring')
[FILTER BY filter_column[, filter_column]...]
[ORDER BY oby_column[desc|asc][, oby_column[desc|asc]]...]
[PARALLEL n];
最小限必要なパラメータのみを指定したDDLの例を次に示します。
CREATE HYBRID VECTOR INDEX my_hybrid_idx on
doc_table(text_column)
PARAMETERS('MODEL my_embed_model');
このセクションの最後には、より包括的な例が示されています。
すべての必須およびオプションの索引付けパラメータを確認します:
- [schema.]index_name
-
作成するハイブリッド・ベクトル索引の名前を指定します。
- [schema.]table_name(column_name)
-
ハイブリッド・ベクトル索引を作成する表および列の名前を指定します。
VARCHAR2
、CLOB
およびBLOB
データ型を使用して、1つ以上のテキスト列にハイブリッド・ベクトル索引を作成できます。ノート:
IS JSON
チェック制約を使用するテキスト列には、ハイブリッド・ベクトル索引を作成できません。HTML、PDF、Microsoft Wordおよびプレーン・テキストを含むほとんどのドキュメント形式を索引付けできるため、サポートされているタイプをテキスト列にロードできます。完全なリストについては、サポートされているドキュメント形式を参照してください。
複数の列または表をまとめて索引付けする必要がある場合は、データストア・プリファレンスを指定します(後述の「テキスト検索プリファレンス」を参照)。
- PARAMETERS (paramstring)
-
paramstring
でプリファレンスを指定します:-
ベクトル検索プリファレンス:
ベクトル検索の入力処理に関連する、ハイブリッド・ベクトル索引の「ベクトル索引」の部分を構成します。
ノート:
PARAMETERS
句に最低限の一連のパラメータ(必須のMODEL
およびオプションのVECTOR_IDXTYPE
パラメータ)を直接渡すか、ベクトル化プリファレンスを使用してベクトル検索パラメータの完全なセットを指定できます。PARAMETERS
句で両方(パラメータの直接設定とベクトル化)を使用することはできません。-
MODEL
およびVECTOR_IDXTYPE
を直接指定した場合:CREATE HYBRID VECTOR INDEX [schema.]index_name ON [schema.]table_name(column_name) PARAMETERS ('MODEL <model_name> [VECTOR_IDXTYPE <vector_index_type>]') [FILTER BY filter_column[, filter_column]...] [ORDER BY oby_column[desc|asc][, oby_column[desc|asc]]...] [PARALLEL n];
ここで、
MODEL
には、入力データに対するベクトル埋込みを生成するためにデータベースにインポートするベクトル埋込みモデルを指定します。ノート:
現在、ONNXのデータベース内の埋込みモデルのみがサポートされています。VECTOR_IDXTYPE
には、作成するベクトル索引のタイプを指定します。たとえば、Inverted File Flat (IVF)ベクトル索引の場合はIVF
(デフォルト)、Hierarchical Navigable Small World (HNSW)ベクトル索引の場合はHNSW
などです。このパラメータを省略すると、IVFベクトル索引がデフォルトで作成されます。ハイブリッド・ベクトル索引での
LOCAL
索引の作成は、基礎となるindex_type
がIVF
の場合にサポートされます。次に例を示します。CREATE HYBRID VECTOR INDEX my_hybrid_idx on doc_table(text_column) parameters('MODEL my_doc_model VECTOR_IDXTYPE IVF') LOCAL PARALLEL;
注意:
基礎となるindex_type
がHNSW
の場合にハイブリッド・ベクトル索引にLOCAL
索引を作成すると、ドキュメント処理を開始する前にエラーがスローされます(初期障害)。 -
ベクトル化プリファレンスを使用する場合:
ベクトル化プリファレンスは、チャンク化(
UTL_TO_CHUNKS
またはVECTOR_CHUNKS
)、埋込み(UTL_TO_EMBEDDING
、UTL_TO_EMBEDDINGS
またはVECTOR_EMBEDDING
)およびベクトル索引(distance
、accuracy
またはvector_idxtype
)に関連するすべての索引付けパラメータをまとめて保持するJSONオブジェクトです。ベクトル化プリファレンスを作成するには、
DBMS_VECTOR_CHAIN.CREATE_PREFERENCE
PL/SQLファンクションを使用します。ベクトル化プリファレンスを作成するには、DBMS_VECTOR_CHAIN.CREATE_PREFERENCEを参照してください。ベクトル化プリファレンスを作成した後、
VECTORIZER
パラメータを使用してプリファレンス名をここで渡すことができます。次に例を示します。begin DBMS_VECTOR_CHAIN.CREATE_PREFERENCE( 'my_vectorizer_pref', dbms_vector_chain.vectorizer, json('{ "vector_idxtype": "hnsw", "model" : "my_doc_model", "by" : "words", "max" : 100, "overlap" : 10, "split" : "recursively" }' )); end; / CREATE HYBRID VECTOR INDEX my_hybrid_idx on doc_table(text_column) parameters('VECTORIZER my_vectorizer_pref');
-
-
テキスト検索プリファレンス:
キーワード検索の入力処理に関連する、ハイブリッド・ベクトル索引の「Oracle Text索引」の部分を構成します。
これらのパラメータは、ハイブリッド・ベクトル索引付けパイプラインのテキスト処理およびトークン化のステージを定義します。これらはすべて、Oracle Text索引のみの操作時に指定する一連のパラメータと同じです。
[DATASTORE datastore_pref] [STORAGE storage_pref] [MEMORY memsize] [STOPLIST stoplist] [LEXER lexer_pref] [FILTER filter_pref] [WORDLIST wordlist_pref] [SECTION GROUP section_group]
- DATASTORE datastore_pref
-
データストア・プリファレンスの名前を指定します。ソース・ファイルが格納されるローカルまたはリモートの場所を指定するには、データストア・プリファレンスを使用します。
複数の列または表をまとめて索引付けする場合は、「MULTI_COLUMN_DATASTORE」および「USER_DATASTORE」を参照してください。
すべてのデータストア・プリファレンスの詳細なリストは、「データストア型」を参照してください。
デフォルト:
DIRECT_DATASTORE
- STORAGE storage_pref
-
Oracle Text検索索引用のストレージ・プリファレンスの名前を指定します。記憶域プリファレンスを使用して、索引表の格納方法を指定します。記憶域タイプを参照してください。
- MEMORY memsize
-
索引付けに使用するランタイム・メモリー量を指定します。
memsize = number[K|M|G]
KはKB、MはMB、GはGBを表します。
memsize
の値は、1MからCTX_PARAMETERS
ビューのMAX_INDEX_MEMORY
の値までの間で指定する必要があります。MAX_INDEX_MEMORY
より大きいメモリー・サイズを指定するには、CTX_ADM.SET_PARAMETER
を使用してこのパラメータをmemsize
以上にリセットする必要があります。CTX_ADM.SET_PARAMETERを参照してください。Oracle Text検索索引のデフォルトは500 MBです。
memsize
パラメータは、索引付けに使用するメモリー量を指定します。使用量が指定値を超えると、索引がディスクにフラッシュされます。大きいメモリー量を指定すると、I/Oが削減されるため索引付けのパフォーマンスが向上します。また、断片化も削減されるため問合せのパフォーマンスおよびメンテナンスが向上します。小さいメモリー量を指定すると、ディスクI/Oおよび索引の断片化が増加しますが、ランタイム・メモリーが不足している場合に有効なことがあります。
- STOPLIST stoplist
-
ストップリストの名前を指定します。ストップリストを使用して、索引付けの対象でないワードを識別します。CTX_DDL.CREATE_STOPLISTを参照してください。
デフォルト:
CTXSYS.DEFAULT_STOPLIST
- LEXER lexer_pref
-
レクサー・プリファレンスまたはマルチレクサー・プリファレンスの名前を指定します。レクサー・プリファレンスを使用して、テキストの言語およびテキストを索引付け用にトークン化する方法を識別します。レクサー・タイプを参照してください。
デフォルト:
CTXSYS.DEFAULT_LEXER
- FILTER filter_pref
-
フィルタ・プリファレンスの名前を指定します。フィルタ・プリファレンスを使用して、フォーマットされたドキュメントをプレーン・テキストにフィルタ処理する方法を指定します。フィルタ・タイプを参照してください。
バイナリ・テキスト列のデフォルトは
NULL_FILTER
です。バイナリ・テキスト列のデフォルトはAUTO_FILTER
です。 - WORDLIST wordlist_pref
-
ワードリスト・プリファレンスの名前を指定します。ワードリスト・プリファレンスを使用して、ファジー、ステミングおよびプリフィックス索引付けなどの機能を有効化すると、ワイルド・カード検索のパフォーマンスが向上します。ワードリスト・タイプを参照してください。
- SECTION GROUP section_group
-
セクション・グループの名前を指定します。セクション・グループは、構造化ドキュメントにセクションを作成する場合に使用します。CTX_DDL.CREATE_SECTION_GROUPを参照してください。
デフォルト:
NULL_SECTION_GROUP
-
索引メンテナンス・プリファレンス:
ハイブリッド・ベクトル索引全体に対するDML操作(つまり、索引を同期および最適化する方法)を構成します。
ハイブリッド・ベクトル索引は基本的にOracle Textの検索索引タイプであるため、Oracle Text索引のメンテナンス固有のすべての機能を適用できます。
[MAINTENANCE AUTO | MAINTENANCE MANUAL] [SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)] [OPTIMIZE (MANUAL | AUTO_DAILY | EVERY "interval-string")]
- MAINTENANCE AUTO | MAINTENANCE MANUAL
-
実表に対する挿入、更新または削除があるときのハイブリッド・ベクトル索引の同期のためのメンテナンス・タイプを指定します。索引に指定されたメンテナンス・タイプは、すべての索引パーティションに適用されます。
次のいずれかのメンテナンス・タイプを指定できます。
メンテナンス・タイプ 説明 MAINTENANCE AUTO
このメソッドは、索引を自動メンテナンスに設定します。つまり、索引は最適な間隔でバックグラウンドで自動的に同期されます。
SYNC
タイプを手動で構成したり、同期間隔を設定する必要はありません。バックグラウンド・メカニズムは、DMLキューを追跡することで、同期間隔を自動的に決定し、バックグラウンドのSYNC.INDEX
操作をスケジュールします。MAINTENANCE MANUAL
このメソッドは、索引を手動メンテナンスに設定します。これは、
MANUAL
、EVERY
、ON COMMIT
などのSYNC
タイプを指定できる非自動メンテナンス(同期)モードです。 - SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)
-
実表に対する挿入、更新または削除があるときのハイブリッド・ベクトル索引の同期のための
SYNC
タイプを指定します。これらのSYNC
設定は、手動メンテナンスに設定されている索引にのみ適用されます。ノート:
デフォルトでは、ハイブリッド・ベクトル索引は自動メンテナンス・モード(MAINTENANCE AUTO
)で実行されます。つまり、DMLは最適な間隔でバックグラウンドで索引に自動的に同期されます。したがって、ハイブリッド・ベクトル索引を維持するために、SYNC
タイプを手動で構成する必要はありません。ただし、必要に応じて、索引のデフォルト設定を変更する場合は手動で構成できます。次の
SYNC
メソッドのいずれかを指定できます:SYNCタイプ 説明 MANUAL
この方法では、自動同期は行われません。
CTX_DDL.SYNC_INDEX
を使用して、索引を手動で同期化する必要があります。EVERY
interval-stringスケジューラ・ジョブの場合と同じ構文をとるinterval-stringの値で指定された一定の間隔で、索引を自動的に同期化します。
EVERY
を使用した自動同期化の場合、索引作成者にCREATE
JOB
権限が必要です。interval-stringが、前の同期化ジョブを完了できる十分な長さの期間に設定されていることを確認してください。そうしないと、同期化ジョブが応答を停止する可能性があります。interval-string引数は、二重引用符('' '')で囲む必要があります。
ON
COMMIT
コミットの直後に索引を同期化します。コミットは、同期化が完了するまで戻りません。
この操作は、memoryパラメータで指定されたメモリーを使用します。
この同期タイプは、
STAGE_ITAB
索引オプションが有効なときに最も有効に機能します。有効でない場合、主な索引が大幅に断片化し、頻繁なOPTIMIZE
コールが必要になります。自動(
EVERY
)同期化の場合は、メモリー・サイズおよびパラレル同期化を指定できます。interval-string引数で繰返しスケジュールを定義するには、カレンダ構文の値を使用します。これらの値の詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。構文:SYNC [EVERY "interval-string"] MEMORY mem_size PARALLEL paradegree
たとえば、索引を20秒間隔で同期するには:SYNC [EVERY "freq=secondly;interval=20"] MEMORY 500M PARALLEL 2
- OPTIMIZE (MANUAL | AUTO_DAILY | EVERY "interval-string)
-
ハイブリッド・ベクトル索引の自動バックグラウンド索引最適化を有効にするには、
OPTIMIZE
を指定します。次のいずれかのOPTIMIZE
メソッドを指定できます。OPTIMIZEタイプ 説明 MANUAL
自動最適化は提供されません。
CTX_DDL.OPTIMIZE_INDEX
を使用して、手動で索引を最適化する必要があります。AUTO_DAILY
これはデフォルトの設定です。
OPTIMIZE (AUTO_DAILY)
を指定した場合、最適化FULL
ジョブが、ローカル時間の午前0時から毎日実行されるようにスケジュールされます。EVERY "interval-string"
定期的な間隔で
token
最適化を自動実行します。この間隔は、スケジューラ・ジョブと同じ構文のinterval-string値で指定します。interval-stringは、前の最適化ジョブを完了できる十分な長さの期間に設定してください。そうしないと、最適化ジョブが応答しなくなる可能性があります。interval-stringは二重引用符で囲む必要があります。interval-string内の一重引用符は、前にエスケープ文字としてもう1つ一重引用符を指定する必要があります。
AUTO_DAILY | EVERY "interval-string"
の設定では、パラレル最適化を指定できます。構文:
OPTIMIZE [AUTO_DAILY | EVERY "interval-string"] PARALLEL paradegree ...
たとえば、索引を20分間隔で最適化するには:OPTIMIZE [EVERY "freq=minutely;interval=20"] PARALLEL 2
-
- FILTER BY filter_column
-
複合問合せの
WHERE
句の範囲述語または等価述語の対象となる、構造化された索引列を指定します。filter_column
に対して1つ以上の構造化列を指定できます。この列に対して、問合せでCONTAINS()
述語とともに関係述語を指定できます。-
次の関係演算子を使用できます:
<
、<=
、=
、>=
、>
、between
およびLIKE
(VARCHAR2
の場合) -
これらの列に使用できる型は、
CHAR
、NUMBER
、DATE
、VARCHAR2
またはRAW
のみです。また、CHAR
、VARCHAR2
およびVARCHAR2
型がサポートされるのは、最大長が指定されており、249バイトを超えない場合のみです。CHAR
列またはVARCHAR2
列の最大長を文字数で指定する場合(たとえば、VARCHAR2
(50CHAR
))、それをFLOOR
(249/max_char_width
)より長くすることはできません。ここでのmax_char_width
は、データベース文字セット内の文字の最大幅です。たとえば、データベース文字セットがAL32UTF8の場合は、指定する最大列長を62文字より長くはできません。サポートされている型(
CHAR
、NUMBER
、DATE
、VARCHAR2
またはRAW
)のADT
属性も使用できます。これ以外のデータ型の場合はエラーが発生します。たとえば、式
func(cola)
および仮想列は使用できません。 -
FILTER
BY
列リストでtxt_column
を使用できます。 -
FILTER
BY
列のDML操作は常にトランザクション型です。
-
- ORDER BY oby_column[desc|asc]
-
問合せ結果のソートに使用する1つ以上の構造化索引付き列を指定します。
構造化されたoby_columnsのリストを指定できます。これらの列に使用できる型は、
CHAR
、NUMBER
、DATE
、VARCHAR2
またはRAW
のみです。249
バイトより長いVARCHAR2
およびRAW
列は、最初の249
バイトに切り捨てられます。式(func(cola)
など)および仮想列は使用できません。指定した列の順序が重要です。問合せの
ORDER BY
句には、次のものを含めることができます:-
順序付けされた
ORDER BY
列全体 -
順序付けされた
ORDER BY
列の接頭辞のみ -
スコアとそれに続く順序付けされた
ORDER BY
列の接頭辞
DESC
は結果を降順(最も大きい値から最も小さい値)でソートし、ASC
(デフォルト)は結果を昇順(最も小さい値から最も大きい値)でソートします。 -
- [PARALLEL n]
-
複数のCPUがある場合、パラレル索引付けにより、索引のパフォーマンスが向上します。索引をパラレルに作成するには、並列度を使用して
PARALLEL
句を使用します。オプションで、パラレル索引付けに対する並列度を指定します。実際の並列度は、リソースによっては多少低くなります。このパラメータは、非パーティション表に使用できます。ただし、パラレルで作成された非パーティション索引の場合、パラレル問合せ処理は実行されません。ローカル・パーティション索引を作成するために、パラレル索引付けがサポートされるようになりました。
パラメータ句に指定される索引付けのメモリー・サイズは、各パラレル・ワーカーに適用されます。たとえば、パラメータ句に指定された索引付けのメモリー・サイズが500MBで、並列度が2の場合は、索引付けのための少なくとも1GBのメモリーを使用できるようにする必要があります。
例
-
ベクトル検索のプリファレンスが直接指定されている場合:
この例では、必須パラメータ
model
のみがPARAMETERS
句に指定されています:CREATE HYBRID VECTOR INDEX my_hybrid_idx on doc_table(text_column) parameters('MODEL my_doc_model');
この例では、パラメータ
model
とvector_idxtype
の両方が指定されています:CREATE HYBRID VECTOR INDEX my_hybrid_idx on doc_table(text_column) parameters('MODEL my_doc_model VECTOR_IDXTYPE HNSW');
-
ベクトル検索のプリファレンスがVECTORIZERを使用して指定されている場合:
この例では、
PARAMETERS
句でvectorizer
パラメータを使用して、my_vectorizer_spec
プリファレンスを指定します:begin DBMS_VECTOR_CHAIN.CREATE_PREFERENCE( 'my_vectorizer_spec', dbms_vector_chain.vectorizer, json('{"vector_idxtype" : "hnsw", "model" : "my_doc_model", "by" : "words", "max" : 100, "overlap" : 10, "split" : "recursively"}')); end; / CREATE HYBRID VECTOR INDEX my_hybrid_idx on doc_table(text_column) parameters('VECTORIZER my_vectorizer_spec');
-
テキスト検索およびベクトル検索のプリファレンスが直接指定されている場合:
この例では、必須のベクトル検索パラメータ
MODEL
のみがPARAMETERS
句に指定されています。テキスト検索パラメータも指定します:CREATE HYBRID VECTOR INDEX my_hybrid_idx on doc_table(text_column) parameters('MODEL my_doc_model DATASTORE my_datastore STORAGE my_storage STOPLIST my_stoplist LEXER my_lexer') ORDER BY docid asc;
-
テキスト検索および索引メンテナンスのプリファレンスが直接指定され、ベクトル検索プリファレンスがVECTORIZERを使用して指定されている場合:
この例では、
VECTORIZER
パラメータを使用して、ベクトル検索パラメータを保持するmy_vectorizer_spec
プリファレンスを指定します。すべてのテキスト検索および索引メンテナンス・プリファレンスが直接指定されます。begin DBMS_VECTOR_CHAIN.CREATE_PREFERENCE( 'my_vectorizer_spec', dbms_vector_chain.vectorizer, json('{ "vector_idxtype" : "hnsw", "model" : "my_doc_model", "by" : "words", "max" : 100, "overlap" : 10, "split" : "recursively" }' )); end; / CREATE HYBRID VECTOR INDEX my_hybrid_idx on doc_table(text_column) parameters('VECTORIZER my_vectorizer_spec DATASTORE my_datastore STORAGE my_storage MEMORY 128M MAINTENANCE AUTO OPTIMIZE AUTO_DAILY STOPLIST my_stoplist LEXER my_lexer FILTER my_filter WORDLIST my_wordlist SECTION GROUP my_section_group') FILTER BY category, author ORDER BY score(10), score(20) desc PARALLEL 3;
親トピック: ハイブリッド・ベクトル索引の管理