基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
语义索引
更新时间:2026-08-25 16:56:53
本文档介绍了如何在 OceanBase 数据库中使用语义索引(Semantic Index)。
说明
该功能在当前版本为实验特性,不建议在生产环境使用。
概述
语义索引利用 OceanBase 数据库内置的嵌入(Embedding)能力,极大地简化了向量索引的使用流程。它实现了向量概念对用户的透明化:你可以直接写入需要存储的原始数据(如文本或图片 URL),OceanBase 数据库会在内部自动将其转换为向量并建立索引。在搜索时,你同样只需提供原始搜索内容,OceanBase 数据库也会自动进行嵌入并搜索向量索引,从而显著提升了使用的便捷性。
在文本语义索引基础上,OceanBase 还支持在 VARCHAR 列上存储图片 URL 并创建图片语义索引。系统自动调用多模态嵌入模型完成向量化,支持以图搜图与以文搜图(跨模态检索)等场景。
考虑到嵌入模型的性能开销,语义索引提供了同步和异步两种嵌入方式供用户选择:
- 同步模式:数据写入后立即进行嵌入和索引,确保数据实时可见。
- 异步模式:由后台任务分批进行数据的嵌入和索引,这能显著提升写入性能,数据延时可见。你可以根据对数据可见性时效的要求,灵活设置后台任务的触发周期。
此外,创建了语义索引的表,同样可以进行暴力搜索。暴力搜索指的是采用全表扫描的方式进行搜索,得到距离最近的前 n 行的精确结果。
功能支持
注意
本功能在当前版本中仅支持 HNSW/HNSW_BQ/HNSW_SQ 索引。
当前版本语义索引更新、删除与搜索的使用语法、内存管理方式与 HNSW 系列索引完全一致。支持索引监控与维护流程,异步模式下增量刷新会额外触发数据的嵌入。
支持的功能点如下:
| 模块 | 功能点 | 介绍 |
|---|---|---|
| DDL | 建表时创建语义索引 | 可以在创建表的时候,在 VARCHAR 列上创建语义索引(文本或图片 URL) |
| DDL | 后建语义索引 | 支持在已存在表的 VARCHAR 列上创建语义索引 |
| DDL | Batch File 批量嵌入 | 后建语义索引时可指定 ai_service_tier=BATCH,通过文件批量提交请求,系统异步处理所有请求。详见文末相关文档 AI 模型交互(Batch File) |
| DDL | 单列多索引 | 支持在同一列上创建多个语义索引,可用于不同模型、距离算法或索引参数组合
注意该功能点仅用于测试,不可用于生产。 |
| DDL | 图片 URL 语义索引 | 通过 content_type=image 在 VARCHAR 列上创建图片语义索引,自动将图片 URL 向量化
注意本功能从 V4.6.0 BP1 版本开始支持。 |
| 搜索 | semantic_distance 函数 |
传入原始文本或图片 URL 进行向量搜索,支持以文搜图或以图搜图
注意本功能从 V4.6.0 BP1 版本开始支持。 |
| 搜索 | semantic_vector_distance 函数 |
通过该函数传入向量进行搜索,有两种使用方式:
|
| DBMS_VECTOR | REBUILD_INDEX |
使用方法与常规向量索引相同,执行索引全量重建 |
一些使用注意事项如下:
- 同步模式下,写入性能可能受到嵌入性能的影响;异步模式下,数据可见性会有延迟。
- 对于重复搜索的场景,建议使用 AI 函数服务(AI Function Service)预先获取查询向量,避免每次搜索都进行嵌入。
- 同一列上不能创建多个语义索引。
前提条件
注意
语义索引暂不支持新接口(REGISTER_PROVIDER)注册模型。须使用旧接口 CREATE_AI_MODEL 与 CREATE_AI_MODEL_ENDPOINT 注册嵌入模型。
注册文本嵌入模型
在使用语义索引之前,必须先注册嵌入(Embedding)模型和端点。以下是注册示例:
CALL DBMS_AI_SERVICE.DROP_AI_MODEL ('ob_embed');
CALL DBMS_AI_SERVICE.DROP_AI_MODEL_ENDPOINT ('ob_embed_endpoint');
CALL DBMS_AI_SERVICE.CREATE_AI_MODEL(
'ob_embed', '{
"type": "dense_embedding",
"model_name": "BAAI/bge-m3"
}');
CALL DBMS_AI_SERVICE.CREATE_AI_MODEL_ENDPOINT (
'ob_embed_endpoint', '{
"ai_model_name": "ob_embed",
"url": "https://api.siliconflow.cn/v1/embeddings",
"access_key": "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxx",
"provider": "siliconflow"
}');
说明
请将 access_key 替换为您的实际 API Key。BAAI/bge-m3 模型的向量维度为 1024,因此在创建语义索引时需要使用 dim=1024。
注册多模态嵌入模型(图片)
图片语义索引(content_type=image)须使用多模态(VL)嵌入模型,并通过旧接口注册模型与端点。创建索引时在 WITH 子句的 model 参数中指定注册的 model_key。
CALL DBMS_AI_SERVICE.DROP_AI_MODEL ('ob_vl_embed');
CALL DBMS_AI_SERVICE.DROP_AI_MODEL_ENDPOINT ('ob_vl_embed_endpoint');
CALL DBMS_AI_SERVICE.CREATE_AI_MODEL(
'ob_vl_embed', '{
"type": "dense_embedding",
"model_name": "qwen2.5-vl-embedding"
}');
CALL DBMS_AI_SERVICE.CREATE_AI_MODEL_ENDPOINT (
'ob_vl_embed_endpoint', '{
"ai_model_name": "ob_vl_embed",
"url": "https://dashscope.aliyuncs.com/api/v1/services/embeddings/multimodal-embedding/multimodal-embedding",
"access_key": "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxx",
"provider": "aliyun-dashscope"
}');
说明
请将 access_key 替换为您的实际 API Key。创建索引时 dim 须与所选模型实际输出维度一致。端点注册时 provider 必须为 aliyun-dashscope。更多注册示例请参见 AI 模型注册 中的旧接口说明。
注意事项(图片语义索引)
- 模型要求:
- 当前仅支持阿里云 DashScope 提供的多模态嵌入模型。
- 非多模态(纯文本)嵌入模型用于
content_type=image时会报错。
- 不支持的功能:
- 不支持 Doc 模式(切片)。
- 不支持视频、音频等其他多模态类型。
- 不支持同一语义索引同时处理文本 URL 与图片 URL,需分别为
content_type=text和content_type=image创建索引。
- 列类型限制:
- 仅支持在
VARCHAR列上创建图片语义索引,不支持以下类型:TEXT/LONGTEXT/TINYTEXT/MEDIUMTEXTCHAR/BINARY/VARBINARY/BLOB
- 仅支持在
- URL 约束:
- 只支持
http://或https://协议。 content_type=image时不允许空字符串。- 支持的图片格式依赖所用 AI 模型(通常支持 JPEG、PNG、WebP、GIF 等);暂不支持存储为二进制(如
BLOB/VARBINARY)。
- 只支持
- 查询限制:
- 以文搜图(跨模态检索)要求多模态嵌入模型同时支持文本与图片输入,且输出在同一向量空间。
- 其他注意事项:
content_type创建后不可变更,如需变更需删除索引后重建。- 若同一列需同时创建文本与图片语义索引,需开启
_enable_multiple_semantic_indexes_on_column配置,并通过VECTOR_INDEXHint 指定具体索引。
- OSS 私有图片:
- 对象存储 Bucket 默认为私有权限,直接写入对象 URL 可能因鉴权失败导致向量化报错。对于 OSS 上的图片,需先生成预签名 URL,再写入数据库或作为查询参数传入。
- 可通过 OSS 控制台或阿里云 SDK 生成预签名 URL。
- 预签名 URL 有有效期,在
sync_mode=manual或async时后台异步向量化,建议有效期设置为 1 小时以上。 - 向量化完成后 OceanBase 数据库只存储向量值,不会持久化 URL。URL 过期不影响已建好的向量索引。
手动启用语义索引
通过租户级配置项 _enable_semantic_index 启用语义索引功能,默认关闭:
ALTER SYSTEM SET _enable_semantic_index = true;
索引语法及说明
创建
语义索引支持建表时创建和后建两种方式。创建时需要注意:
- 创建索引必须指定在
VARCHAR类型的列上。 - 支持在同一列上创建多个语义索引。
model、sync_mode、ai_service_tier参数不支持在常规向量索引上配置。ai_service_tier=BATCH仅后建索引支持,不支持建表创建时使用。
支持使用 CREATE TABLE 语句创建语义索引,通过索引参数,同步或者异步发起后台任务。同步模式会在插入数据时自动将 VARCHAR 数据转换成向量数据,异步模式则会定期或者手动完成数据转换。
语法如下:
CREATE TABLE table_name (
column_name1 data_type1,
column_name2 VARCHAR, -- 文本或图片 URL 列
...,
VECTOR INDEX index_name (column_name2) WITH (param1=value1, param2=value2, ...)
);
说明如下:
- 推荐使用 VARCHAR(2048) / VARCHAR(4096) 类型,以获得最佳搜索性能。
支持在已经存在表的 VARCHAR 列上创建语义索引,后建索引时会通过提供的索引参数发起同步或者异步的后台任务。同步模式下所有现存 VARCHAR 数据会进行向量嵌入,异步模式则会定期或者手动完成嵌入。
语法如下:
CREATE VECTOR INDEX index_name
ON table_name(varchar_column_name)
WITH (param1=value1, param2=value2, ...);
后建索引时,可在 WITH 子句中指定 ai_service_tier=BATCH,通过文件批量提交请求,系统异步处理所有请求。完整使用说明请参见文末相关文档 AI 模型交互(Batch File)。
param 参数说明如下:
| 参数 | 默认值 | 取值范围 | 是否必填 | 说明 | 备注 |
|---|---|---|---|---|---|
distance |
l2/inner_product/cosine |
是 | 指定向量距离算法类型。 | l2 表示欧氏距离,inner_product 表示内积距离,cosine 表示余弦距离。 |
|
type |
目前支持 hnsw / hnsw_bq / hnsw_sq |
是 | 指定索引算法类型。 | ||
lib |
vsag |
vsag |
否 | 指定向量索引库类型。 | 目前仅支持 VSAG 向量库。 |
model |
已注册的 model_key | 是 | 指定用于 embedding 的模型名称。 | 须通过旧接口 CREATE_AI_MODEL 注册,在 WITH 子句中填写 model_key。暂不支持新接口 provider/model 格式。
说明常规向量索引不支持设置此参数。 |
|
dim |
正整数,最大 4096 | 是 | 指定嵌入后的向量维度。 | 必须与模型提供的维度对应。如果模型支持多种维度,可按场景在模型允许的范围内选更高或更低维度:精度优先 768/1024,性能优先 256/512。 | |
sync_mode |
async |
immediate/manual/async |
否 | 指定数据和索引同步的模式。 | immediate 表示同步模式,manual 表示手动模式,async 表示异步模式。图片语义索引不支持 immediate,仅支持 async 或 manual。
说明常规向量索引不支持设置此参数。 |
sync_interval |
10s |
时间间隔,如 10s、1h、1d 等 |
否 | 设置异步模式下后台任务的触发周期。 | 数值部分需为正数,单位支持秒(s)、小时(h)、天(d)等。 |
content_type |
text |
text/image |
否 | 指定语义索引的内容类型。 | text 表示文本语义索引;image 表示图片 URL 语义索引。创建后不可变更。
注意本参数从 V4.6.0 BP1 版本开始支持。 |
ai_service_tier |
STANDARD |
STANDARD/BATCH |
否 | 指定建索引时的 AI 服务档位。 | STANDARD 为逐行同步 HTTP 调用;BATCH 为批量文件异步处理,通过 AI 服务商 Batch API 完成嵌入。 |
allow_null_on_failure |
FALSE |
TRUE/FALSE |
否 | 批量嵌入失败时的容错行为。 | 仅 ai_service_tier=BATCH 时生效。为 TRUE 时,失败行向量置为 NULL 并继续建索引;为 FALSE 时,任一行失败即中止 DDL。 |
其他向量索引参数(如 m、ef_construction、ef_search 等)的使用与常规 HNSW/HNSW_BQ 索引相同,具体请参见文末相关文档中的 HNSW 系列索引文档。
搜索
语义索引支持两种搜索方式:
- 使用原始内容搜索(文本或图片 URL)
- 使用向量搜索
- 可指定
APPROXIMATE/APPROX子句,使用向量索引进行最近邻搜索。 - 也可不指定
APPROXIMATE/APPROX子句,使用全表扫描的方式进行暴力搜索。
- 可指定
使用 Hint 说明与注意事项如下:
- 当在同一列上存在多个语义索引时,查询必须通过
VECTOR_INDEXHint 明确指定所需使用的向量索引,否则系统会报错。通过 Hint,你不仅可以在查询语句中选择具体的向量索引,还可灵活配置前置或后置过滤条件,提高搜索的准确性和灵活性。 VECTOR_INDEXHint 可与INDEXHint 配合使用。- 以上两点的使用说明请参见VECTOR_INDEX Hint。
使用 semantic_distance 表达式,传入原始文本或图片 URL 进行向量搜索。
语法如下:
SELECT ... FROM table_name
ORDER BY semantic_distance(column_name, 'query_content' [, 'query_type'])
APPROXIMATE|APPROX
LIMIT n;
其中:
column_name:语义索引创建时指定的列(文本或图片 URL)。query_content:搜索的原始内容(文本字符串或图片 URL)。query_type:可选,取值为'TEXT'或'IMAGE',缺省按'TEXT'处理。在图片语义索引上执行以图搜图时,应显式传入'IMAGE'。该参数从 V4.6.0 BP1 版本开始支持。n:返回的结果行数。
注意
semantic_distance 仅支持带 APPROXIMATE/APPROX 的近似搜索。
带
APPROXIMATE子句:使用semantic_vector_distance表达式,传入向量进行搜索,当搜索语句中带有APPROXIMATE/APPROX子句时,会使用向量索引进行搜索。语法如下:SELECT ... FROM table_name ORDER BY semantic_vector_distance(column_name, 'query_vector') [APPROXIMATE|APPROX] LIMIT n;其中:
column_name:语义索引创建时指定的文本列。query_vector:查询向量。n:返回的结果行数。
不带
APPROXIMATE子句:使用semantic_vector_distance表达式,传入向量进行检索,当不带有APPROXIMATE/APPROX子句时,会采用全表扫描的方式进行暴力检索,得到距离最近的前 n 行的精确结果。检索执行时,会从表模式(Schema)中获取distance的类型,然后进行整表扫描,每行都会进行向量距离的计算,从而保证获取精确结果。语法如下:SELECT ... FROM table_name ORDER BY semantic_vector_distance(column_name, 'query_vector') LIMIT n;参数含义与带
APPROXIMATE子句一致。
APPROXIMATE/APPROX 子句的详细语法说明请参见文末相关文档中的 HNSW 系列索引文档。
创建、更新、搜索与删除示例
语义索引的 DML 操作(INSERT、UPDATE、DELETE)与常规向量索引完全一致。插入或更新 VARCHAR 类型的数据时,系统会根据 sync_mode 参数设置同步或异步进行向量嵌入。
建表时创建
创建文本语义索引示例
创建测试表
items时创建vector_idx索引:-- 假设 ob_embed 模型的创建在此前已完成(请参考"前提条件"部分注册模型) CREATE TABLE items ( id BIGINT PRIMARY KEY, doc VARCHAR(100), VECTOR INDEX vector_idx(doc) WITH (distance=l2, lib=vsag, type=hnsw_sq, model=ob_embed, dim=1024, sync_mode=async, sync_interval=10s) );向测试表
items插入一条数据,系统会自动进行嵌入:INSERT INTO items(id, doc) VALUES(1, 'Rose');创建图片语义索引示例
-- 假设 ob_vl_embed 模型的创建在此前已完成(请参考"前提条件"部分注册模型) CREATE TABLE product_images ( id INT PRIMARY KEY, image_url VARCHAR(4096), product_name VARCHAR(256), VECTOR INDEX img_idx(image_url) WITH (distance=l2, type=hnsw, lib=vsag, model=ob_vl_embed, dim=768, sync_mode=manual, content_type=image) ) ORGANIZATION HEAP;
后建
后建文本语义索引示例
创建测试表
items后,使用CREATE VECTOR INDEX语句创建vector_idx索引:CREATE TABLE items ( id BIGINT PRIMARY KEY, doc VARCHAR(100) ); -- 假设 ob_embed 模型的创建在此前已完成(请参考"前提条件"部分注册模型) CREATE VECTOR INDEX vector_idx ON items (doc) WITH (distance=l2, lib=vsag, type=hnsw_sq, model=ob_embed, dim=1024, sync_mode=async, sync_interval=10s);向测试表
items插入一条数据,系统会自动进行嵌入:INSERT INTO items(id, doc) VALUES(1, 'Rose');后建图片语义索引示例
CREATE TABLE product_images ( id INT PRIMARY KEY, image_url VARCHAR(4096), product_name VARCHAR(256) ) ORGANIZATION HEAP; INSERT INTO product_images VALUES (1, 'https://example.com/shoes.jpg', 'Red Shoes'), (2, 'https://example.com/bag.jpg', 'Leather Bag'); CREATE VECTOR INDEX img_idx ON product_images(image_url) WITH (distance=l2, type=hnsw, lib=vsag, model=ob_vl_embed, dim=768, sync_mode=manual, content_type=image);
更新
更新 VARCHAR 类型的数据时,系统会重新进行嵌入:
- 同步模式:更新后立即重新进行嵌入。
- 异步模式:更新后由后台任务在下次触发周期时重新进行嵌入。
使用示例:
UPDATE items SET doc = 'Lily' WHERE id = 1;
删除
删除操作与常规向量索引一致,直接删除数据即可。
使用示例:
DELETE FROM items WHERE id = 1;
搜索
-- 假设 ob_embed 模型的创建在此前已完成
CREATE TABLE items (
id INT PRIMARY KEY,
doc varchar(100),
VECTOR INDEX vector_idx(doc)
WITH (distance=l2, lib=vsag, type=hnsw_sq, model=ob_embed, dim=1024, sync_mode=immediate)
);
INSERT INTO items(id, doc) VALUES(1, 'Rose');
INSERT INTO items(id, doc) VALUES(2, 'Sunflower');
INSERT INTO items(id, doc) VALUES(3, 'Rose');
INSERT INTO items(id, doc) VALUES(4, 'Sunflower');
INSERT INTO items(id, doc) VALUES(5, 'Rose');
-- 使用原始文本进行搜索
SELECT id, doc FROM items
ORDER BY semantic_distance(doc, 'Sunflower')
APPROXIMATE LIMIT 3;
返回结果如下:
+----+-----------+
| id | doc |
+----+-----------+
| 4 | Sunflower |
| 2 | Sunflower |
| 3 | Rose |
+----+-----------+
3 rows in set
使用 semantic_vector_distance 表达式,传入向量进行搜索,当搜索语句中带有 APPROXIMATE/APPROX 子句时,会使用向量索引进行搜索。
-- 假设 ob_embed 模型的创建在此前已完成(请参考"前提条件"部分注册模型)
CREATE TABLE items (
id INT PRIMARY KEY,
doc varchar(100),
VECTOR INDEX vector_idx(doc)
WITH (distance=l2, lib=vsag, type=hnsw_sq, model=ob_embed, dim=1024, sync_mode=immediate)
);
INSERT INTO items(id, doc) VALUES(1, 'Rose');
INSERT INTO items(id, doc) VALUES(2, 'Lily');
INSERT INTO items(id, doc) VALUES(3, 'Sunflower');
INSERT INTO items(id, doc) VALUES(4, 'Rose');
-- 先获取查询向量
SET @query_vector = AI_EMBED('ob_embed', 'Sunflower');
-- 使用向量进行索引搜索
SELECT id, doc FROM items
ORDER BY semantic_vector_distance(doc, @query_vector)
APPROXIMATE LIMIT 3;
返回结果如下:
+----+-----------+
| id | doc |
+----+-----------+
| 3 | Sunflower |
| 1 | Rose |
| 4 | Rose |
+----+-----------+
3 rows in set
-- 使用向量进行暴力搜索(精确结果)
SELECT id, doc FROM items
ORDER BY semantic_vector_distance(doc, @query_vector)
LIMIT 3;
返回结果如下:
+----+-----------+
| id | doc |
+----+-----------+
| 3 | Sunflower |
| 4 | Rose |
| 1 | Rose |
+----+-----------+
3 rows in set
图片语义索引搜索示例:
-- 以图搜图(IMAGE → IMAGE)
SELECT id, product_name, image_url
FROM product_images
ORDER BY semantic_distance(image_url, 'https://example.com/query.jpg', 'IMAGE')
APPROXIMATE LIMIT 10;
-- 以文搜图(TEXT → IMAGE,跨模态)
SELECT id, product_name, image_url
FROM product_images
ORDER BY semantic_distance(image_url, 'a photo of red shoes', 'TEXT')
APPROXIMATE LIMIT 10;
-- 结合 WHERE 过滤
SELECT id, product_name
FROM product_images
WHERE product_name LIKE 'Red%'
ORDER BY semantic_distance(image_url, 'https://example.com/query.jpg', 'IMAGE')
APPROXIMATE LIMIT 10;