php - 编辑搜索

标签 php mysql levenshtein-distance

我在一个销售东西 并提供“供应商搜索”的网站上工作。在此搜索中,您输入您的城市、邮政编码或地区和距离(以公里或英里为单位),然后网站会为您提供供应商列表。

为此,我有一个供应商数据库。在保存这些供应商的表单中,您输入他们的完整地址,当您点击保存按钮时,系统会向谷歌地图发出请求以获取他们的经纬度。

当有人进行搜索时,我会查看存储所有搜索词及其纬度/经度的表格。 这张 table 看起来像

+--------+-------+------+
| term   | lat   | lng  |
+--------+-------+------+

所以第一个查询非常简单

select lat, lng from my_search_table where term = "the term"

如果找到结果,我会使用一种很好的方法搜索访问者想要的范围内的所有供应商,并将结果打印在 map 上。

如果我找不到结果,我会使用 levenshtein 函数进行搜索,因为人们用 bruxelle 或 bruxeles 而不是 bruxelles 是很常见的,我不想一直请求谷歌地图(我也在我的表格中有一个“搜索了多少次”列来获取一些统计信息)

所以我请求不带 where 子句的 my_search_time 并遍历所有结果以获得最小的 levensthein 距离。如果最小的结果大于 2,我会从谷歌地图请求坐标。

这是我的问题。对于某些国家(我们在世界各地有多个站点),my_search_table 有 15-20k+ 个条目......而 php 不(真的)喜欢循环此类数据(我完全理解)并且我的请求属于 php 超时.我可以增加此超时,但问题将在几个月后出现。

所以我尝试了一个 levensthein MySQL 函数(在 stackoverflow 顺便说一句)但是它也很慢。

所以我的问题是“即使在非常大的数据集上,是否有任何方法可以加快搜索速度?”

最佳答案

我的建议基于三件事:

  • 首先,您的数据集很大。这意味着 - 它:足够大拒绝“全选”+“在 PHP 应用程序中运行 levenshtein()”的想法
  • 其次,您可以控制您的数据库。所以你可以调整一些架构相关的东西
  • 最后,SELECT 查询的性能是最重要的,而添加新数据的性能无关紧要

问题是您不能执行快速 levenshtein 搜索,因为levenshtein 本身 非常慢。我的意思是,计算编辑距离是一件很慢的事情。因此,您将无法仅通过“智能搜索”来解决问题。您必须准备一些数据。

可能的解决方案是:创建一些组索引并在添加/更新 数据期间分配它。这意味着 - 你将存储额外的列来存储一些散列(例如数字)。添加新数据时,您将:

  • 使用 levenshtein 距离执行搜索(因为您可以使用您的应用程序或您已经(已经提到过)针对插入的数据对表中的所有记录使用的功能
  • 将新行的组索引设置为在上一步中找到的行具有的索引值。
  • 如果没有找到,设置一些新的组索引值(它是第一行并且还没有类似的行)——这将不同于表中已经存在的任何组索引值

要搜索所需的行,您只需选择具有相同组索引值的行。这意味着:您的选择 查询将非常快。但是 - 是的,这会在添加/更改数据时造成巨大的开销。因此,它不适用于更新/插入性能很重要的情况。

关于php - 编辑搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15172716/

相关文章:

lucene - 如何配置Solr以使用Levenshtein近似字符串匹配?

php - 这是wordpress病毒吗?

php - 迭代数组/ HashMap

php - 使用PHP循环多次查询MYSQL数据库

mysql - 如何正确地将索引应用到我的 mysql 数据库

php - 非常简单的 MySQL 语法错误,我是新手

algorithm - 是否有适用于一系列花车的编辑距离版本?

python - 仅通过插入和删除来查找编辑距离的变化?

php - 如何配置 Phabricator 来加密外发电子邮件?

php - 使用mysql从三个不同的表中呈现php中的数据