You need to enable JavaScript to run this app.
文档中心
云数据库 veDB MySQL 版

云数据库 veDB MySQL 版

复制全文
下载 pdf
veDB-Search
veDB-Search 语法说明
复制全文
下载 pdf
veDB-Search 语法说明
veDB-Search 基于 veDB MySQL 和 Cloud Search,支持标量、向量、全文混合检索。本文介绍使用 veDB-Search 功能常用的 SQL 语法。​
概述​
veDB-Search 支持以下能力:​
  • 向量相似度搜索:基于语义嵌入进行智能检索。​
  • 结构化查询:完整的 WHERE 条件过滤支持。​
  • 全文检索:支持 MySQL 标准 MATCH...AGAINST 语法。​
  • 混合查询:同时使用多种搜索方式的复合查询。​
基本工作流程如下:​
  1. 创建表:表结构需要包含向量字段和需要检索的字段(索引字段必须为 NOT NULL)。​
  1. 创建 ANN 索引:需要指定向量字段或 FTS 字段,标量字段通过 SECONDARY_ENGINE_ATTRIBUTE 配置。​
  1. 插入数据:包含向量嵌入和文本数据。​
  1. 执行查询:使用向量搜索、全文检索或混合查询(查询需使用 FORCE INDEX 强制选择)。​
表结构设计​
​
表结构设计
插入数据
更新数据
​
基本表结构​
​
CREATE TABLE articles (​
id INT PRIMARY KEY AUTO_INCREMENT,​
title TEXT NOT NULL, -- FTS字段​
content TEXT NOT NULL, -- FTS字段​
category VARCHAR(50) NOT NULL, -- 标量字段​
price FLOAT NOT NULL, -- 标量字段​
publish_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 标量字段​
is_active BOOL NOT NULL DEFAULT TRUE, -- 标量字段​
embedding VECTOR(512) NOT NULL -- 向量字段​
);​
​
带 ANN 索引的表结构​
​
CREATE TABLE articles (​
id INT PRIMARY KEY AUTO_INCREMENT,​
title TEXT NOT NULL, -- FTS字段​
content TEXT NOT NULL, -- FTS字段​
category VARCHAR(50) NOT NULL, -- 标量字段​
price FLOAT NOT NULL, -- 标量字段​
publish_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 标量字段​
is_active BOOL NOT NULL DEFAULT TRUE, -- 标量字段​
embedding VECTOR(512) NOT NULL, -- 向量字段​
ANN KEY idx (embedding, content) SECONDARY_ENGINE_ATTRIBUTE = '{"scalar_fields": "category,price,is_active"}'​
);​
​
字段类型支持​
​
MySQL 类型​
用途​
示例​
VECTOR(n)​
向量嵌入​
embedding VECTOR(512) NOT NULL​
TEXT​
全文检索​
title TEXT NOT NULL​
BLOB/LONGBLOB/MEDIUMBLOB/TINYBLOB​
全文检索​
content LONGBLOB NOT NULL​
VARCHAR(n)​
标量过滤​
category VARCHAR(50) NOT NULL​
INT/BIGINT​
数值过滤​
price INT NOT NULL​
FLOAT/DOUBLE​
浮点过滤​
rating FLOAT NOT NULL​
BOOL​
布尔过滤​
is_active BOOL NOT NULL​
TIMESTAMP/DATETIME​
时间过滤​
created_at TIMESTAMP NOT NULL​
​
注意​
  • 所有索引列必须定义为 NOT NULL。​
  • 只有 TEXT 和 BLOB 系列字段支持 MATCH 全文检索。​
  • 标量字段不能直接作为 ANN 索引字段,只能通过 SECONDARY_ENGINE_ATTRIBUTE 配置。​
​
ANN 索引创建​
ANN 索引仅支持以下结构,标量列在 SECONDARY_ENGINE_ATTRIBUTE 中另行设置。​
  • 纯向量索引:只包含一个 VECTOR 字段。​
  • 混合索引:包含一个 VECTOR 字段 + 一个 TEXT/BLOB 字段。​
​
基本语法
使用示例
​
​
CREATE ANN INDEX index_name ON table_name(index_column) ​
[SECONDARY_ENGINE_ATTRIBUTE = 'scalar_config'];​
​
SECONDARY_ENGINE_ATTRIBUTE 选项说明:​
​
{​
"scalar_fields": "field1, field2, field3", // 可过滤的标量字段列表​
}​
​
注意​
scalar_fields 中列出的字段必须存在于表中且为 NOT NULL。​
​
全文检索 (MATCH)​
说明​
MATCH(...) AGAINST (...) 所匹配的字符串语法按照 ElasticSearch 对应模式的语法过滤。​
​
函数限制
支持的 MATCH 语法
使用示例
​
MATCH 函数只支持全文字段检索:​
  • TEXT​
  • BLOB、TINYBLOB、MEDIUMBLOB、LONGBLOB​
不支持以下字段类型:​
  • VARCHAR、CHAR 等字符串类型。​
  • 数值类型(INT、FLOAT 等)。​
  • 其他非文本类型。​
