2011-05-06 28 views
1

我正在为基于皇家邮政PAF数据的邮政编码查询定制生成软件。该软件的主要用途是取代快速地址(第三方软件供应商)。建立基于皇家邮政PAF原始数据的邮政编码地址查询

我有几个问题

  1. 如何来快速地址的数据文件,包括指标均在500MB,而如果你看一下PAF原始数据,它结束了2.50GB。他们对原始数据执行了哪些清理和压缩技术来实现这一目标。我导入的Db大小是2.50GB(sqlite)。我必须使用一些免费/开源的Db,付费Db不是我的选择。

  2. 有2800万条记录。例如,如果考虑到可以使用“LIKE”语句执行搜索,我怎样才能改进组织名称或城镇的搜索?

任何想法?

+0

出于兴趣,PAF现在是免费的吗? – 2011-05-06 10:29:03

回答

0

不要存储你不需要如DPS,占用和各种公司标志

信息

而不是2800万点持有的地址,你可以持有1.8米地址为每个邮政编码和有devivery点的列表每个邮政编码(即门牌号码,房屋/建筑物名称)

我不确定您拥有哪个版本的PAF,即带有按键或扩展版本的关系版本。

键控版本将减少文件大小,因为您只需要将地址组成的数字指向地点,街道,街道端等查找表。但在地址中使用键将无助于按组织或城镇名称进行搜索。

视图将有助于从键格式化输出地址。确保您使用的数据库具有可以使用索引的视图,否则您将最终进行表扫描。

我过去所做的是使用全文搜索引擎sphinx http://sphinxsearch.com/为PAF编制索引,它可以为您决定索引的任何单词提供非常强大的搜索(包括部分单词&模糊匹配)。尝试地址中的所有单词。 sphinx的结果是你可以用来遍历sql结果集的键列表。 sql查询可以针对可用于从查找表构建完整地址的密钥地址表。 狮身人面像索引构建非常快,并产生可重复使用的小索引大小。

对于这种大小的数据库,Mysql可能比sqlite更适合。

要考虑的其他事情。 你在做批量处理还是只是交易 - 忘记狮身人面像进行批处理。 更新频率。如果你不每月更新,你会在很短的时间内变得希望过时。

注意:如果您拥有PAF的键控版本,则有一些格式化地址的可怕规则以及许多无证的例外情况。

+0

嗨DGD,很好解释。我一定会将此标记为我的答案。我是PAF的密钥版本,它刚刚在本月抵达(2011年5月)。当遇到任何搜索时,我都陷入了困境。 Infact用户可以输入任意组合,例如组织+城镇或街道名称+城镇或门户号码+街道+城镇和其他组合。搜索位在不同的键控表中。我怎样才能完成使用所有这些关键表的搜索。抱歉,我目前对狮身人面像不熟悉。我现在将详细研究它。我会及时通知你。 – Leo 2011-05-10 15:13:53

0

文件大小是你的问题吗?如果文件大小很重要,我只会担心压缩 - 它几乎从不再做,2.5 GB在大多数情况下不会受到限制。

如果您确实需要压缩数据,您几乎肯定无法使用现成的数据库系统;我猜快速地址使用类似ZIP的东西来压缩数据。

至于第二个问题 - 你能举一个你的表的例子,以及你想优化的查询类型吗?在大多数邮政编码查询系统中,唯一重要的查询是通过邮政编码搜索并返回匹配的地址;无论您拥有多少条记录,只要您已对邮政编码列编制索引,这应该非常快。

0

你想尝试一个空间填充曲线或空间索引。 sfc将复杂度降低到1d复杂度。我已经做了类似的邮编搜索。你想在phpclasses.org(hilbert-curve)上看看我的php实现sfc。你想寻找尼克的希尔伯特曲线四叉树空间索引博客。

对于cityname查找,您想查找trie数据结构。一个trie是一个字典数据结构。你想在phpclasses.org(kart-trie)中查看我的kart-trie实现。最差的情况是IMO log(n + k),其中n是字符串长度,k是密钥长度。你想要把卡丁格转换为嵌套集,因为卡丁格树不同于基数树或暴击位树,这样每个节点只有2个树叶。你想寻找php trie和通配符http://phpir.com/tries-and-wildcards

0

我第二次汤姆·格尼的观点是......你正在为很少的好处做很多工作。另外,您正在承担更新数据的责任 - 额外的工作。

我假设您将邮政编码查询插入网站或内部应用程序?

有几个托管提供商为你做的工作,再加上你的成本可能比直接去英国皇家邮政LOWER,再加上你几乎不用动一根手指一旦事情被整合....

