MySQL街道地址模糊搜索

时间:2011-05-14 17:30:05

标签: mysql sql full-text-search

有没有人知道在MySQL数据库上进行模糊街道地址搜索的好脚本(或好策略)?关键问题是:

  • 大写(简单 - 只需使用LCASE)
  • 标点符号(可以使用REPLACE;不确定它是否有更有效的选项)
  • 缩写(这是艰难的 - street = st等)

我希望能够匹配: 123 Main st,B单元= 123 Main Street Unit b

4 个答案:

答案 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)

除非你finding matches先行,否则做好standardize的工作是没有希望的。一旦您通过标准化软件传递地址,搜索就很简单,因为完全匹配就足够了。

答案 2 :(得分:0)

您可以使用Experian QAS的地址数据。它在每次点击许可证上。模糊搜索对数据很有效,并且收件人更准确。

答案 3 :(得分:-1)

你所描述的是迈克指出的地址标准化。我在这个领域为SmartyStreets工作(地址就是我们所做的)。

USPS有一些称为出版物28的指南,它描述了预期的地址格式。如果您打算根据该格式使用地址,那么在大多数情况下,请执行标准化字符串的精确字符串比较。

LiveAddress API做了这样的事情,但如果你已经有一个标准化的地址列表,你可以查看list processing service