当前位置: 首页 > news >正文

15-Oracle 23ai Vector Search Similarity Search-向量相似性和混合搜索-实操

一、向量相似性搜索(Similarity Search)概念

Oracle的向量相似性搜索(Similarity Search)是其AI Vector Search功能的核心组成部分,旨在通过高效处理高维向量数据,支持多种人工智能驱动的应用场景。
Similarity Search(相似性搜索)​​ 是在高维向量空间中查找与查询向量最相似的向量的过程。Oracle 23ai 通过原生向量支持实现了两种搜索模式:
纯向量相似性搜索​:
  • 仅基于向量距离(如余弦相似度)排序结果
  • 适用场景:推荐系统、语义搜索
混合搜索(Hybrid Search)​​:
  • 结合向量相似度与关系型条件(如价格、日期)
  • 适用场景:电商产品推荐、跨模态搜索

二、描述示意图

现在,在数据集中搜索语义相似性等同于搜索最近的 neighbors 而不是使用 query SQL谓词。如下图所示,此向量空间中 dog 和 wolf 之间的距离短于 在dog和cat之间。在这个空间里,狗更像wolf 比对一只cat来说还要好。

矢量数据往往分布不均匀,并聚集在以下组中语义相关。根据给定的查询向量执行相似性搜索是 等效于检索向量中查询向量的 K 最近向量 空间。基本上,需要通过对 vector 进行排名来找到向量的有序列表,其中 列表中的第一行是与查询向量最接近或最相似的向量, 列表中的第二行是距离查询向量第二近的向量,因此 上。在进行相似性搜索时,距离的相对顺序才是真正的 重要,而不是实际距离。

使用前面的向量空间,下面是语义搜索的图示,其中 您的查询向量是与单词 Puppy 对应的向量,并且确定 4 个最接近的单词:

相似性搜索倾向于从一个或多个集群中获取数据,具体取决于查询向量的值和获取大小。

使用向量索引的近似搜索可以将搜索限制为特定的 集群,而精确搜索访问所有集群中的向量。

三、建表并实际查询操作

步骤1:创建表并插入数据
-- 创建包含向量列的表
CREATE TABLE products_demo202500607 (2      id NUMBER PRIMARY KEY,3      name VARCHAR2(100),4      description VARCHAR2(500),5      embedding VECTOR(3, FLOAT32)  -- 假设使用3维的向量6  );表已创建。
-- 插入示例数据
INSERT INTO products_demo202500607 VALUES (1, '无线耳机', '高品质无线蓝牙耳机', VECTOR('[0.1, 0.2, 0.8]'));
INSERT INTO products_demo202500607 VALUES (2, '智能手表', '带健康监测的智能手表', VECTOR('[0.3, 0.5,0.7]'));已创建 1 行。SYS@FREE>
已创建 1 行。INSERT INTO products_demo202500607 VALUES (3, '平板电脑', '轻薄高性能平板', VECTOR('[0.2, 0.4, 0.9]'));已创建 1 行。SYS@FREE> COMMIT;提交完成。SYS@FREE>

 步骤2:创建向量索引(加速搜索)

-- 创建HNSW索引
CREATE VECTOR INDEX prod_embedding_idx_202506072  ON products_demo202500607 (embedding)3  ORGANIZATION INMEMORY NEIGHBOR GRAPH4  DISTANCE COSINE5  PARAMETERS (TYPE HNSW, NEIGHBORS 64, EFCONSTRUCTION 200);索引已创建。

 步骤3:纯相似性搜索

-- 使用VECTOR_DISTANCE函数计算距离,并按距离排序
SELECT id, name, description,VECTOR_DISTANCE(embedding, VECTOR('[0.15, 0.25,0.75]'), COSINE) AS similarity
FROM products_demo202500607
ORDER BY similarity
FETCH FIRST 2 ROWS ONLY;ID NAME                                               DESCRIPTION
---------- -------------------------------------------------- --------------------------------------------------
SIMILARITY
----------
########## 平板电脑                                           轻薄高性能平板4.56E-003########## 无线耳机                                           高品质无线蓝牙耳机
5.105E-003SYS@FREE>