​
混合查询(向量+全文+标量)​
混合索引查询​
使用混合索引进行全功能查询:​
​
SELECT id, title, content, category,​
MATCH(title) AGAINST('artificial intelligence') as fts_score​
FROM articles force index(idx_hybrid)​
WHERE MATCH(title) AGAINST('artificial intelligence')​
AND category IN ('technology', 'science')​
AND price BETWEEN 10.00 AND 100.00​
AND is_active = true​
AND publish_date > '2023-01-01'​
ORDER BY l2_distance(TO_VECTOR('[0.1, 0.2, 0.3, ...]'), embedding)​
LIMIT 10;​
​
使用场景​
​
文档检索
商品推荐
知识库问答
​
​
-- 查找与"机器学习"相关的技术文档​
SELECT id, title, ​
MATCH(content) AGAINST('machine learning algorithms') as relevance​
FROM documents force index(idx_doc_hybrid)​
WHERE MATCH(content) AGAINST('machine learning algorithms')​
AND category = 'technical'​
AND price <= 50.00​
AND publish_date >= '2024-01-01'​
ORDER BY l2_distance(TO_VECTOR('[...]'), embedding)​
LIMIT 15;​
​
​
WHERE 条件支持​
使用限制​
使用 WHERE 条件检索时,WHERE 条件中的字段必须在 ANN 索引中定义。正确示例如下:​
​
CREATE ANN INDEX idx_ann ON table_name(emb, category, price, rank_score, is_active);​
WHERE category = 'electronics' AND price > 100;​
​
SQL 查询​
​
完全支持的 SQL 查询
不支持的 SQL 查询
​
操作符​
​
类型​
操作符​
​
示例​
基本比较操作符​
=​
​
​
​
WHERE category = 'electronics'​
​
​
!= / <>​
​
​
​
WHERE price != 100.0​
​
​
>​
​
​
​
WHERE price > 50.0​
​
​
>=​
​
​
WHERE rank_score >= 80​
​
​
<​
​
​
WHERE price < 200.0​
​
​
<=​
​
​
​
WHERE rank_score <= 90​
​
复合操作符​
IN 操作符​
​
字符串 IN​
​
WHERE category IN ('electronics', 'books', 'toys')​
​
​
​
整数 IN​
​
WHERE rank_score IN (85, 90, 78)​
​
​
​
大整数 IN​
​
WHERE large_id IN (1000000001, 1000000003, 1000000005)​
​
​
​
布尔值 IN​
​
WHERE is_active IN (true, false)​
​
​
BETWEEN 操作符​
​
数值 BETWEEN​
​
WHERE price BETWEEN 50.00 AND 200.00​
WHERE rank_score BETWEEN 70 AND 90​
​
​
​
字符串 BETWEEN​
​
WHERE category BETWEEN 'a' AND 'z' -- 当前使用term查询,应该使用range​
​
逻辑操作符​
​
AND 操作符​
​
简单 AND​
​
WHERE category = 'electronics' AND price > 100.00​
​
​
​
多个 AND 条件​
​
WHERE category = 'electronics' AND price > 50.00 AND price < 300.00​
​
​
​
不同操作符组合​
​
WHERE category = 'electronics' AND rank_score IN (85, 92, 68)​
​
​
​
AND with BETWEEN​
​
WHERE category = 'electronics' AND price BETWEEN 100.00 AND 250.00​
​
​
OR 操作符​
简单 OR​
​
WHERE category = 'electronics' OR category = 'books'​
​
​
​
数值 OR​
​
WHERE price < 50.00 OR price > 250.00​
​
​
​
混合类型 OR​
​
WHERE category = 'games' OR rank_score > 85​
​
​
嵌套条件​
支持的嵌套层级如下所示:​
​
嵌套层级​
示例​
2 层嵌套​
​
WHERE category = 'electronics' AND (price < 100.00 OR price > 200.00)​
​
中等复杂度嵌套​
​
WHERE (category = 'electronics' AND price > 100.00) OR (category = 'books' AND price < 50.00)​
​
多分支嵌套​
​
WHERE (category = 'electronics' OR category = 'toys') AND (price BETWEEN 50.00 AND 200.00)​
​
深度嵌套​
​
WHERE ((category = 'electronics' AND price > 80.00) OR (category = 'books' AND rating >= 4.0))​
AND (is_active = true OR quantity > 30)​
​
注意​
推荐使用 1~2 层嵌套,4 层及以上可能会导致 Core Dump。​
​
复杂表达式 ​
​
SQL 操作​
示例​
子查询​
​
​
INSERT INTO t_nested (category, price, rank_score, is_active, large_id, rating, quantity, emb)​
SELECT category, price, rank_score, is_active, large_id, rating, quantity, emb​
FROM t_nested FORCE INDEX(idx_ann)​
WHERE price > (SELECT AVG(price) FROM t_nested)​
ORDER BY l2_distance(TO_VECTOR('[5.22, 9.55, 2.88, 0.33]'), emb) LIMIT 3;​
​
​
​
​
​
​
​
​
​
最近更新时间:2026.08.21 11:56:53
这个页面对您有帮助吗?
有用
有用
无用
无用