这可能非常复杂,尽管我确信它们存在,但我个人并不知道有任何好的 3rd 方库。不过,其他人可能会提出一些罐头解决方案。
我过去几次从头开始写过类似的东西。如果您沿着这条路线走,那么您可能不想在 PHP 中单独执行此操作,因为每个查询都涉及获取所有记录并对其执行计算。它几乎肯定会涉及创建一组满足您的规范的索引表。
例如,您必须想出如何想象“密尔沃基”最终拼写为“密尔沃基”的规则。我对此的解决方案是进行元音压缩和重复压缩(不确定这些是否真的是搜索词)。因此,密尔沃基将被索引为:
当搜索查询输入“milwaukee”时,我将对文本输入运行相同的过程,然后在索引表上运行搜索:
SELECT cityId,
COUNT(*)
FROM myCityIndexTable
WHERE term IN ('milwaukee', 'm_lw__k__', 'm_lw_k_')
当搜索查询进入“milwakee”时,我将对文本输入运行相同的过程,然后在索引表上运行搜索:
SELECT cityId,
COUNT(*)
FROM myCityIndexTable
WHERE term IN ('milwaukee', 'm_lw_k__', 'm_lw_k_')
在 Milwaukee(拼写正确)的情况下,它将返回“3”作为计数。
在 Milwakee(拼写错误)的情况下,它将返回“2”作为计数(因为它与m_lw__k__
模式不匹配,因为它只有一个元音在中间)。
如果您根据计数对结果进行排序,您最终会满足您的一条规则,即“密尔沃基”最终将作为可能的匹配项排序高于“密尔沃基”。
如果您想以通用方式构建此系统(正如您$table
在查询中使用的暗示的那样),那么您可能需要在其中的某个地方使用另一个映射表来将您的术语映射到适当的表。
我并不是说这是最好的(甚至是好的)方法,只是我过去做过的事情,如果你打算在没有第三方解决方案的情况下尝试这样做,可能会对你有用。