基于共享path字段与关键词匹配扩充table1中linkTo字段的技术实现咨询
基于共享path字段与关键词匹配扩充table1中linkTo字段的技术实现咨询
嘿,我来帮你搞定这个基于关键词匹配扩充链接列表的问题!先理清楚你的需求和数据情况:
数据背景
我们有两张共享path字段的表:
- Table1:存储各路径以及已关联的链接列表
| path | linkTo |
|---|---|
| puntonet | [{"url1.htm"},{"url2.htm"},{"url3.htm"},{"puntonet-2.0"}] |
| puntonet-2.0 | [{"url4.htm"},{"url5.htm"}] |
| puntonet-4 | [{"url6.htm"},{"url7.htm"}] |
| puntonet-5 | [{"url.htm"},{"url8.htm"}] |
- Table2:存储每个路径对应的用户搜索关键词集合
| path | arrKWs |
|---|---|
| puntonet | ['kw1','kw2'] |
| puntonet-2.0 | ['kw2','kw3'] |
| puntonet-4 | ['kw2','kw4'] |
| puntonet-5 | ['kw5','kw4'] |
| url1.htm | ['kw1','kw4'] |
核心需求
为Table1中的每一条path,从Table2里筛选出符合以下条件的URL,把它们添加到原有的linkTo列表中:
- 该URL在Table2中的关键词集合,和当前
path的关键词集合有重叠 - 该URL没有出现在当前
path原有的linkTo列表里
最终期望得到的更新后Table1如下:
| path | linkTo |
|---|---|
| puntonet | [{"url1.htm"},{"url2.htm"},{"url3.htm"},{"puntonet-2.0"},{"puntonet-4"}] |
| puntonet-2.0 | [{"url4.htm"},{"url5.htm"},{"puntonet"},{"puntonet-4"}] |
| puntonet-4 | [{"url6.htm"},{"url7.htm"},{"puntonet"},{"puntonet-2.0"},{"puntonet-5"},{"url1.htm"}] |
| puntonet-5 | [{"url8.htm"},{"puntonet-4"},{"url1.htm"}] |
实现思路(以PostgreSQL为例)
这类需求用SQL处理的话,核心是拆解数组、建立关键词关联、过滤已有链接,最后合并结果,步骤如下:
- 拆分关键词数组:把Table2里的关键词字符串转成行级数据,方便后续匹配
- 匹配共享关键词的路径:通过关键词关联,找到所有和当前
path有共同关键词的URL - 排除已存在的链接:对比原
linkTo列表,过滤掉已经存在的URL - 合并新链接到原列表:把筛选后的新URL合并到原
linkTo中,生成最终结果
给你一段示例代码参考:
-- 临时表:拆分Table2的关键词为行数据 WITH split_kws AS ( SELECT path, -- 清洗字符串并拆分关键词 unnest(string_to_array(replace(replace(arrKWs, '''', ''), '[]', ''), ',')) AS kw FROM table2 ), -- 临时表:找到每个path对应的所有共享关键词的相关路径 related_paths AS ( SELECT t1.path AS source_path, sk2.path AS related_path FROM table1 t1 JOIN split_kws sk1 ON t1.path = sk1.path JOIN split_kws sk2 ON sk1.kw = sk2.kw AND sk1.path != sk2.path GROUP BY t1.path, sk2.path ), -- 临时表:提取Table1原linkTo中的已存在路径 existing_links AS ( SELECT path, unnest(string_to_array(replace(replace(linkTo, '{}', ''), '[]', ''), ',')) AS existing_path FROM table1 ) -- 生成最终的更新后数据 SELECT t1.path, -- 合并原有链接和新链接,去重后转成目标格式 '[' || array_to_string( array_agg(DISTINCT trim(COALESCE(el.existing_path, rp.related_path), '"{}')) , '},{' ) || ']' AS linkTo FROM table1 t1 LEFT JOIN existing_links el ON t1.path = el.path LEFT JOIN related_paths rp ON t1.path = rp.source_path -- 排除已经在原linkTo里的路径 WHERE NOT EXISTS ( SELECT 1 FROM existing_links el2 WHERE el2.path = t1.path AND el2.existing_path = rp.related_path ) GROUP BY t1.path;
注意事项
- 不同数据库处理数组/字符串的函数不一样,比如MySQL要用
JSON_TABLE拆分JSON格式的字段,需要根据你实际使用的数据库调整语法 - 如果
linkTo和arrKWs是纯字符串(不是原生JSON/数组类型),要先做好字符串清洗,去掉多余的引号、括号等符号 - 一定要加去重逻辑,避免同一个URL被重复添加到
linkTo里
备注:内容来源于stack exchange,提问作者lino
相关产品推荐
相关产品推荐

