我在一个网站上工作,该网站销售让我们说的东西并提供“供应商搜索”。在此搜索中,您输入您的城市、邮政编码、地区和距离(以公里或英里为单位),然后该网站会为您提供供应商列表。
为此,我有一个供应商数据库。在保存这些供应商的表格中,您输入他们的完整地址,当您单击保存按钮时,会向谷歌地图发出请求以获取他们的纬度和经度。
当有人进行搜索时,我会查看存储所有搜索词及其 lat/lng 的表格。这张桌子看起来像
+--------+-------+------+
| term | lat | lng |
+--------+-------+------+
所以第一个查询很简单
select lat, lng from my_search_table where term = "the term"
如果我找到结果,然后我会用一种很好的方法搜索访问者想要的范围内的所有供应商,并将结果打印在地图上。
如果我没有找到结果,我会使用 levenshtein 函数进行搜索,因为人们写 bruxelle 或 bruxeles 而不是 bruxelles 很常见,我不想一直请求谷歌地图(我也有一个“在我的表中搜索了多少次”列以获取一些统计信息)
所以我请求没有 where 子句的 my_search_time 并遍历所有结果以获得最小的 levensthein 距离。如果最小的结果大于 2,我从谷歌地图请求坐标。
这是我的问题。对于某些国家/地区(我们在世界各地有多个站点),my_search_table 有 15-20k+ 个条目......并且 php(真的)不喜欢循环使用这些数据(我完全理解)并且我的请求属于 php 超时. 我可以增加这个超时时间,但几个月后问题会一样。
所以我尝试了一个 levensthein MySQL 函数(在stackoverflow上找到),但它也很慢。
所以我的问题是“即使在非常大的数据集上,有没有办法让这个搜索快速?”