有没有人知道在MySQL数据库上进行模糊街道地址搜索的好脚本(或好策略)?关键问题是:
我希望能够匹配: 123 Main st,B单元= 123 Main Street Unit b
答案 0 :(得分: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 - 单位或贴数(可选)
要在mysql中使用它,你需要删除所有注释(从'#'到eol),删除第一行(切换选项),并将所有内容折叠到一行,没有任何空格。
答案 1 :(得分:2)
答案 2 :(得分:0)
您可以使用Experian QAS的地址数据。它在每次点击许可证上。模糊搜索对数据很有效,并且收件人更准确。
答案 3 :(得分:-1)
你所描述的是迈克指出的地址标准化。我在这个领域为SmartyStreets工作(地址就是我们所做的)。
USPS有一些称为出版物28的指南,它描述了预期的地址格式。如果您打算根据该格式使用地址,那么在大多数情况下,请执行标准化字符串的精确字符串比较。
LiveAddress API做了这样的事情,但如果你已经有一个标准化的地址列表,你可以查看list processing service。