先破除你的固有印象:语义搜索只是其中一条实现路径,不是全部。
按论文的开放数据集搜索:用户输入(关键词 / 示例数据 / 自然语言)→ 系统要找的输出是完整数据集(整套资产),不是数据集里面的一条记录。
先把 5 种模态讲清楚:表格 tabular、图 graph、空间 spatial、向量 vector、JSON 文档 document,分别讲:原始怎么存 → 建立什么索引 → 用户查询进来怎么算相似度 → 最后输出哪些数据集。
重要区分两件事: 1)原始存储:硬盘 / 数据库里面原始数据长什么样; 2)索引库:为了快搜,额外预计算出来的 “检索替身”,搜索几乎不会扫描全部原始数据; 3)相似度计算 sim (Q, Dᵢ):拿【用户查询 Q】和【数据集 Dᵢ的索引替身】算分数,对数据集排序; 4)输出:返回 top‑k数据集的元信息 + 访问入口,不是返回数据集内部一条条数据。
1️⃣ 表格 Tabular(csv、数据库表)
原始存储
磁盘 CSV / 关系数据库 MySQL。 每行是观测,每列是属性;例如笔记本电脑表:[brand,model,cpu,price],成千上万行。 \(T_i=\{A_1^i,A_2^i…A_n^i\}\),核心单元是列。
预先建索引(3 大类)
- 传统元数据索引:表标题、描述、标签(关键词倒排索引)—— 这就是最早 Google Dataset Search 用的,纯文本语义 / 关键词匹配。
- 值草图索引:对每一列全部的值做 MinHash/LSH 草图(压缩哈希摘要),只保留集合重叠信息,不用存全部原始单元格。代表:LSH‑Ensemble、JOSIE。
- 神经列嵌入索引:用 PLM 预训练模型,给每一列生成向量,存入向量库。代表 DeepJoin、Starmie。
用户查询的 3 种输入,完整链路
- ✅关键词查询:
“笔记本价格数据”拿关键词去元数据倒排索引匹配表标题、描述,得到候选数据集。👉纯文本语义搜索。 - ✅示例表查询(Query‑by‑Example,论文重点):上传一张小示例表(几行几列),想找可以join 连接 /union 合并的其他表。
- 方案 A(草图路线):把示例表每一列生成 MinHash 草图;和索引库里所有表的列草图算 Jaccard /containment(集合重叠度),得到
sim(Q,Dᵢ)(衡量两张表能不能 join); - 方案 B(嵌入路线):示例表列编码成向量,向量库做向量检索,得到列层面相似度,再聚合得到整张数据集的相似度分数。
- 方案 A(草图路线):把示例表每一列生成 MinHash 草图;和索引库里所有表的列草图算 Jaccard /containment(集合重叠度),得到
- ✅自然语言查询:“找可以扩充笔记本产品特征的数据集” → 交给 LLM 做语义规划,拆解成列需求,再走上面的嵌入 / 草图检索。
输出结果:返回若干完整数据集(数据集名字、来源链接),不是返回某几行笔记本数据。
2️⃣ JSON 文档(半结构化文档,NoSQL MongoDB)
原始存储
JSON,嵌套 key‑value,可以数组嵌套对象。
{"title":"Inception","genres":["Action","Sci‑Fi"],"cast":[{"name":"DiCaprio","role":"Cobb"}]}
论文里会把 JSON 转成树结构,对象、数组、字段名、字段值都是树的节点。
预先建索引
- Schema 索引:提取 JSON 的 key 结构(有哪些字段、嵌套层级);
- 树编辑距离 TED 的专用树索引(JEDI):把每个 JSON 文档解析为树,存树的结构摘要;
- 叶子节点文本倒排索引:针对字段字符串值。
用户搜索链路
用户输入:示例 JSON 文档(给一段样例 JSON,找结构、内容相似的 JSON 数据集)
- 把用户输入 JSON 解析成查询树 Q;
- 索引先过滤:利用叶子文本、schema 快速筛掉明显不匹配的候选;
- 对剩下候选,计算树编辑距离 TED:把查询树变成数据集 JSON 树需要多少次增删改节点;距离越小越相似;
- 聚合得到数据集整体相似度 \(sim(Q,D_i)\),排序输出 JSON 数据集。
注意:这里不完全靠语义向量,大量在比「嵌套树结构」,就算语义接近,如果嵌套层级完全不一样,分数很低。
3️⃣ 空间数据集 Spatial(地理 GPS、轨迹、经纬度点集)
论文统计:60% 开放政府数据集带有地理坐标。
原始存储
每一条记录是坐标点 \(d_i=(longitude,latitude)\);一整个数据集 D 就是一大群点(车辆轨迹、传感器点位)。
预先建索引
- 空间 R‑tree / R‑Grove:存储数据集的包围盒(bounding box);
- 网格直方图索引 DBF:把地理平面切网格,统计每个网格里面点的密度,压缩成直方图;
- 部分系统也会存文本元数据(“北京市交通轨迹” 关键词倒排)。
用户查询三种输入
- 关键词:
“北京出租车轨迹数据集”→ 元数据文本检索(语义搜索)。 - 空间范围查询:在地图框选一块区域。系统计算候选数据集包围盒和查询框的重叠面积,重叠越大分数越高。
- 示例数据集查询:上传一份小的轨迹点集 Q,找空间分布类似的轨迹数据集。
- 方案 1 Hausdorff 距离:计算两个点集合之间最大最小距离;
- 方案 2 EMD(地球移动距离):把查询和候选数据集都转为网格密度直方图,算分布差异;
👉这两步几乎不用文本语义,纯粹几何分布计算!就算数据集标题写的乱七八糟,只要点位分布接近,也会被检索出来。
输出:整套轨迹数据集,不是单条 GPS 点。
4️⃣ 向量数据集 Vector(多向量集合,重点!容易混淆)
不要和普通单向量检索搞混。
原始存储
一个向量数据集 \(D^v=\{v_1,v_2…v_m\}\):一整个数据集由一大堆独立稠密向量组成。比如:图片数据集,每张图片编码一个 embedding 向量;数据集整体就是一堆向量的集合。
❗普通向量搜索:1 个 query 向量 → 找最接近的向量(找单张图片); ✅向量数据集搜索(论文):查询本身也是一组向量 Q,要找整套向量集合 Dᵢ。
预先建索引
每个数据集不是存单个代表向量,而是保留全部向量,构建:倒排索引、LSH 哈希、质心索引(PLAID)、稀疏向量索引(SLIM)。
用户查询链路
示例:用户上传几张查询图片(编码得到一组查询向量集合 Q),想要找一整套图片数据集 Dᵢ。
- 对每个查询向量,去候选数据集内部向量找最匹配的向量;
- 使用 MaxSim 公式:每个 query 向量取最大相似度,全部求和,得到集合‑集合总分 \(sim(Q,D_i)\);
\(S(Q,D_i)=\sum_{j=1}^{n}\max_{k=1...m}sim(v_{qj},v_{ik})\) 3. 根据总分,对候选数据集排序输出。
关键点:不是返回几张匹配图片,而是评估整套图片数据集整体匹配度。 这里可以用语义 embedding,但核心算子 MaxSim 做的是集合之间匹配聚合,和普通单向量语义检索不一样。
5️⃣ 图数据集 Graph(社交网络、知识图谱)
原始存储
\(G=(V,E)\):顶点集合 V,边集合 E;每个点、边可以带标签。例如社交网络:节点是人,边是好友关系。
预先建索引
因为图编辑距离 GED 是 NP‑hard,不能暴力算,预计算各种下界摘要:
- 标签集摘要、子图分区摘要;
- 部分 GNN:把整张图编码为图嵌入向量存入向量库。
用户查询链路:用户输入一张查询小图 Q(示例查询)
- 使用索引的图标签、子图特征做大规模剪枝,把明显不可能匹配的图数据集直接扔掉;
- 剩下少量候选,计算GED 图编辑距离:需要多少次增删节点 / 边,才能把查询图变成候选数据集图;或者 MCS 最大公共子图;
- 距离越小代表两套图结构越相似,输出 top‑k 图数据集。
很多时候比的是拓扑结构,不是文本语义。两张图语义描述不一样,但拓扑结构高度相似,依然会命中。
🧩把全部逻辑串成一条完整通用流水线(论文 Fig.2)
用户输入Q(3种形式:关键词 / 示例数据 / 自然语言)
↓
【编码层】
- 关键词:文本分词
- 示例数据:表格/JSON/图/空间点 → 生成草图/树/向量/几何摘要
- 自然语言:LLM解析,翻译成查询意图、中间查询表示
↓
【索引库】:已经离线预建好的各模态索引(草图、树索引、空间R树、向量索引、图下界摘要、元数据倒排)
↓
【相似度计算 sim(Q, Dᵢ) !!核心】
⚠️ 这里不只有语义向量!分多条路线:
1)元数据关键词路线:BM25等文本语义匹配(传统方案)
2)结构路线:TED树编辑距离、GED图编辑距离、空间重叠面积
3)集合统计路线:MinHash/Jaccard、EMD、Hausdorff(纯值/分布,不理解语义)
4)嵌入语义路线:向量cosine、MaxSim(深度学习语义)
↓
对全部候选数据集按 sim(Q,Dᵢ) 做排序
↓
【输出结果】:返回top‑k个**数据集资产**:数据集名字、描述、下载链接;
不是数据集内部的行、图片、节点!
🔴回答你心里最大的困惑:“我一直以为是按语义搜索的”
语义搜索(embedding / 大模型)只是多条路线中的一条,不是全部。
表格
| 检索路线 | 是否依赖语义理解 | 适用模态 |
|---|---|---|
| 元数据关键词 BM25 | 是(文本语义) | 全部模态(传统老方案) |
| MinHash、Jaccard 集合重叠 | ❌完全不理解语义,只看值重合 | 表格 |
| TED 树编辑距离 | ❌只看 JSON 树结构 | JSON |
| Hausdorff / EMD 空间距离 | ❌只看坐标点分布 | 空间 |
| GED 图编辑距离 | ❌只看图拓扑结构 | 图 |
| Embedding 向量、MaxSim | ✅深度语义 | 表格、向量、也可用于其他模态 |
论文里一个重要趋势:过去只靠元数据文本语义;现在越来越多用【内容本身】做搜索。 内容本身包含两类信息:①结构、统计分布(无语义);②深度学习 embedding(语义)。两者可以单独用,也可以混合加权融合在一起算最终 sim (Q,Dᵢ)。
举个现实例子: 一份空间轨迹数据集,如果作者写的标题、描述写的乱七八糟(元数据很差,语义检索搜不到)。 但是你上传一份示例轨迹点集,用Hausdorff 距离做内容搜索,依然可以找到这套数据集。—— 这就是超越元数据语义搜索的价值。
一个容易混淆的对比
- 普通语义搜索:给一句话,返回文档 / 图片(查询‑记录一级);
- 开放数据集搜索:可以用语义,但也可以用结构、统计;最终输出整套数据集集合(查询‑数据集两级)。
466



被折叠的 条评论
为什么被折叠?



