2011-10-31 66 views
6

我有一個數據庫表充滿了谷歌地圖地址解析響應的地址。谷歌縮寫所有方向(西 - > W,東 - > E等)。模糊街道地址搜索使用MySQL全文(或sphinx?)

因此,如果我輸入地址如「100 West Pender Street」,則Google地圖返回的格式地址爲「100 W Pender St」,我將其插入到我的表格中。

現在,如果一個用戶走來,並搜索該地址,以下所有條件應符合:

彭德街 西彭得街 100彭德 100瓦特彭德 100西彭德

,他們或多或少地做。表中的「w」會被忽略,因爲它低於最小字長。搜索結果中給予東潘納的地址的權重相等(「E」也被忽略)。

處理這個問題的最佳方法是什麼?

我懷疑設置最小字長度爲1是一件「壞事」。

我可以在谷歌地址中搜索並替換已知的縮寫(N,E,S,W,St,Ave,Dr等),並用它們的擴展替換它們 - 但有一些街道名稱如果這是無效的(一些城市有單字母街道名稱:J街等...)

也像「123 160聖」的地址根本無法搜索,因爲街道號碼(123)和街道名稱( 160)都低於最小字長。

MySQL FullText是正確的方法嗎? 獅身人面像提供更好的東西嗎?

或者還有其他解決方案我還沒有考慮過嗎?請記住,用戶的搜索查詢不僅會與該媒體資源的地址相匹配,還會與其他文本列(如媒體資源名稱和說明)進行匹配。

+0

您可以用'ft_min_word_length'減少mysql的全文最小字長度,但將其降低到2或1會增加「噪音」結果的數量。另外,請小心縮略語。在我的城市裏有一個「西方新月」,因爲那是一個人的名字,而不是一個方向。 –

+0

爲什麼不用方向(N,E,W,S)創建一個新字段,然後用** field ='S'**進行搜索,或者如果倍數搜索使用字段IN('S','N') –

+0

Marc - 我很擔心噪聲,特別是如果我必須將它設置爲1來捕獲N,E,S,W大衛 - 從地理編碼器返回的地址沒有方向作爲單獨的字段我將不得不將它從全文字段中解析出來,這對於實際上被命名爲「N」或「E」的街道來說可能是有問題的。 – emh

回答

0

這實際上是一個難以置信的難題 - 如果你是自己的。我在一家名爲SmartyStreets的公司工作在地址驗證行業,我們的產品執行您描述的任務。這是一個複雜的操作序列,它將地址搜索與有效的,甚至可交付的端點進行匹配。準確,正確,完整地進行地址查詢的認證被稱爲CASS認證。

Google的結果與CASS認證結果之間的差異在於Google的算法是「最佳猜測」。這就是Google擅長的......不幸的是,這也適用於不完全有效的地址。 (請參閱:http://answers.smartystreets.com/questions/269/why-did-the-address-fail-validation-it-looks-good-to-me

使用MySQL進行模糊查找將產生結果,並且您的代碼可以提供算法來幫助,但不能保證準確性或有效性,或者在這種情況下,即使是任何值。

我不認爲你會希望你的用戶得到錯誤的地址作爲回報他們的查詢。它使你的服務看起來低於標準,用戶不會得到他們期望的價值(對嗎?)...我建議你找到一個CASS軟件供應商。例如,您可以Google「驗證地址」 - 我可以推薦的最好的基於Web的解決方案是SmartyStreets'LiveAddress API