機械翻訳について

101 DBMS_HYBRID_VECTOR

DBMS_HYBRID_VECTORパッケージには、ハイブリッド・ベクトル索引に対してキーワードベクトルで検索できるJSONベースのSEARCH APIが含まれています。 従来のキーワードベースのテキスト検索をベクトルベースの類似性検索と統合することで、全体的な検索エクスペリエンスを向上させて、より正確な情報をユーザーに提供できます。

101.1 SEARCH

DBMS_HYBRID_VECTOR.SEARCH PL/SQLファンクションは、テキスト問合せ、ベクトル類似性問合せまたはハイブリッド・ベクトル索引に対するハイブリッド問合せを実行するために使用します。

用途

ベクトルとキーワードで検索すること。 このファンクションを使用すると、次のタスクを実行できます:

  • テキスト・ドキュメントとベクトル化されたチャンクが結合した(ハイブリッド)問合せを容易にします。

    ハイブリッド検索の理解で説明したように、検索モードと呼ばれる複数のベクトルとキーワード検索の組合せでハイブリッド・ベクトル索引を問い合せることができます。 このAPIは、すべての問合せパラメータについてJSON仕様を受け入れます。

  • 検索結果を融合して並べ替えます:

    ハイブリッド問合せの検索結果は、指定されたフュージョン・セット演算子を使用してCLOBとして統合結果セットに融合され、指定されたスコアリング・アルゴリズムを使用して結合スコアで並べ替えられます。

  • 簡易検索エクスペリエンスのためのデフォルト問合せを実行します。

    最低限必要な入力パラメータは、hybrid_index_nameおよびsearch_textです。 ベクトル化されたチャンク索引とテキスト・ドキュメント索引に対する問合せに、同じテキスト文字列が使用されます。

構文

DBMS_HYBRID_VECTOR.SEARCH(
   json(
     '{  "hybrid_index_name"     :  "<hybrid_vector_index_name>",
         "partition_name"        :  "<index partition name>",        
         "search_text"           :  "<query string for keyword-and-semantic search>",                   
         "search_fusion"         :  one of these values : "INTERSECT | UNION | TEXT_ONLY | VECTOR_ONLY | MINUS_TEXT | 
                                         MINUS_VECTOR | RERANK",      
         "search_scorer"         :  one of these values : "RRF | RSF | WRRF", 
         "score_calc"            :  "<a mathematical expression for custom scoring calculation>",
         "vector":
           {
            "search_text"             :  "<query string for semantic search>",            
            "search_vector"           :  "<vector_embedding>",           
            "search_mode"             :  one of thse values : "DOCUMENT | CHUNK",                 
            "aggregator"              :  one of these values : "COUNT | SUM | MIN | MAX | AVG | MEDIAN | BONUSMAX | WINAVG | 
                                         ADJBOOST | MAXAVGMED", 
            
            "result_max"              :  <maximum number of vector results>,
            "score_weight"            :  <weight of vector score for RSF>,
            "rank_penalty"            :  <penalty of vector ranking for RRF>, 
            "inpath"                  :  <an array of valid JSON paths>,
            "accuracy"                :  <target accuracy for semantic search>,
            "index_probes"            :  <neighbor partitions for semantic search>,
            "index_efsearch"          :  <efsearch for semantic search>,
            "filter_type"             :  one of these values : "IN_WO | IN_W | PRE_WO | PRE_W | POST_WO | DEFAULT"  
           },
         "text":
           {
            "contains"                :  "<query string for keyword search>",    
            "search_text"             :  "<alternative text to use to construct a contains query automatically>",  
            "json_textcontains"       :  <an array of valid JSON path and a query string>,   
            "score_weight"            :  <weight of text score for RSF>,
            "rank_penalty"            :  <penalty of text ranking for RRF>,
            "result_max"              :  <maximum number of document results>,
            "inpath"                  :  <array of valid JSON paths>,
            "snippet"                 :  <length of the snippet>     
           },
         "filter_by":
           {
            "op"                      :  one of these values: "< | > | <= | >= | = | != | ^= | <> | LIKE | LIKEC | LIKE2 | LIKE4 |
                                         REGEXP_LIKE | BETWEEN | EXISTS | INSTR | INSTRC | INSTR2 | INSTR4 | STSTR | STSTR2 | STSTR4 |
                                         STSTRB | STSTRC | <ANY | >ANY | <=ANY | >=ANY | =ANY | !=ANY | <SOME | >SOME | 
                                         <=SOME | >=SOME | =SOME | !=SOME | <ALL | >ALL | <=ALL | >=ALL | =ALL | !=ALL | IN |
                                         AND | OR | NOT | NOTOR | NOTAND",                               
            "type"                    :  one of these values : "number | string | date | timestamp", 
            "col"                     :  "<base table column name>",
            "path"                    :  "<JSON path dot notation within a base table JSON column>", 
            "func"                    :  one of these values : "ABS | FLOOR | LENGTH | CEILING | UPPER | LOWER | TO_BOOLEAN | 
                                         TO_DATE | TO_DOUBLE | TO_BINARYDOUBLE | TO_NUMBER | TO_CHAR | TO_TIMESTAMP", 
            "args"                    :  <an array of arguments to the operator>,
            "passing"                 :  <an array of variable bindings for the EXISTS operator path expression>                        
           }
         "return":
           {
            "topN"                    :  <topN_value>,                               
            "values"                  :  one or more of these values : "rowid | score | vector_score | text_score | vector_rank | 
                                         text_rank | chunk_text | chunk_id | paths",                                
            "format"                  :  one of these values : "JSON | XML"
                                          
           }
     }'
  )
)

ノート:

