2011-05-14 110 views
5

有誰知道一個好的腳本(或好策略)在MySQL數據庫上進行模糊的街道地址搜索嗎?主要問題是:MySQL街道地址模糊搜索

  • 資本(容易 - 只需使用LCASE)
  • 標點符號(可以用更換;不知道它有更快捷的購)
  • 縮寫(這是艱難的一個 - 街道= ST等)

我希望能夠匹配: 解放路123號,單元b = 123大街單元b

+0

請參閱:http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html否則,請看http://sphinxsearch.com/ – 2011-05-14 17:34:30

回答

3

雖然它並不完美,可以說是相當緩慢的,你」我希望通過REGEXP()使用正則表達式。

這裏的第一通正則表達式匹配大多數情況下(以及你的例子):

(?isx)     # search across multiple lines and ignore case 
(      # full match 
    (      # st number - what about number words like one or two? 
    \d+ 
) 
    \s+      # whitespace 
    (      # street name (one or more words) 
    [a-z]+ 
    (?: 
     \s+ 
     [a-z]+ 
    )* 
) 
    \s+      # whitespace 
    (      # street type 
    al(?:y\.?|ley)   # aly, aly. or alley 
    | 
    ave(?:\.|nue)?   # ave, ave., or avenue 
    | 
    b(?lvd\.?|oulevard)  # blvd, blvd. or boulevard 
    | 
    c(?:t\.?|ourt)   # ct, ct. or court 
    | 
    cir(?:\c\.?|cle)?  # cir, circ, circ. or circle 
    | 
    cres(?:\.|cent)?  # cres, cres. or crescent 
    | 
    dr(?:\.|ive)?   # dr, dr. or drive 
    | 
    exp(?:y\.?|ressway)  # expy, expy. or expressway 
    | 
    f(?:wy\.?|reeway)  # fwy, fwy. or freeway 
    | 
    g(?:rdns\.?|ardens)  # grdns, grdns. or gardens 
    | 
    h(?:wy\.?|ighway)  # hwy, hwy. or highway 
    | 
    l(?n\.?|ane)   # ln, ln. or land 
    | 
    m(?:nr\.?|anor)   # mnr, mnr. or manor 
    | 
    m(?:trwy\.?|otorway) # mtrwy, wtrwy. or motorway 
    | 
    pl(?:\.|ace)?   # pl, pl. or place 
    | 
    r(?:d\.?|oad)   # rd, rd. or road 
    | 
    st(?:\.|reet)?   # st, st. or street 
    | 
    t(?:pk\.?|urnpike)  # tpk, tpk. or turnpike 
    | 
    ter(?:\r?\.?|race)  # ter, ter., terr, terr. or terrace 
    | 
    tr(?:l.\?|ail)   # trl, trl. or trail 
    | 
    pike|park|walk|loop|bay|close|gate|highlands 
    | 
    row|way|oval|dell|rise|vale|byway|lawn 
) 
    \,?      # optional comma 
    \s+      # whitespace 
    (      # optional number, unit, apt or floor 
    (
     \#     # number 
    | 
     unit     # unit 
    | 
     num(?:\.|ber)   # num, num. or number 
    | 
     ap(?:t\.?|artment) # apt, apt. or apartment 
    | 
     fl(?:\.|oor)?   # fl, fl. or floor 
    ) 
    \s+ 
    \d+ 
)? 
) 

將返回:

$第1 - 全場比賽

$ 2 - 門牌號

$ 3 - 街道名稱

$ 4 - 街道類型

$ 5 - 單位或apt號(可選)

在MySQL中使用它,你需要去掉所有的註釋(從「#」到EOL),刪除第一線(開關選項) ,並將所有內容全部摺疊爲一行而不用任何空格。

2

做好finding matches是沒有希望的,除非你先用standardize。一旦你通過標準化軟件傳遞你的地址,搜索是微不足道的,因爲完全匹配就足夠了。

-1

正如Mike所指出的那樣,您所描述的是地址標準化。我在SmartyStreets的這個領域工作(地址就是我們所做的)。

美國郵政總局有一些指導稱爲出版物28,其中描述了預期的地址格式。如果您打算全部使用這些地址,則需要根據該格式進行標準化,並且在大多數情況下,請執行標準化字符串的精確字符串比較。

LiveAddress API做了這樣的事情,但如果你已經有一個地址列表標準化,你可以看看list processing service

0

您可以使用益百利QAS的地址數據。它的每次點擊許可證。模糊搜索對數據很好,收件人更準確。