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)

ハイブリッド・ベクトル索引を作成する表および列の名前を指定します。VARCHAR2CLOBおよび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_typeIVFの場合にサポートされます。次に例を示します。

      CREATE HYBRID VECTOR INDEX my_hybrid_idx on 
      doc_table(text_column) 
      parameters('MODEL my_doc_model
                  VECTOR_IDXTYPE IVF')
      LOCAL PARALLEL;

      注意:

      基礎となるindex_typeHNSWの場合にハイブリッド・ベクトル索引にLOCAL索引を作成すると、ドキュメント処理を開始する前にエラーがスローされます(初期障害)。
    • ベクトル化プリファレンスを使用する場合:

      ベクトル化プリファレンスは、チャンク化(UTL_TO_CHUNKSまたはVECTOR_CHUNKS)、埋込み(UTL_TO_EMBEDDINGUTL_TO_EMBEDDINGSまたはVECTOR_EMBEDDING)およびベクトル索引(distanceaccuracyまたは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

    このメソッドは、索引を手動メンテナンスに設定します。これは、MANUALEVERYON 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の場合)

  • これらの列に使用できる型は、CHARNUMBERDATEVARCHAR2またはRAWのみです。また、CHARVARCHAR2およびVARCHAR2型がサポートされるのは、最大長が指定されており、249バイトを超えない場合のみです。

    CHAR列またはVARCHAR2列の最大長を文字数で指定する場合(たとえば、VARCHAR2 (50 CHAR))、それをFLOOR (249/max_char_width)より長くすることはできません。ここでのmax_char_widthは、データベース文字セット内の文字の最大幅です。

    たとえば、データベース文字セットがAL32UTF8の場合は、指定する最大列長を62文字より長くはできません。サポートされている型(CHARNUMBERDATEVARCHAR2またはRAW)のADT属性も使用できます。

    これ以外のデータ型の場合はエラーが発生します。たとえば、式func(cola)および仮想列は使用できません。

  • FILTER BY列リストでtxt_columnを使用できます。

  • FILTER BY列のDML操作は常にトランザクション型です。

ORDER BY oby_column[desc|asc]

問合せ結果のソートに使用する1つ以上の構造化索引付き列を指定します。

構造化されたoby_columnsのリストを指定できます。これらの列に使用できる型は、CHARNUMBERDATEVARCHAR2または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');

    この例では、パラメータmodelvector_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;