1

Royal Mail PAF データに基づく郵便番号検索用のカスタム ビルド ソフトウェアに取り組んでいます。そのソフトウェアの主な目的は、Quick Address (サードパーティのソフトウェア ベンダー) を置き換えることです。

いくつかの質問を聞きたいんです

  1. インデックスを含む Quick Address データ ファイルが 500MB 未満であるのに、PAF の生データを見ると 2.50GB を超えているのはなぜですか。それを達成するために生データに対して実行したクリーンアップと圧縮の手法。インポートしたデータベースのサイズは 2.50GB (sqlite) です。無料/オープンソースのデータベースを使用する必要があり、有料のデータベースはここでは選択できません。

  2. 2800 万件のレコードがあります。「LIKE」ステートメントを使用して実行できることを考慮して、たとえば組織名または町による検索を改善するにはどうすればよいですか?

何か案が?

4

6 に答える 6

0

space-filling-curve または空間インデックスを試してみたい。sfc は、2 次元の複雑さを 1 次元の複雑さに減らします。郵便番号検索で似たようなことをしました。phpclasses.org (hilbert-curve) で sfc の私の php 実装を見たいと思います。Nick のヒルベルト曲線四分木空間インデックス ブログを探します。

都市名のルックアップでは、trie データ構造を探します。トライは辞書データ構造です。phpclasses.org (kart-trie) で、私の php での kart-trie 実装を見てみたいと思います。最悪の場合の複雑さは IMO log(n+k) です。n は文字列の長さ、k はキーの長さです。カート トライは基数トライやクリット ビット トライとは異なり、ノードごとに 2 つのリーフしかないため、カート トライをネストされたセットに変換する必要があります。PHP トライとワイルドカードhttp://phpir.com/tries-and-wildcardsを探します。

于 2011-05-06T10:09:40.403 に答える
0

私は Tom Gurney の見解に同意します... あなたはほとんどの利益のために多くの仕事をしている. さらに、常にデータを更新する責任を負っています-余分な作業です。

郵便番号検索を Web サイトまたは内部アプリケーションにプラグインしていると思いますか?

あなたのために仕事をするホストされたプロバイダーがいくつかあります.さらに、Royal Mailに直接行くよりもコストが低くなる可能性があります.さらに、物事が統合されたら、指を離す必要はほとんどありません...

私は PAF ソリューション プロバイダーの CraftyClicks で働いているので、ここに既得権益があります..... http://www.craftyclicks.co.uk/

于 2011-06-08T09:47:22.320 に答える
0

DPS、占有率、さまざまな会社のフラグなど、必要のない情報を保存しないでください

2800 万の住所を保持するのではなく、郵便番号ごとに 180 万の住所を保持し、各郵便番号 (家番号、家/建物の名前) ごとに破壊ポイントのリストを持つことができます。

お使いの PAF のバージョンが、キー付きのリレーショナル バージョンか拡張バージョンかわかりません。

キー付きバージョンでは、住所が地域、通り、番地などのルックアップ テーブルを指す数字で構成されている必要があるだけなので、ファイル サイズが小さくなります。ただし、住所にキーを使用しても、組織名や町名による検索には役立ちません。

ビューは、キーから出力アドレスをフォーマットするのに役立ちます。使用するデータベースにインデックスを使用できるビューがあることを確認してください。そうしないと、テーブルのスキャンが終了します。

私が過去に行ったことは、全文検索エンジン sphinx http://sphinxsearch.com/を使用して PAF の インデックスを作成することでした。これにより、インデックスを作成することを決定した任意の単語に対して非常に強力な検索 (部分的な単語とあいまい一致を含む) が可能になります。住所のすべての単語を試してください。sphinx からの結果は、SQL 結果セットを反復処理するために使用できるキーのリストです。SQL クエリは、ルックアップ テーブルから完全な住所を作成するために使用できるキーの住所テーブルに対して行うことができます。Sphinx インデックスの構築は非常に高速で、適度に小さいインデックス サイズを生成します。

このサイズのデータ​​ベースには、Mysql が sqlite よりも適している可能性があります。

その他の考慮事項。バッチ処理を行っているのか、それとも単なるトランザクション処理を行っているのか - バッチ処理用の sphinx は忘れてください。更新頻度。毎月更新しないと、非常に短期間で古くなってしまう可能性があります。

注: キー付きバージョンの PAF を使用している場合は、アドレスの書式設定に関するいくつかの恐ろしい規則と、文書化されていない多くの例外があります。

于 2011-05-09T12:45:04.010 に答える
0

ファイルサイズはあなたにとって問題ですか?ファイルサイズが重要な場合にのみ、圧縮について心配します.圧縮はほとんどなくなりました.2.5 GBはほとんどの状況で禁止されていません.

本当にデータを圧縮する必要がある場合は、ほぼ確実に既製のデータベース システムを使用できなくなります。Quick Address は ZIP などを使用してデータを圧縮していると思います。

2 番目の質問については、テーブルの例と、最適化するクエリの種類を教えてください。ほとんどの郵便番号ルックアップ システムでは、重要な唯一のクエリは、郵便番号で検索し、一致する住所を返すことです。レコードの数に関係なく、郵便番号列にインデックスを付けている限り、これは非常に高速です。

于 2011-05-06T09:55:24.643 に答える
0

郵便局の PAF の代わりに、192.com Web サイトを使用して住所を検索することもできます。

私はこの方法を過去数か月間うまく使用してきましたが、問題はありませんでした.

これが私のルックアップクラスです。

    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

これが他の誰かに役立つことを願っています。

リッチ。

于 2012-06-12T15:40:04.507 に答える