このAPIは、2つの検索構成をサポートしています。 1つは、セマンティック検索とキーワード検索(デフォルト設定)の両方に単一のsearch_textフィールドを指定する検索です。 もう1つは、セマンティック検索およびキーワード検索にそれぞれvectorおよびtext副要素を使用して、個別のsearch_textおよびcontains問合せフィールドを指定する検索です。 1つの問合せでこれらの検索構成の両方を使用することはできません。

hybrid_index_name

使用するハイブリッド・ベクトル索引の名前を指定します。

ハイブリッド・ベクトル索引を作成していない場合の作成法の詳細は、ハイブリッド・ベクトル索引の管理を参照してください。

partition_name

指定したパーティションからのみ結果が返されるように、索引パーティション名を指定します。 ローカル・パーティションを作成できるローカル・ハイブリッド・ベクトル索引の作成については、「ハイブリッド・ベクトル索引の管理」を参照してください。

SELECT DBMS_HYBRID_VECTOR.SEARCH(
    json('{ "hybrid_index_name" : "my_hybrid_idx",
            "partition_name"    : "SYS_IDX_P1"
          }'))
FROM DUAL;

ノート:

SYS_IDX_P1は、サンプルのパーティション名です。 ローカル・ハイブリッド・ベクトル索引の作成時に使用するカスタム・パーティション名またはシステム生成パーティション名を指定します。

search_text

セマンティック検索とキーワード検索の両方の検索テキスト文字列(問合せ入力)を指定します。

同じテキスト文字列が、ドキュメント・テキスト索引のキーワード問合せ(search_textCONTAINS ACCUM演算子構文に変換)と、ベクトル化チャンク索引のセマンティック問合せ(VECTOR_DISTANCE検索用のsearch_textのベクトル化または埋込み)に使用されます。

例:

SELECT DBMS_HYBRID_VECTOR.SEARCH(
    json('{ "hybrid_index_name" : "my_hybrid_idx",
            "search_text"       : "C, Python"
          }'))
FROM DUAL;

search_fusion

フュージョン・ソート演算子を指定して、キーワードとセマンティック検索結果の組合せセットから保持する内容を定義します。

ノート:

この検索フュージョン操作は、純粋でないハイブリッド検索ケースにのみ適用されます。 ベクトルのみの検索およびテキストのみの検索では、結果は融合されません。
パラメータ 説明

INTERSECT

テキスト検索結果とベクトル検索結果の両方に共通する行のみを戻します。

スコア条件: text_score > 0 AND vector_score > 0

UNION (デフォルト)

テキスト検索結果とベクトル検索結果の両方からのすべての個別行を結合します。

スコア条件: text_score > 0 OR vector_score > 0

TEXT_ONLY

テキスト検索結果のすべての個別行と、テキスト検索結果とベクトル検索結果の両方に共通する行を戻します。 したがって、融合された結果には、両方に表示される検索結果を含め、テキスト検索で表示されるテキスト検索結果が含まれます。

スコア条件: text_score > 0

VECTOR_ONLY

ベクトル検索結果のすべての個別行と、テキスト検索結果とベクトル検索結果の両方に共通する行を戻します。 したがって、融合された結果には、両方に表示される検索結果を含め、ベクトル検索で表示される検索結果が含まれます。

スコア条件: vector_score > 0

MINUS_TEXT

テキスト検索結果とベクトル検索結果の両方に共通する行を除いて、ベクトル検索結果のすべての個別行を戻します。 したがって、融合された結果には、両方に表示される検索結果を除き、ベクトル検索で表示される検索結果が含まれます。

スコア条件: text_score = 0

MINUS_VECTOR

テキスト検索結果とベクトル検索結果の両方に共通する行を除いて、テキスト検索結果のすべての個別行を戻します。 したがって、融合された結果には、両方に表示される検索結果を除き、テキスト検索で表示される検索結果が含まれます。

スコア条件: vector_score = 0

RERANK

テキスト検索からすべての個別行を返し、それぞれのベクトルの集計ベクトル・スコアで順序付けされます。

テキスト検索の後に集計されたドキュメント・ベクター・スコアが使用されるため、このフィールドのスコア条件はありません。

例:

SELECT DBMS_HYBRID_VECTOR.SEARCH(
    json('{ "hybrid_index_name"     : "my_hybrid_idx",
            "search_fusion"         : "UNION",
            "vector":
                    { "search_text" : "leadership experience" },
             "text":
                    { "contains"    : "C and Python" }
          }'))
FROM DUAL;

search_scorer

キーワード検索結果とセマンティック検索結果の両方から結合された"フュージョン"検索スコアを評価する方法を指定します。

  • RSF (デフォルト)相対スコア・フュージョン(RSF)アルゴリズムを使用します

  • RRF: 逆順位フュージョン(RRF)アルゴリズムを使用します

  • WRRF:加重相互ランクFusion (WRRF)アルゴリズムを使用

これらのアルゴリズムが、ハイブリッド検索モードでどのように機能するかを詳しく理解するには、ハイブリッド検索の理解を参照してください。

例:

ハイブリッド検索用の単一の検索テキスト文字列の場合:

SELECT DBMS_HYBRID_VECTOR.SEARCH(
    json(
      '{ "hybrid_index_name" : "my_hybrid_idx",
         "search_text"       : "C, Python",
         "search_scorer"     : "rsf"
      }'))
FROM DUAL;

個別のベクトルおよびテキスト検索文字列の場合:

SELECT DBMS_HYBRID_VECTOR.SEARCH(
    json(
      '{ "hybrid_index_name" : "my_hybrid_idx",
         "search_scorer"     : "rsf",
         "vector":
          { "search_text"    : "leadership experience" },
         "text":
          { "contains"       : "C and Python" }
      }'))
FROM DUAL;

score_calc

RSF、RRF、WRRFなどの標準アルゴリズムを使用して、キーワード検索結果とセマンティク検索結果の両方から結合されたフュージョン検索スコアを評価できますが、独自のカスタム・スコア計算を定義して使用できます。 score_calcフィールドでは、スコア計算を定義できます。

ノート:

検索スコアを取得するには、2つのフィールドのうち1つのみを使用できます。 標準のRSF、RFまたはWRRFアルゴリズムを使用するフィールドsearch_scorerを使用します。 または、score_calcを使用してカスタム・スコアリング・アルゴリズムを定義します。

score_calcフィールドは、数学式またはケース式のいずれかを受け入れます。

式は2つの部分で構成されます: 選択した演算子に応じて、演算子(op)および1つ以上のオペランド(opnds)。 数式と大/小文字式の両方の形式を次に示します:

数式には、opとして指定された算術演算子と、opndsとして指定された対応するオペランドが含まれます。 オペランドの数は、演算子の選択によって異なります。 次の表に、使用可能な演算子およびオペランドを示します。

MATH_EXPR := { “op” : “MATH_OPERATOR”, “opnds” : [ “OPERAND1”, ... ] }
OPERAND := COLUMN_NAME | PARAMETER_NAME | NUMBER | EXPR

次の表に、score_calc式で指定された演算子(op)およびオペランド(OPERAND)に指定できる値を示します。

表101-1 演算子およびオペランドに使用可能な値

  数式 ケース式
オペレータ - op 次のいずれかの数学演算子:
  • MUL, ADD, SUB, DIV - 2つ以上のオペランドを指定する必要があります。
  • ABS, CEIL, EXP, FLOOR, LN, SQRT - 1つのオペランドのみを指定する必要があります。
  • LOG, MOD, POWER, REMAINDER, ROUND - 2つのオペランドのみを指定する必要があります。
  • LEAST, GREATEST - 2つ以上のオペランドを指定する必要があります。
case
オペランド - OPERAND

OPERANDは次のいずれかです : COLUMN_NAME, PARAMETER_NAME, NUMBERまたはEXPR必要なオペランドの数は、演算子によって異なります。

使用可能な列名(COLUMN_NAME) :
  • スコアを含むテキストを表すtext_score
  • ベクトル距離スコアを表すvector_score (DOCUMENTモードの場合は集計)
  • テキスト結果のランクを表すtext_rank
  • ベクトル結果のランクを表すvector_rank
パラメータ名 :
  • text_weighttext.score_weightパラメータを参照
  • text_penaltytext.rank_penaltyパラメータを参照
  • vector_weight vector.score_weightパラメータを参照
  • vector_penaltyvector.rank_penaltyパラメータを参照

NUMBER には数値のみを含めることができます

EXPR はサブ式です

ケース式にはCASE演算子があり、次に示すように条件式(COND_EXPR)OPERANDのペアが必要です :

CASE_EXPR := { “op” : “case”, “opnds” : [ "COND_EXPR", “OPERAND1”, ..., "else", OPERAND-ELSE ] }

可能なOPERAND値は、上の表で指定します。 COND_EXPRは、演算子(op)およびオペランド(opnds)を含むJSON要素形式でもあります。 COND_EXPRの可能な形式は次のとおりです:

COND_EXPR  :=  { “op” : “COMPARATIVE_OPERATOR”, “opnds” : [“ARGUMENT1”, ... ] }
COND_EXPR  :=  { “op” : “LOGICAL_OPERATOR”, “opnds” : [“COND_EXPR”, ... ] }
COMPARATIVE_OPERATORの可能な値:
  • EQ - 等しい(=)
  • LT - より小さい(<)
  • LTE - 次以下(<=)
  • GT - 次より大きい(>)
  • GTE - 次以上(>=)
  • NEQ - 等しくない(!=)
LOGICAL_OPERATORの可能な値:
  • AND
  • または
  • NOT
  • NOTAND - NOT (x AND ... z)の短縮カット
  • NOTOR - NOT (x OR ... y)の短縮カット

ノート:

比較演算子ARGUMENTは、サブ式(EXPR)を除き、前述の表に指定した任意のOPERAND型にできます。
たとえば、このコードでは、次のいずれかのケースに応じてカスタム・スコアを定義します:
  • 検索がベクトルのみの検索(この場合はtext_score =0)の場合、スコアはベクトル・スコアの50+25%になります。
  • 検索がテキストのみの検索(この場合はvector_score =0)の場合、スコアはテキスト・スコアの25+25%になります。
  • それ以外の場合は、ハイブリッド検索(この場合はtext_score> 0and vector_score > 0)で、スコアは各スコアの75+12.5%になります。
SELECT dbms_hybrid_vector.search(
       JSON('{ "hybrid_index_name" : "my_hybrid_idx",
               "vector" : { "search_text" : "database leadership" },
               "text" : { "contains" : "strong AND database" },
               "search_fusion" : "UNION",
               "score_calc" : 
                  { "op" : "case",
                    "opnds" : [ { "op" : "eq", "opnds" : [ "text_score", 0 ]},
                                { "op" : "add", "opnds" : [
                                    50, 
                                    { "op" : "mul", 
                                      "opnds" : [ "vector_score", 0.25 ] } ] },
                                { "op" : "eq", "opnds" : [ "vector_score", 0]},
                                { "op" : "add", "opnds" : [
                                    25, 
                                    { "op" : "mul",
                                      "opnds" : [ "text_score", 0.25 ] } ] },
                                "ELSE",
                                { "op" : "add", "opnds" : [
                                    75, 
                                    { "op" : "mul",
                                      "opnds" : [ "text_score", 0.125] },
                                    { "op" : "mul",
                                      "opnds" : [ "vector_score", 0.125] } ] }
                               ] }
             }'))
FROM DUAL;
前述の例で定義されているscore_calcは、次のように変換されます :
       (CASE WHEN tscr > 0 AND vscr > 0 THEN
                  75 + (tscr * 0.125) + (vscr * 0.125)
             WHEN tscr = 0 THEN
                  50 + (vscr * 0.25)
             WHEN vscr = 0 THEN
                  25 + (tscr * 0.25)
             ELSE 0.0 END)

vector

ハイブリッド・ベクトル索引のベクトル索引部分に対するセマンティック検索の問合せパラメータを指定します:

  • search_text: 検索テキスト文字列(問合せテキスト)。

    この文字列は問合せベクトル(埋込み)に変換され、VECTOR_DISTANCE問合せでベクトル化されたチャンク索引に対する検索に使用されます。

    例:

    SELECT DBMS_HYBRID_VECTOR.SEARCH(
        json('{ "hybrid_index_name" : "my_hybrid_idx",
                "vector":
                        { "search_text" : "C, Python" }
              }'))
    FROM DUAL;
  • search_vector: ベクトル埋込み(問合せベクトル)。

    この埋込みは、ベクトル化されたチャンク索引の検索にVECTOR_DISTANCE問合せで直接使用されます。

    ノート:

    search_vectorは、セマンティック問合せがすでにベクトルとして使用可能な場合、前述のsearch_textの代替です。 ここで渡すベクトル埋込みは、指定されたハイブリッド・ベクトル索引によるセマンティック検索に使用されるものと同じ埋込みモデルを使用して生成する必要があります。

    例:

    SELECT JSON_SERIALIZE(
             DBMS_HYBRID_VECTOR.SEARCH(
                json_object( 'hybrid_index_name' value 'my_hybrid_idx',
                     'vector' value json_object( 'search_vector' value vector_serialize(
                                                vector_embedding(doc_model
                                                            using
                                                            'C, Python, Database'
                                                            as data)
                                                        RETURNING CLOB)
                                                 RETURNING JSON)
                      RETURNING JSON))
               RETURNING CLOB PRETTY)
    FROM dual;
  • search_mode: ハイブリッド・ベクトル索引を問い合せるドキュメントまたはチャンク検索モード:

    パラメータ 説明

    DOCUMENT (デフォルト)

    ドキュメントレベルの結果を戻します。 ドキュメント・モードでは、検索の結果は、識別された最適なドキュメントのリストに対応する実表のドキュメントIDのリストです。

    CHUNK

    チャンクレベルの結果を戻します。 チャンク・モードでは、検索の結果は、チャンクが同じドキュメントからのものか異なるドキュメントからのものかに関係なく、識別される最適なチャンクのリストに対応する実表のチャンク識別子および関連付けられたドキュメントIDのリストです。

    これらのチャンク・テキストからのコンテンツは、レスポンスを形成するためのLLMの入力として使用できます。

    たとえば、チャンク・モードのセマンティック検索は次のとおりです:

    SELECT DBMS_HYBRID_VECTOR.SEARCH(
        json(
          '{ "hybrid_index_name" : "my_hybrid_idx",
             "vector":
              {
                 "search_text"   : "leadership experience",
                 "search_mode"   : "CHUNK"
              }
          }'))
    FROM DUAL;
  • aggregator: DOCUMENT SEARCH_MODE内の各ドキュメントのベクトル・スコアをランク付けするために適用する集計関数。

    パラメータ 説明

    MAX (デフォルト)

    結果スコアとして上位チャンク・スコアを選択する標準のデータベース集計関数。

    AVG

    チャンク・スコアを合計し、総数で除算する標準のデータベース集計関数。

    MEDIAN

    ソートされたスコアの中間値または補間値を計算する標準のデータベース集計関数。

    BONUSMAX

    この関数は、最大のチャンク・スコアと、残りを他の最上位スコアの平均スコアと乗算したものを結合します。

    WINAVG

    この関数は、チャンク・スコアのローリング・ウィンドウの最大平均(サイズwindowSize)を計算します。

    ADJBOOST

    この関数は、"ブーストされる"平均チャンク・スコアを計算します。 チャンク・スコアは、BOOSTFACTORに周囲のチャンク・スコア(存在する場合)の平均スコアを乗算して強調されます。

    MAXAVGMED

    この関数は、MAXAVGNおよびMEDN値の重み付けされた合計を計算します。

    例:

    SELECT DBMS_HYBRID_VECTOR.SEARCH(
        json(
          '{ "hybrid_index_name" : "my_hybrid_idx",
             "vector":
              {
                 "search_text"   : "leadership experience",
                 "search_mode"   : "DOCUMENT",
                 "aggregator"    : "AVG"
              }
          }'))
    FROM DUAL;
  • result_max: ベクトル索引からフェッチ(近似)する距離順のベクトル結果の最大数。

    値: 0 (ゼロ)より大きい任意の正の整数

    デフォルト: このフィールドが指定されていない場合、デフォルトでは、最大値はtopNに基づいて計算されます。

    たとえば:
    SELECT DBMS_HYBRID_VECTOR.SEARCH(
        json(
          '{ "hybrid_index_name" : "my_hybrid_idx",
             "vector":
              {
                 "search_text"   : "leadership experience",
                 "search_mode"   : "DOCUMENT",
                 "aggregator"    : "MAX",
                 "score_weight"  : 5,
                 "result_max"    : 100
              }
          }'))
    FROM DUAL;
  • score_weight: セマンティックVECTOR_DISTANCE問合せに割り当てる相対的な重み(重要度または優先度の程度)。 この値は、RSFランク付けの結果を結合する場合に使用されます。

    値: 0 (ゼロ)より大きい正の整数

    デフォルト: 10 (ベクトル問合せはテキスト問合せよりも10倍重要であることを意味します)

    例:

    SELECT DBMS_HYBRID_VECTOR.SEARCH(
        json(
          '{ "hybrid_index_name" : "my_hybrid_idx",
             "vector":
              {
                 "search_text"   : "leadership experience",
                 "search_mode"   : "DOCUMENT",
                 "aggregator"    : "MAX",
                 "score_weight"  : 5
              }
          }'))
    FROM DUAL;
  • rank_penalty: ベクトル問合せに割り当てるペナルティ(RRFの分母、(1/(rank+penalty)として表される。 これは、ドキュメント内の不要な単語や反復的な単語の重要性を減らすことで、関連性スコアのバランスを取るために役立ちます。 この値は、RRFランク付けの結果を結合する場合に使用されます。

    値: 0 (ゼロ)または任意の正の整数

    デフォルト: 1

    例:

    SELECT DBMS_HYBRID_VECTOR.SEARCH(
        json(
          '{ "hybrid_index_name" : "my_hybrid_idx",
             "search_scorer"     : "rrf",
             "vector":
              {
                 "search_text"   : "leadership experience",
                 "search_mode"   : "DOCUMENT",
                 "aggregator"    : "MAX",
                 "score_weight"  : 5,
                 "rank_penalty"  : 2
              }
          }'))
    FROM DUAL;
  • inpath: 有効なJSONパス

    vector.inpathでは、ドキュメント内のベクトライザ・パスが使用されます。 このパラメータを指定すると、このフィールドに指定されたパスに検索が制限されます。 有効なJSON形式のパス($.a.b.c.d)の配列を受け入れます。

    パスのリストはVECTORIZER索引のパス・リストと照合され、ベクトル索引検索に対する問合せ制約が形成されます。 $.main.*など、パスの単純なワイルドカードがサポートされています。

    例:

    SELECT DBMS_HYBRID_VECTOR.SEARCH(
        json(
          '{ "hybrid_index_name" : "my_hybrid_idx",
             "search_scorer"     : "rrf",
             "vector":
              {
                 "search_text"   : "leadership experience",
                 "search_mode"   : "DOCUMENT",
                 "aggregator"    : "MAX",
                 "score_weight"  : 5,
                 "rank_penalty"  : 2,
                 "inpath"   : ["$.person.*", "$.product.*"]
              }
          }'))
    FROM DUAL;
  • accuracy: セマンティックVECTOR_DISTANCE問合せに割り当てるターゲットの精度。

    値: 0 (ゼロ)から100までの任意の正の整数。

    デフォルト: 0(ゼロ) 0は、vector_distance問合せの内部デフォルトがフィールドに割り当てられることを示します。

    例:

    SELECT DBMS_HYBRID_VECTOR.SEARCH(
        json(
          '{ "hybrid_index_name" : "my_hybrid_idx",
             "vector":
              {
                 "search_text"   : "leadership experience",
                 "search_mode"   : "DOCUMENT",
                 "aggregator"    : "MAX",
                 "score_weight"  : 5,
                 "rank_penalty"  : 2,
                 "inpath"        : ["$.person.*", "$.product.*"],
                 "accuracy"      : 95
              }
          }'))
    FROM DUAL;
  • index_probes: セマンティックVECTOR_DISTANCE問合せに割り当てるプローブの数。

    値: 0 (ゼロ).より大きい正の整数

    デフォルト: 0(ゼロ) 0は、内部デフォルト数のプローブがフィールドに割り当てられることを示します。

    例:

    SELECT DBMS_HYBRID_VECTOR.SEARCH(
        json(
          '{ "hybrid_index_name" : "my_hybrid_idx",
             "vector":
              {
                 "search_text"   : "leadership experience",
                 "search_mode"   : "DOCUMENT",
                 "aggregator"    : "MAX",
                 "score_weight"  : 5,
                 "rank_penalty"  : 2,
                 "inpath"        : ["$.person.*", "$.product.*"],
                 "accuracy"      : 95,
                 "index_probes"  : 3
              }
          }'))
    FROM DUAL;
  • index_efsearch: efs:セマンティックVECTOR_DISTANCE問合せに割り当てます。

    値: 0 (ゼロ).より大きい正の整数 0は、vector_distance問合せの内部デフォルトがフィールドに割り当てられることを示します。

    デフォルト: 0(ゼロ)

    例:

    SELECT DBMS_HYBRID_VECTOR.SEARCH(
        json(
          '{ "hybrid_index_name"   : "my_hybrid_idx",
             "vector":
              {
                 "search_text"     : "leadership experience",
                 "search_mode"     : "DOCUMENT",
                 "aggregator"      : "MAX",
                 "score_weight"    : 5,
                 "rank_penalty"    : 2,
                 "inpath"          : ["$.person.*", "$.product.*"],
                 "accuracy"        : 95,
                 "index_probes"    : 3,
                 "index_efsearch"  : 500,
              }
          }'))
    FROM DUAL;
  • filter_type: ベクトル索引ヒント・フィルタ・タイプ。 ベクトル索引のオプティマイザ計画、ヒントおよびフィルタ・タイプの詳細は、「ベクトル索引のオプティマイザ計画」および「ベクトル索引のヒント」を参照してください。

    値: filter_typeフィールドには、次のいずれかの値を指定できます:
    • PRE_W - 結合バック付き事前フィルタ。 これは、HNSW索引にのみ適用されます。
    • PRE_WO - 結合なしの事前フィルタ。 これは、HNSW索引とIVF索引の両方に適用されます。
    • IN_W - 結合バック付きフィルタ内。 これは、HNSW索引にのみ適用されます。
    • IN_WO - フィルタ内(結合なし)。 これは、HNSW索引にのみ適用されます。
    • POST_WO - 後方結合のない後方フィルタ。 これはIVF索引にのみ適用されます。

    デフォルト: フィルタ・タイプのヒントがありません。

    例:

    SELECT DBMS_HYBRID_VECTOR.SEARCH(
        json(
          '{ "hybrid_index_name"   : "my_hybrid_idx",
             "vector":
              {
                 "search_text"     : "leadership experience",
                 "search_mode"     : "DOCUMENT",
                 "aggregator"      : "MAX",
                 "score_weight"    : 5,
                 "rank_penalty"    : 2,
                 "inpath"          : ["$.person.*", "$.product.*"],
                 "accuracy"        : 95,
                 "index_probes"    : 3,
                 "index_efsearch"  : 500,
                 "filter_type"     : "IN_WO"
              }
          }'))
    FROM DUAL;

text

ハイブリッド・ベクトル索引のOracle Text索引部分に対するキーワード検索の問合せパラメータを指定します:

  • contains: 検索テキスト文字列(問合せテキスト)。

    この文字列は、キーワード検索用のOracle TextのCONTAINS問合せ演算子構文に変換されます。

    CONTAINS問合せ演算子を使用すると、OR (|)、AND (&)、STEM ($)、MINUS (-)などの全文検索の問合せ式を指定できます。 使用するすべての演算子の完全なリストは、『Oracle Textリファレンス』を参照してください。

    例:

    テキストに純粋なキーワード検索用の文字列が含まれる場合:

    SELECT DBMS_HYBRID_VECTOR.SEARCH(
        json('{ "hybrid_index_name" : "my_hybrid_idx",
                "text":
                       { "contains" : "C and Python" }
              }'))
    FROM DUAL;

    個別の検索テキストでハイブリット検索用にvectorおよびtext副要素を使用します。 一方の検索テキストまたはベクトル埋込みで、セマンティック検索のVECTOR_DISTANCE問合せを実行します。 もう一方の検索テキストで、キーワード検索のCONTAINS問合せを実行します。 この問合せでは、キーワード・スコアとセマンティック・スコアを組み合せた、2つの個別のキーワード問合せとセマンティック問合せを実行します:

    SELECT DBMS_HYBRID_VECTOR.SEARCH(
        json('{ "hybrid_index_name" : "my_hybrid_idx",
                "vector":
                        { "search_text" : "leadership experience" },
                 "text":
                        { "contains" : "C and Python" }
              }'))
    FROM DUAL;
  • search_text: contains問合せを自動的に作成するために使用する代替検索テキスト。

    SELECT DBMS_HYBRID_VECTOR.SEARCH(
        json('{ "hybrid_index_name" : "my_hybrid_idx",
                "text":
                       { "contains"    : "C and Python",
                         "search_text" : "data science skills"
                       }
              }'))
    FROM DUAL;
  • json_textcontains: contains AND search_textのかわりに使用する代替JSON式。

    ノート:

    json_textcontains WITHtext.containsまたはtext.search_textのいずれかに指定するとエラーになります。
    SELECT DBMS_HYBRID_VECTOR.SEARCH(
        json('{ "hybrid_index_name" : "my_hybrid_idx",
                "text":
                       { "json_textcontains"    : ["$.person", "$C and $Python"]
                       }
              }'))
    FROM DUAL;
  • score_weight: テキストCONTAINS問合せに割り当てる相対的な重み(重要度または優先度)。 この値は、RSFランク付けの結果を結合する場合に使用されます。

    値: 0 (ゼロ)より大きい正の整数

    デフォルト: 1 (中立の重みを意味します)

    例:

    SELECT DBMS_HYBRID_VECTOR.SEARCH(
        json(
          '{ "hybrid_index_name" : "my_hybrid_idx",
             "text":
              {
                 "contains"      : "C and Python",
                 "score_weight"  : 1
              }
          }'))
    FROM DUAL;
  • rank_penalty: キーワード問合せに割り当てるペナルティ(RRFの分母、1/(rank+penalty)として表される。

    これは、ドキュメント内の不要な単語や反復的な単語の重要性を減らすことで、関連性スコアのバランスを取るために役立ちます。 この値は、RRFランク付けの結果を結合する場合に使用されます。

    値: 0 (ゼロ)または任意の正の整数

    デフォルト: 5

    例:

    SELECT DBMS_HYBRID_VECTOR.SEARCH(
        json(
          '{ "hybrid_index_name" : "my_hybrid_idx",
             "text":
              {
                 "contains"      : "C and Python",
                 "rank_penalty"  : 5
              }
          }'))
    FROM DUAL;
  • inpath: 有効なJSONパス

    このパラメータを指定すると、このフィールドに指定されたパスに検索が制限されます。 有効なJSON形式のパス($.a.b.c.d)の配列を受け入れます。

    例:

    SELECT DBMS_HYBRID_VECTOR.SEARCH(
        json(
          '{ "hybrid_index_name" : "my_hybrid_idx",
             "text":
              {
                 "contains"      : "C and Python",
                 "rank_penalty"  : 5,
                 "inpath"   : ["$.person.*","$.product.*"]
              }
          }'))
    FROM DUAL;
  • result_max: ドキュメント索引から取得するドキュメント結果(スコア順)の最大数。 指定しない場合、最大値はtopNに基づいて計算されます。

    例:

    SELECT DBMS_HYBRID_VECTOR.SEARCH(
        json(
          '{ "hybrid_index_name" : "my_hybrid_idx",
             "text":
              {
                 "contains"      : "C and Python",
                 "rank_penalty"  : 5,
                 "inpath"        : ["$.person.*","$.product.*"],
                 "result_max"    : 100
              }
          }'))
    FROM DUAL;
  • snippet: テキストのみ(ハイブリッド以外)の検索結果またはテキストのみのハイブリッド検索結果のテキスト・スニペットをUNION DOCUMENTモードで有効にします。 このパラメータは、スニペットの必要な最大長を入力として使用します。 値0を指定すると、この機能は無効になります。 スニペットは、CTX_DOC.SNIPPETプロシージャを使用して生成されます。このプロシージャは、問合せ語を含むドキュメントに最も関連性の高い1つ以上のフラグメントを返します。 この場合の問合せ用語は、明示的なtext.contains値で指定するか、text.search_textまたは共通のsearch_textinpathの変更から導出されます。 結果のスニペットは、chunk_textで返されます。

    例:

    SELECT DBMS_HYBRID_VECTOR.SEARCH(
        json(
          '{ "hybrid_index_name" : "my_hybrid_idx",
             "text":
              {
                 "contains"      : "C and Python",
                 "rank_penalty"  : 5,
                 "inpath"        : ["$.person.*","$.product.*"],
                 "result_max"    : 100,
                 "snippet"       : 250
              }
          }'))
    FROM DUAL;

ノート:

または、次のような構文を使用して、APIの外部でスニペットを生成することもできます:
SELECT NVL(chunk_text, CTX_DOC.SNIPPET(...)) chunk_text FROM JSON_TABLE(dbms_hybrid_vector.search(params), COLUMNS ...)

filter_by

標準のリレーショナル論理制約を使用して検索結果を制約するには :

たとえば: 単純な比較演算子の使用

SELECT DBMS_HYBRID_VECTOR.SEARCH(
    json('{ "hybrid_index_name" : "my_hybrid_idx",
            "filter_by":
                    { "op"   : "<",
                      "col"  : "price",
                      "type" : "number",
                      "func" : "ABS"
                      "args" : ["10"] }
          }'))
FROM DUAL;

たとえば: グループ比較演算子の使用

SELECT DBMS_HYBRID_VECTOR.SEARCH(
    json('{ "hybrid_index_name" : "my_hybrid_idx",
            "filter_by":
                    { "op"   :  "IN",
                      "path" : "DATA.brand",
                      "type" " "string",
                      "args" : ["nike", "adidas"] }
          }'))
FROM DUAL;

たとえば: 論理演算子の使用

SELECT DBMS_HYBRID_VECTOR.SEARCH(
    json('{ "hybrid_index_name" : "my_hybrid_idx",
            "filter_by":
                    { "op"   :  "AND",
                      "args" : [
                      {"op" : "IN", "col" : "brand", "type" : "string", "args" : ["nike", "adidas"]},
                      {"op" : "<", "col" : "price", "type" : "number", "args" : ["10"]}]
                    }
          }'))
FROM DUAL;

たとえば: JSON配列を変数バインディングとして渡す

SELECT DBMS_HYBRID_VECTOR.SEARCH(
    json('{ "hybrid_index_name" : "my_hybrid_idx",
            "filter_by":
                    { "op"      :  "EXISTS",
                      "col"     :  "data",
                      "type"    :  "string",
                      "args"    :  [ "$?(@.dateline == $v1[*])" ],
                      "passing" :  [ {"var" : "v1", "type" : "JSON", "val" : "[ \"HOUSTON (AP)\" ]" }]
                    }
          }'))
FROM DUAL;

return

結果セットに表示するフィールドを指定します:

パラメータ 説明

topN

戻される最適な結果の最大数

値: 0 (ゼロ)より大きい整数

デフォルト: 20

values

検索結果の戻り属性 スコアの値の範囲は100 (最高)から0 (最低)です。

  • rowid: ソース・ドキュメントに関連付けられた行ID。

  • score: キーワードおよびセマンティック検索スコアから計算された最終スコア。

  • vector_score: ベクトル検索結果からのセマンティック・スコア。

  • text_score: テキスト検索結果からのキーワード・スコア。

  • vector_rank: セマンティック検索またはVECTOR_DISTANCE検索から取得されたチャンクのランキング。

  • text_rank: キーワード検索またはCONTAINS検索から取得されたドキュメントのランキング。

  • chunk_text: 各チャンクからの判読可能な内容

  • chunk_id: 各チャンク・テキストのID

  • paths: 結果が発生したパス。

デフォルト: paths以外の前述のすべてのリターン属性がデフォルトで示されます。 JSON以外のパスがないため、pathsフィールドを明示的に指定する必要があります。

format

結果の形式:

  • JSON (デフォルト)

  • XML

例:

SELECT DBMS_HYBRID_VECTOR.SEARCH(
    json(
      '{ "hybrid_index_name" : "my_hybrid_idx",
         "search_text"       : "C, Python",
         "return":
          {
             "values"        : [ "rowid", "score", "paths" ],
             "topN"          : 10,
             "format"        : "JSON"
             
          }
      }'))
FROM DUAL;

すべての問合せパラメータを使用した完全な例

次の例は、my_hybrid_idxに対して個別のテキスト検索とベクトル検索を実行するハイブリッド検索問合せを示しています。 この問合せでは、vector_distance関数を使用するベクトル検索用のsearch_textprioritize teamwork and leadership experienceを指定し、contains演算子を使用するテキスト検索用のキーワードにC and Pythonを指定しています。 検索モードはDOCUMENTで、topNドキュメントとして検索結果を返します。

SELECT JSON_SERIALIZE(
  DBMS_HYBRID_VECTOR.SEARCH(
    json(
      '{ "hybrid_index_name" : "my_hybrid_idx",
         "search_fusion"     : "INTERSECT",
         "search_scorer"     : "rsf",
         "vector":
          {
             "search_text"       : "prioritize teamwork and leadership experience",
             "search_mode"       : "DOCUMENT",
             "score_weight"      : 10,
             "rank_penalty"      : 1,
             "aggregator"        : "SCORE_AGGR",
             "aggregator_params" : ["AVGN", 5, 50],
             "inpath"            : ["$.main.body", "$.main.summary"],
             "accuracy"          : 95
          },
         "text":
          {
             "contains"      : "C and Python",
             "score_weight"  : 1,
             "rank_penalty"  : 5,
             "inpath"        : ["$.main.body"]
          },
         "return":
          {
             "format"        : "JSON",
             "topN"          : 3,
             "values"        : [ "rowid", "score", "vector_score",
                                 "text_score", "vector_rank",
                                 "text_rank", "chunk_text", "chunk_id", "paths" ]
          }
      }'
    )
  ) pretty)
FROM DUAL;

上位の3行は、一致の良好さを示すようにスコアの高い方から関連性順に並べられます。 すべての戻り属性がデフォルトで示されます:

[
  {
    "rowid"         : "AAAR9jAABAAAQeaAAA",
    "score"         : 58.64,
    "vector_score"  : 61,
    "text_score"    : 35,
    "vector_rank"   : 1,
    "text_rank"     : 2,
    "chunk_text"    : "Candidate 1: C Master. Optimizes low-level system (i.e. Database)
                       performance with C. Strong leadership skills in guiding teams to 
                       deliver complex projects.",
    "chunk_id"      : "1",
    "paths"         : ["$.main.body","$.main.summary"]
  },
  {
    "rowid"         : "AAAR9jAABAAAQeaAAB",
    "score"         : 56.86,
    "vector_score"  : 55.75,
    "text_score"    : 68,
    "vector_rank"   : 3,
    "text_rank"     : 1,
    "chunk_text"    : "Candidate 3: Full-Stack Developer. Skilled in Database, C, HTML,
                       JavaScript, and Python with experience in building responsive web 
                       applications. Thrives in collaborative team environments.",
    "chunk_id"      : "1",  
    "paths"         : ["$.main.body", "$.main.summary"]
  },
  {
    "rowid"         : "AAAR9jAABAAAQeaAAD",
    "score"         : 51.67,
    "vector_score"  : 56.64,
    "text_score"    : 2,
    "vector_rank"   : 2,
    "text_rank"     : 3,
    "chunk_text"    : "Candidate 2: Database Administrator (DBA). Maintains and secures
                       enterprise database (Oracle, MySql, SQL Server). Passionate about 
                       data integrity and optimization. Strong mentor for junior DBA(s).",
    "chunk_id"      : "1",
    "paths"         : ["$.main.body", "$.main.summary"]
  }
]

エンドツーエンドの例:

ハイブリッド・ベクトル索引を作成し、その索引に対するすべてのタイプの問合せを調べる方法は、ハイブリッド・ベクター索引のエンドツーエンドの問合せの例を参照してください。

101.2 GET_SQL

DBMS_HYBRID_VECTOR.GET_SQL PL/SQLファンクションでは、パラメータから生成された内部SQL問合せを戻します。

DBMS_HYBRID_VECTOR検索ファンクションを呼び出すと、JSONドキュメント形式を使用してAPIがコールされます。 GET_SQLプロシージャを使用すると、 DBMS_HYBRID_VECTOR.SEARCH APIによって生成されたSQLが表示されます。 結果のSQLを使用すると、問合せ実行計画を表示して、ハイブリッド検索操作に選択された索引を表示できます。 次に例を示します。

SET LINESIZE 200;
SET PAGESIZE 1000;
SET TAB OFF;
SET TRIMSPOOL ON;
DECLARE
    res CLOB;
BEGIN
    res := dbms_hybrid_vector.get_sql(JSON('{"hybrid_index_name" : "trecvol2j_idx",
                                            "search_text" : "offers",
                                            "return" : { "values" : [ "score" ] } }'));
    execute immediate 'EXPLAIN PLAN FOR '||res;
END;
/
SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY(NULL,NULL,'ADVANCED'));

101.3 SEARCHPIPELINE

標準の表ファンクションDBMS_HYBRID_VECTOR.SEARCHPIPELINEを使用して、行レコードのパイプラインを返します。

このパイプライン・ファンクションは、有効なJSON問合せ入力を受け入れ、行レコードのパイプラインを返します。 構文は次のとおりです:

FUNCTION SEARCHPIPELINE(qparams JSON)
RETURN results PIPELINED;
resultsのタイプはRECORDです。 resultsには次のフィールドが含まれます:

レコード・メンバーは、SELECT文の列名です。 これらの名前は、DBMS_HYBRID_VECTOR_SEARCH()で返されるJSONフィールド名と同じです。ただし、pathsはレコード内のフィールドIDのリストであり、JSONの結果ではIDが実際のパス(配列内)にマップされます。 また、結果レコードには、rowidという名前のメンバーやrowid型のメンバーを含めることができませんでした。

例101-1

SELECT
   chartorowid(doc_rowid) as doc_rowid,
   score,
   vector_score,
   text_score,
   vector_rank,
   text_rank,
   chunk_text,
   chunk_id,
   paths
FROM dbms_hybrid_vector.searchpipeline(JSON('{"hybrid_index_name" : "idx",
                                              "search_text" : "teamwork" }'));

表ファンクションDBMS_HYBRID_VECTOR.SEARCHPIPELINE()を使用しない場合は、元のSEARCH APIをJSON_TABLE仕様でラップできます。 次に例を示します:

SELECT jt.*
FROM
   JSON_TABLE(
        dbms_hybrid_vector.search(
                      json_object('hybrid_index_name' value 'idx',
                      'search_text' value 'teamwork'
                      RETURNING JSON)
                   ),
                   '$[*]' COLUMNS idx for ORDINALITY,
                                  doc_rowid PATH '$.rowid',
                                  score NUMBER PATH '$.score',
                                  vector_score NUMBER PATH '$.vector_score',
                                  text_score NUMBER PATH '$.text_score',
                                  vector_rank NUMBER PATH '$.vector_rank',
                                  text_rank NUMBER PATH '$.text_rank',
                                  chunk_text PATH '$.chunk_text',
                                  chunk_id PATH '$.chunk_id',
                                  paths PATH '$.paths'
                    ) jt
ORDER by idx ASC