步骤4:混合搜索

混合搜索结合向量相似性和关系条件(如文本匹配、价格范围等)。

-- 示例:查找描述中包含“健康”并且与给定查询向量相似的电子产品
SYS@FREE> col similarity for a50
SELECT id, name, description,VECTOR_DISTANCE(embedding, VECTOR('[0.15, 0.25,0.75]'), COSINE) AS similarity
FROM products_demo202500607
WHERE description LIKE '%健康%'   -- 传统关系条件
ORDER BY similarity
FETCH FIRST 3 ROWS ONLY;ID NAME                                               DESCRIPTION
---------- -------------------------------------------------- --------------------------------------------------
SIMILARITY
----------
########## 智能手表                                           带健康监测的智能手表
5.196E-002
步骤5:使用ANNOY索引的混合搜索(如果使用IVF索引)

注意:Oracle 23ai支持多种索引类型,此次以HNSW为例,但混合搜索同样适用于其他索引。

-- 创建IVF索引(如果需要)
CREATE VECTOR INDEX prod_ivf_idx
ON products_demo202500607 (embedding)
ORGANIZATION NEIGHBOR PARTITIONS
DISTANCE COSINE
PARAMETERS (TYPE IVF, NEIGHBOR PARTITIONS 100);-- 混合搜索(使用IVF索引加速)
-- 注意:在查询时,优化器会自动选择索引
SELECT id, name, description, VECTOR_DISTANCE(embedding, VECTOR('[0.1, 0.2, 0.3]'), COSINE) AS similarity
FROM products_demo202500607
WHERE description LIKE '%健康%'
ORDER BY similarity
FETCH FIRST 3 ROWS ONLY;ID NAME                                               DESCRIPTION
---------- -------------------------------------------------- --------------------------------------------------
SIMILARITY
----------
########## 智能手表                                           带健康监测的智能手表
2.585E-003SYS@FREE>

四、根据特点选择

  1. ​相似性搜索​:通过向量距离函数(如VECTOR_DISTANCE)和排序实现。
  2. ​混合搜索​:在相似性搜索的基础上,加入关系型条件(WHERE子句),实现更复杂的查询。
  3. ​索引加速​:为向量列创建索引(如HNSW或IVF)可以显著提高搜索性能。
http://www.lqws.cn/news/205111.html

相关文章:

  • Mac软件卸载指南,简单易懂!
  • 不要调用 TOARRAY() 从 LARAVEL COLLECTION 中获取所有项目
  • 基于Flask框架的前后端分离项目开发流程是怎样的?
  • Android启动时长优化(kernel部分)
  • 数学:花括号在数学中的应用详解
  • SQL进阶之旅 Day 20:锁与并发控制技巧
  • 锁的艺术:深入浅出讲解乐观锁与悲观锁
  • OpenLayers:封装Tooltip
  • 数据导入技术(文档加载)
  • OpenLayers 从后端服务加载 GeoJSON 数据
  • leetcodeT3170
  • PHP文件包含漏洞详解:原理、利用与防御
  • 解决国产GD32下载的工程无法编译
  • 两种Https正向代理的实现原理
  • Python 字符串与列表核心操作全解:从独有功能到实战场景
  • Redis故障转移
  • 探索Python融合地学:斗之气七段(运算符)
  • 在命令行直接执行可以执行成功,加入crontab定时任务执行shell脚本不成功失败的问题解决方法
  • 晶圆Map图芯片拉选
  • MATLAB-电偶极子所产出的电磁场仿真
  • gRPC 的四种通信模式完整示例
  • RSA加密算法:非对称密码学的基石
  • 磁盘修复工具
  • Day47
  • Global Security Markets 第 10 章衍生品知识点总结​
  • BeckHoff--MES数据交互 MQ TRANCE API (MQ 追溯 API - 系统概述和命令参考)
  • Go爬虫开发学习记录
  • IEC 61347-1:2015 灯控制装置安全通用要求详解
  • PyTorch 中cumprod函数计算张量沿指定维度的累积乘积详解和代码示例
  • 视频字幕质量评估的大规模细粒度基准