在BigQuery中使用vector_search时,如何基于查询表过滤基表
基于BigQuery vector_search实现按查询表行过滤基表的向量匹配需求
背景说明
BigQuery的vector_search函数使用时需准备两类表:存储所有嵌入向量的基表,以及存储待匹配嵌入向量的查询表。示例代码如下:
SELECT * FROM VECTOR_SEARCH( (SELECT * FROM mydataset.table1 WHERE doc_id = 4), 'my_embedding', (SELECT doc_id, embedding FROM mydataset.table2), 'embedding', top_k => 2, options => '{"use_brute_force":true}');
其中table1为基表,table2为查询表。
需求描述
当前需要实现:针对查询表的每一行,用该行对应的doc_id过滤基表,再执行向量匹配,最终所有匹配结果需与对应的doc_id关联。
例如查询表包含3行数据:
| doc id | embeddings |
|---|---|
| 1 | [1, 2, 3, 4] |
| 2 | [5, 5, 6, 7] |
| 3 | [9, 10, 11, 12] |
这相当于分别针对doc_id=1、doc_id=2、doc_id=3调用vector_search函数,为每行的嵌入向量找到最匹配的结果。
已考虑的方案及问题
- 编写参数化Python脚本并发送异步请求:需处理扩缩容的基础设施问题,且脱离BigQuery生态。
- 编写BigQuery存储过程:脚本会按顺序循环处理参数,执行速度较慢。
- 使用BigQuery ML对文档嵌入向量执行K-means聚类:将聚类中心存储到独立表,再计算每个文档与聚类中心的余弦距离,基于聚类中心查询簇内数据,本质是在文档层面重新实现IVF索引流程,复杂度较高。
期望解决方式
若能修改vector_search函数,使其支持基于查询表每行的值过滤基表,将大幅节省时间与精力。
内容的提问来源于stack exchange,提问作者Neil Bhutada
相关产品推荐
相关产品推荐

