這可能非常複雜,雖然我確信它們存在,但我並沒有親自意識到任何優秀的第三方庫。不過,其他人可能會提出一些罐裝解決方案。
我在過去幾次從頭開始寫過類似的東西。如果你沿着這條路線走下去,這可能不是你想用PHP自己做的事情,因爲每個查詢都會涉及獲取所有記錄並對它們執行計算。它幾乎肯定會涉及創建一組符合您的規格的索引表。例如,你必須想出規則來描述你如何想象「密爾沃基」最終會拼寫成「milwakee」。我的解決方案是做元音壓縮和重複壓縮(不確定這些實際上是否是搜索項)。因此,雄鹿將被收錄爲:
當搜索查詢進來的「密爾沃基」,我會跑在文字輸入相同的過程,然後在索引表上運行搜索:
SELECT cityId,
COUNT(*)
FROM myCityIndexTable
WHERE term IN ('milwaukee', 'm_lw__k__', 'm_lw_k_')
當搜索查詢輸入「milwakee」時,我w烏爾德運行上的文字輸入相同的過程,然後索引表上運行一個搜索:
SELECT cityId,
COUNT(*)
FROM myCityIndexTable
WHERE term IN ('milwaukee', 'm_lw_k__', 'm_lw_k_')
在密爾沃基(正確拼寫)的情況下,它會返回「3」爲計數。
對於Milwakee(拼寫錯誤),它會返回「2」的計數(因爲它不會匹配m_lw__k__
模式,因爲它只有一個元音在中間)。
如果您根據計數對結果進行排序,您最終會遇到您的規則之一,那麼「密爾沃基」最終會被排序爲比「Milwakee」可能的匹配更高。
如果您想以通用方式構建此係統(如在查詢中使用$table
暗示的那樣),那麼您可能需要另一個映射表以將映射表映射到適當的表。
我並不是說這是最好的(甚至是一個很好的)的方式來進行此事,只是我已經在過去做了,如果你打算嘗試做這沒有可能被證明對你有用第三方解決方案。
您的解決方案看起來不錯。您的原始查詢顯示了LIKE所做的一個誤解。這是一種(原始)模式匹配,而不是一種類似的功能。像「密爾沃基」將只匹配「密爾沃基」。如「West%」將匹配「West Bend」。 – Lucky 2009-08-05 22:26:59