有谁知道在MySQL数据库上做模糊街道地址搜索的好脚本(或好策略)?关键问题是
我想能够匹配:123大街,B单位=123大街b单位
虽然它并不完美,而且可能相当缓慢,但你会希望通过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美元--街道类型
要在mysql中使用这个,你需要把所有的注释(从'#'到eol)剥离出来,删除第一行(切换选项),并将所有内容折叠成没有任何空格的单行。
你可以使用地址数据从Experian QAS.它的每点击许可证。模糊搜索在数据上很好用,地址更准确。
你所描述的是地址标准化,正如迈克所指出的。我在这个领域的工作 SmartyStreets (地址是我们的工作)。
美国邮政总局有一定的指导原则,叫做Public 28,它描述了地址的预期格式。如果您打算使用这些地址,您需要根据该格式进行标准化,并且在大多数情况下,对标准化的字符串进行精确的字符串比较。
SmartyStreets' 地址验证API 有这样的功能,但如果你已经有了一个地址列表来标准化,你可以考虑用一个 列表处理服务.