我为PAF解决方案提供商CraftyClicks工作,因此在这里有一些既得利益..... http://www.craftyclicks.co.uk/

0

除了来自邮局的PAF,您还可以使用192.com网站查找地址。

我在过去的几个月里一直使用这种方法,并没有任何问题。

这是我的Lookup类。

Imports System.Net 
    Imports System.IO 

    Public Class PCLookup 
Property Addresses As List(Of Address) 

Public Sub New(Postcode As String) 
    GetAddresses(CreatDoc(Postcode)) 
End Sub 

Private Function CreatDoc(PostCode As String) As mshtml.HTMLDocument 
    Dim URL As String = FormatPostcode(PostCode) 
    If URL = "" Then Return New mshtml.HTMLDocument 
    Dim request As HttpWebRequest = WebRequest.Create(URL) 
    Dim response As HttpWebResponse = request.GetResponse() 
    Dim reader As StreamReader = New StreamReader(response.GetResponseStream()) 
    Dim doc As New mshtml.HTMLDocument 
    Dim objDoc As mshtml.IHTMLDocument2 = doc 
    Dim param As Object() = {reader.ReadToEnd()} 
    objDoc.write(param) 
    response.Close() 
    reader.Close() 
    Return objDoc 
End Function 

Private Function FormatPostcode(Postcode As String) As String 
    Dim FullURL As String = "http://www.192.com/places/" 
    Do Until Postcode.Contains(" ") = False 
     Postcode = Replace(Postcode, " ", "") 
    Loop 
    If Len(Postcode) > 7 Or Len(Postcode) < 5 Then 
     Return "" 
    End If 
    If Len(Postcode) = 5 Then 
     FullURL &= Mid(Postcode, 1, 1) & "/" 
     FullURL &= Mid(Postcode, 1, 2) & "-" & Mid(Postcode, 3, 1) & "/" 
     FullURL &= Mid(Postcode, 1, 2) & "-" & Mid(Postcode, 3) & "/" 
    End If 
    If Len(Postcode) = 6 Then 
     If IsNumeric(Mid(Postcode, 2, 1)) Then 
      FullURL &= Mid(Postcode, 1, 1) & "/" 
      FullURL &= Mid(Postcode, 1, 3) & "-" & Mid(Postcode, 4, 1) & "/" 
      FullURL &= Mid(Postcode, 1, 3) & "-" & Mid(Postcode, 4) & "/" 
     Else 
      FullURL &= Mid(Postcode, 1, 2) & "/" 
      FullURL &= Mid(Postcode, 1, 3) & "-" & Mid(Postcode, 4, 1) & "/" 
      FullURL &= Mid(Postcode, 1, 3) & "-" & Mid(Postcode, 4) & "/" 
     End If 
    End If 
    If Len(Postcode) = 7 Then 
     FullURL &= Mid(Postcode, 1, 2) & "/" 
     FullURL &= Mid(Postcode, 1, 4) & "-" & Mid(Postcode, 5, 1) & "/" 
     FullURL &= Mid(Postcode, 1, 4) & "-" & Mid(Postcode, 5) & "/" 
    End If 
    Return FullURL 
End Function 

Private Sub GetAddresses(ObjDoc As mshtml.HTMLDocument) 

    Dim Obj As mshtml.IHTMLElementCollection = ObjDoc.getElementsByTagName("td") 
    Addresses = New List(Of Address) 
    For Each TD As mshtml.HTMLTableCell In Obj 
     If TD.className = "address" Then 
      Dim FullAddress As String = TD.innerText 
      Addresses.Add(New Address(FullAddress)) 
     End If 
    Next 

End Sub 

    End Class 

和地址类

Public Class Address 
Property Line1 As String 
Property Line2 As String 
Property Line3 As String 
Property Line4 As String 
Property Postcode As String 
Public Sub New(FullAddress As String) 
    Dim Obj As Object = Split(FullAddress, ", ") 
    Select Case UBound(Obj) 
     Case 4 
      Line1 = Obj(0) & " " & Obj(1) 
      Line2 = "" 
      Line3 = Obj(2) 
      Line4 = Obj(3) 
      Postcode = Obj(4) 
     Case 5 
      Line1 = Obj(0) & " " & Obj(1) 
      Line2 = Obj(2) 
      Line3 = Obj(3) 
      Line4 = Obj(4) 
      Postcode = Obj(5) 
     Case 6 
      Line1 = Obj(0) & " " & Obj(1) 
      Line2 = Obj(2) & " " & Obj(3) 
      Line3 = Obj(4) 
      Line4 = Obj(5) 
      Postcode = Obj(6) 
    End Select 

End Sub 
    End Class 

我希望这是利用别人。

丰富。