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_text
をCONTAINS 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
フュージョン・ソート演算子を指定して、キーワードとセマンティック検索結果の組合せセットから保持する内容を定義します。
ノート:
この検索フュージョン操作は、純粋でないハイブリッド検索ケースにのみ適用されます。 ベクトルのみの検索およびテキストのみの検索では、結果は融合されません。パラメータ | 説明 |
---|---|
|
テキスト検索結果とベクトル検索結果の両方に共通する行のみを戻します。 スコア条件: |
|
テキスト検索結果とベクトル検索結果の両方からのすべての個別行を結合します。 スコア条件: |
|
テキスト検索結果のすべての個別行と、テキスト検索結果とベクトル検索結果の両方に共通する行を戻します。 したがって、融合された結果には、両方に表示される検索結果を含め、テキスト検索で表示されるテキスト検索結果が含まれます。 スコア条件: |
|
ベクトル検索結果のすべての個別行と、テキスト検索結果とベクトル検索結果の両方に共通する行を戻します。 したがって、融合された結果には、両方に表示される検索結果を含め、ベクトル検索で表示される検索結果が含まれます。 スコア条件: |
|
テキスト検索結果とベクトル検索結果の両方に共通する行を除いて、ベクトル検索結果のすべての個別行を戻します。 したがって、融合された結果には、両方に表示される検索結果を除き、ベクトル検索で表示される検索結果が含まれます。 スコア条件: |
|
テキスト検索結果とベクトル検索結果の両方に共通する行を除いて、テキスト検索結果のすべての個別行を戻します。 したがって、融合された結果には、両方に表示される検索結果を除き、テキスト検索で表示される検索結果が含まれます。 スコア条件: |
|
テキスト検索からすべての個別行を返し、それぞれのベクトルの集計ベクトル・スコアで順序付けされます。 テキスト検索の後に集計されたドキュメント・ベクター・スコアが使用されるため、このフィールドのスコア条件はありません。 |
例:
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
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 |
次のいずれかの数学演算子:
|
case |
オペランド - OPERAND |
使用可能な列名(
COLUMN_NAME ) :
パラメータ名 :
|
「ケース式」には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;
(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
この関数は、
MAX
、AVGN
および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
ANDsearch_text
のかわりに使用する代替JSON式。ノート:
json_textcontains
WITHをtext.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_text
とinpath
の変更から導出されます。 結果のスニペットは、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
パラメータ | 値 |
op |
論理比較演算子。 受け入れられた値 - 次のいずれかの演算子 :
|
col |
ベース表の列名。
ノート:
|
path |
実表のJSON列内のJSONパス・ドット表記法。 ノート:
|
type |
列のデータ型。 受け入れられるタイプは次のとおりです : |
func |
比較演算子の場合、比較の前にオプション・ファンクションを列値に適用できます。 これらのファンクションは、標準のSQLファンクションです。 1つの例外は、" 受け入れられる値は次のとおりです : |
args |
演算子への引数の配列:
|
passing |
EXISTS 演算子パス式の変数バインディングの配列(EXISTS でない場合は無視されます)。 各配列要素には3つの必須属性があります: var , type , val . たとえば、次のfilter_by パラメータはJSON_EXISTS(COLUMN_NAME, ARG1, PASSING TO_TYPE('VALUE') AS "VARIABLE", ....) に変換されます
JSON_EXISTS条件の詳細は、「こちら」を参照してください。 |
たとえば: 単純な比較演算子の使用
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
結果セットに表示するフィールドを指定します:
パラメータ | 説明 |
---|---|
|
戻される最適な結果の最大数 値: デフォルト: |
|
検索結果の戻り属性 スコアの値の範囲は100 (最高)から0 (最低)です。
デフォルト: |
|
結果の形式:
|
例:
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_text
にprioritize 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
には次のフィールドが含まれます:
フィールド |
タイプ |
|
varchar2(18) |
|
数値 |
|
数値 |
|
数値 |
|
数値 |
|
数値 |
|
varchar2(32767) |
|
varchar2(4000) |
|
varchar2(4000) |
レコード・メンバーは、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