教程 搜索 / 后端集成 / 语义搜索与混合搜索
📝 文字 ● 中级 更新于 2026-06-02

如何为后端添加语义搜索和混合搜索?

TL;DR:你的托管后端内置了 pgvector托管向量嵌入。添加一个 vector(1536) 列,用 client.vector.embed(text) 嵌入文本并存储,然后通过 client.search.text(...)(全文搜索)、client.vector.search(...)(纯向量搜索)或 client.search.hybrid(...)(全文 + 向量融合)按语义查询。无需外部向量数据库,无需管理嵌入 API 密钥。

关键词搜索(LIKE '%cat%')只能匹配"cat"这个词,找不到"kitten"或"feline"。语义搜索能做到,因为它比较的是含义——以向量形式编码——而非字符本身。过去实现这一点需要自己搭一套嵌入模型、向量存储和相似度查询的完整链路。LingCode Cloud 后端已把这三者都内置好,"按语义搜索笔记"只需几行代码,不用再起一个新服务。

本教程假设你已连接了托管后端。最快的方式:直接告诉智能体"为我的笔记添加语义搜索",它会自动添加列、在插入时生成嵌入、并接好查询逻辑。本文的目的是解释背后的运作原理,让你明白它做了什么。

三种搜索模式

第一步——添加向量列

嵌入向量是一组数字,存储在 vector(N) 列中(N 为模型维度;内置嵌入为 1536 维)。让智能体操作,或在控制台 SQL 标签页中执行迁移:

ALTER TABLE notes ADD COLUMN embedding vector(1536);

第二步——嵌入文本并存储

托管嵌入意味着你不需要自带嵌入 API 密钥。创建或编辑一行数据时,嵌入其文本并保存向量:

const { data } = await client.vector.embed(note.body);   // → { embedding: [...] }
await client.from('notes').eq('id', note.id).update({ embedding: data.embedding });

第三步——执行搜索

全文搜索无需嵌入:

const { data } = await client.search.text({ table: 'notes', column: 'body', query: 'budget planning' });

混合搜索会先嵌入查询词,再融合关键词排序与向量排序:

const { embedding } = (await client.vector.embed('how do I save money')).data;
const { data } = await client.search.hybrid({
  table: 'notes', text_column: 'body', vector_column: 'embedding',
  query: 'how do I save money', embedding,
});

返回结果按相关度排序,且(对于租户作用域的数据 API)只包含当前登录用户有权查看的行——你的 RLS 策略依然生效。

在控制台中试用

前往 lingcode.dev/backends数据库,打开一张表并点击搜索。输入查询词,选择全文搜索或混合搜索,控制台会自动完成嵌入并展示排序后的结果——这是在接入应用前快速验证相关性的好方法。

提升性能

对于较大的表,建议为向量列添加索引以避免全表扫描,并为全文搜索添加生成的 tsvector 列。当你提到数据规模时,智能体会自动添加——核心是在向量列上建 HNSW/IVF 索引,在文本列上建 GIN 索引。在数据量适中时,现在的配置已经足够快了。

下一步