如何在Typesense中对多向量字段执行vector_query查询?
在Typesense中同时查询多个向量字段的实用方案
提前合并向量(最省心的方式)
不用在查询时折腾多个字段,直接把三个标签的向量做加权合并,生成一个单独的merged_vector字段存在文档里。比如三个标签权重相同的话,就把每个位置的向量值相加后除以3;如果某个标签更重要(比如第一个是核心标签),可以给它更高的权重(比如0.5,另外两个各0.25)。查询时只需要针对这个合并向量做向量检索,就能同时体现三个标签的特征。
示例代码:// 生成合并向量(假设vec1、vec2、vec3是三个标签的嵌入向量) const mergedVec = vec1.map((val, i) => val * 0.5 + vec2[i] * 0.25 + vec3[i] * 0.25); // 存入Typesense文档的merged_vector字段查询时:
const userQueryEmbedding = await getOpenAIEmbedding("业余网球运动俱乐部"); const searchParams = { q: "*", vector_query: `merged_vector:[${userQueryEmbedding.join(",")}] knn=10` };多向量字段联合查询(直接用原生语法)
Typesense支持在vector_query里同时指定多个向量字段,还能给每个字段设置权重,语法用逗号分隔即可。前提是你的集合schema里已经把这三个向量字段(比如tag1_vec、tag2_vec、tag3_vec)都配置成float[]类型并开启了向量索引。
示例代码:const userQueryEmbedding = await getOpenAIEmbedding("业余网球运动俱乐部"); const searchParams = { q: "*", vector_query: `tag1_vec:[${userQueryEmbedding.join(",")}] weight=0.4, tag2_vec:[${userQueryEmbedding.join(",")}] weight=0.3, tag3_vec:[${userQueryEmbedding.join(",")}] weight=0.3 knn=15` };这里的权重可以根据标签的优先级调整,核心标签权重高一些,次要的低一些。
结合关键字与向量检索(更精准)
如果想同时兼顾用户输入的关键词和向量相似性,可以把q参数设为用户的搜索词,同时加上vector_query,Typesense会自动融合两者的评分结果。比如用户搜“网球”,既会匹配俱乐部名称/描述里的关键词,也会结合向量的相似性排序。
示例:const searchParams = { q: "网球", vector_query: `merged_vector:[${userQueryEmbedding.join(",")}] knn=10`, query_by: "club_name,club_description" };
内容的提问来源于stack exchange,提问作者typesenseQuestions
相关产品推荐
相关产品推荐

