我有两张邮政地址信息表——一张大约有 200 万条记录,另一张大约有 4000 万条记录。它们的质量很差,而且彼此也不太兼容(两组中的约定不同,某些字段以不切实际的方式被切断...... - 换句话说,真实世界数据)。
它们可能不是最大的,但与可用的硬件相比,它们并不重要(我不能简单地启动很多工作节点,或者做一个简单的环形...)。
我希望加入更新邮政地址上的两个表。就像是
select table1.id, table2.id
from table1, table2
where fuzzy_match([table1.street, table1.city, ...],
[table1.street, table1.city, ...]) > $MINIMUM_DISTANCE;
然后将匹配项table2.id作为参考存储在table1.
显然这只是伪代码。我正在寻找一种工具来做到这一点(要么是一些现有的解决方案,要么是在我们的应用程序中使用的库,或者暗示一种非天真的算法或数据结构来“DIY”它)。
我需要至少一次/最初对完整数据执行此操作,然后定期进行增量/更新。
这是技术背景:
- Linux 服务器
- 甲骨文关系型数据库
- 编程环境主要基于 Ruby,但如果开源,可以安装其他工具和语言。
我可以想到以下选项:
- Oracle Text 包含模糊搜索。但这不能用于此问题范围之外的非技术原因。
- Elasticsearch 有一个基于 Levenshtein 的模糊查询。我正在将我的数据纳入其中,并尝试将其用于健身和性能。
- 自己用 Ruby 或其他语言编写它,尽管从(几乎)第一原则来做这件事对我来说似乎不太吸引人——我希望这个问题已经在某个地方得到了解决。
- 在线解决方案或闭源非免费解决方案不适用,例如,我无法将任何数据上传到谷歌地图或任何类似的东西。
你对如何解决这个问题有任何提示吗?我很高兴有工具/库的建议,或者一些数据结构的建议,一种我可以自己研究/实现的算法。
我知道如何进行邮政地址模糊匹配?并且可能还会尝试以 https://github.com/openvenues/libpostal作为基础,但恐怕这主要用于个人(?)地址,所以我会遇到又出问题了……