我有一个用于存储餐厅名称和它们所在城市的数据库表。示例:
姓名 | 城市
十一麦迪逊公园| 高分辨率照片| CLIPARTO 纽约市
格拉梅西酒馆| 高分辨率照片| CLIPARTO 纽约市
暹罗莲花 | 托克
现代 | 洛杉矶
ABC厨房| 洛杉矶
现在当INSERT之前有一个传入的条目,如果同一个城市没有类似的餐厅名称,我想继续执行插入。
但是如果条目是这样的,比如 { name: "Eleven Madison", city: "NYC" },我想在 "name" 列中找到具有相同城市的类似条目,在这个例子中,"NYC" 中的 "11 madison park" ”,我想插入并在“冲突”表中存储一个新行 - 使用这些餐厅的 ID(最后插入 id 和类似的行 id)
我使用了Levenshtein 距离算法,并带有以下 SQL 查询:
SELECT id, levenshtein_ratio(name, 'Eleven Madison') AS levsh from restaurants
where
city_name = 'NYC'
order by levsh asc
limit 0, 1
然后我将阈值设置为 8,如果 levsh 小于 8,则将其标记为冲突,即在“冲突”表中插入新记录。在表增长到 1000 条记录之前,此查询运行良好。现在这个查询需要 2 秒才能完成。
我知道这是因为我正在计算城市中所有餐馆的 levenshtein_ratio - 我只需要对 ex 的相似名称应用比率函数。那些包含 'Eleven' , 'Madison',.. 或者更好的是,如果我能做类似的事情
WHERE city_name = 'NYC' AND SOUNDEX(any word in `name`) = SOUNDEX(any word in 'Eleven Madison')
请提供有关如何改进和优化此查询的建议,如果可能的话,请提供任何更好的方法来解决我正在做的事情。
谢谢