set long 999999 set pagesize 1000 set linesize 200 /* -------------------------------- HNSW INDEX -------------------------------- */ -- crear indice HNSW para busquedas vectoriales aproximadas CREATE VECTOR INDEX markdown_chunks_hnsw_idx ON markdown_chunks (embedding) ORGANIZATION INMEMORY NEIGHBOR GRAPH DISTANCE COSINE WITH TARGET ACCURACY 90 PARAMETERS ( TYPE HNSW, NEIGHBORS 32, EFCONSTRUCTION 200 ); DROP INDEX IF EXISTS markdown_chunks_hnsw_idx; /* -------------------------------- IVF INDEX -------------------------------- */ -- crear indice IVF con DOC_ID incluido para filtros por documento CREATE VECTOR INDEX markdown_chunks_ivf_idx ON markdown_chunks (embedding) INCLUDE (doc_id) ORGANIZATION NEIGHBOR PARTITIONS DISTANCE COSINE WITH TARGET ACCURACY 90 PARAMETERS ( TYPE IVF, NEIGHBOR PARTITIONS 4, MIN_VECTORS_PER_PARTITION 1 ); DROP INDEX IF EXISTS markdown_chunks_ivf_idx; /* -------------------------------- TEXT INDEX + VECTOR SEARCH -------------------------------- */ -- hybrid indexes / text indexes para busquedas textuales y combinadas DROP INDEX IF EXISTS markdown_chunks_text_idx; CREATE SEARCH INDEX markdown_chunks_text_idx ON markdown_chunks (chunk_text) FOR TEXT; select doc_id, chunk_id, SCORE(1) as text_score, VECTOR_DISTANCE(embedding, VECTOR_EMBEDDING(MULTILINGUAL_E5_BASE USING 'Sucursales adheridas' as DATA ) ) as vector_distance, chunk_text from markdown_chunks where contains(chunk_text, '(Mastercard ACCUM NEAR((Dúo,Clásica),1))', 1) > 0 order by vector_distance fetch first 3 rows only; -- Promoción -- FUZZY(Promción) -- ABOUT(Promoción) -- NEAR((tarjetas, físicas, billeteras, electrónicas), 5) -- Black OR Albirroja -- BENDITA ACCUM STYLE -- (Mastercard ACCUM NEAR((Dúo,Clásica),1)) /* -------------------------------- HYBRID VECTOR INDEX -------------------------------- */ -- crear indice hibrido para combinar busqueda textual y semantica DROP INDEX IF EXISTS markdown_chunks_hybrid_idx; CREATE HYBRID VECTOR INDEX markdown_chunks_hybrid_idx ON markdown_chunks (chunk_text) PARAMETERS ('MODEL MULTILINGUAL_E5_BASE VECTOR_IDXTYPE HNSW MEMORY 128M') PARALLEL 2; -- ejemplo de consulta usando el indice hibrido SELECT JSON_SERIALIZE( DBMS_HYBRID_VECTOR.SEARCH( JSON('{ "hybrid_index_name" : "markdown_chunks_hybrid_idx", "search_fusion" : "UNION", "search_scorer" : "rsf", "vector" : { "search_text" : "Vigencia", "search_mode" : "CHUNK" }, "text" : { "contains" : "Shopping NEAR San NEAR Lorenzo" }, "return" : { "values" : [ "chunk_id", "chunk_text", "score", "vector_score", "text_score" ], "topN" : 5 } }') ) RETURNING CLOB PRETTY ) AS hybrid_results; SELECT jt.* FROM JSON_TABLE( dbms_hybrid_vector.search( json_object( 'hybrid_index_name' VALUE 'markdown_chunks_hybrid_idx', 'search_fusion' VALUE 'INTERSECT', 'search_scorer' VALUE 'rsf', 'vector' VALUE json_object('search_text' VALUE 'COMERCIOS ADHERIDOS'), 'text' VALUE json_object('contains' VALUE 'BENDITA ACCUM STYLE'), 'return' VALUE json_object( 'values' VALUE json_array('rowid', 'score', 'vector_score', 'vector_rank', 'text_score', 'text_rank', 'chunk_text'), 'topN' VALUE 3 ) RETURNING JSON ) ), '$[*]' COLUMNS idx for ORDINALITY, score NUMBER PATH '$.score', vector_score NUMBER PATH '$.vector_score', vector_rank NUMBER PATH '$.vector_rank', text_score NUMBER PATH '$.text_score', text_rank NUMBER PATH '$.text_rank', chunk_text VARCHAR2(4000) PATH '$.chunk_text' ) jt;