ガイド

自由形式の住所欄を構造化された要素に分解する

1つの自由入力の住所欄は、集めるのは簡単でも、後から扱うのは大変です。市区町村で絞り込んだり地域ごとにまとめたりする必要が出てくると、なおさらです。ジオコーディングは、住所を座標に解決する際の副産物として、このパースを代わりに行ってくれます。

自由入力のテキストを送信する

GET /v1/forward?q=1600 Pennsylvania Avenue, Washington, DC 20500&limit=1
{
  "status": "ok",
  "query": "1600 Pennsylvania Avenue, Washington, DC 20500",
  "results": [
    {
      "formatted": "1600 Pennsylvania Avenue NW, Washington, DC 20500",
      "lat": 38.8977,
      "lon": -77.0365,
      "type": "address",
      "precision": "house",
      "confidence": 0.97,
      "place_id": "def456",
      "components": {"house_number": "1600", "street": "Pennsylvania Avenue NW", "city": "Washington", "region": "DC", "postcode": "20500", "country": "US"}
    }
  ]
}

構成要素を個別に保存する

componentsオブジェクトを受け取ったら、元の自由入力の文字列だけを保存するのではなく、各フィールドをそれぞれ独立したデータベースのカラムに書き込みます。これにより、顧客レコードを市区町村や地域で絞り込んだり、正確な地域別レポートを作成したり、郵便番号と市区町村が本当に対応しているかを検証したりできるようになります。いずれも、構造化されていない1つの文字列に対しては現実的ではありません。

2つ目の例:異なる書式の住所

住所の構造はどこでも同じというわけではありません。イギリスの住所では、米国式のregionの代わりにcountyが返ってくることがあり、名前の付いた建物ではhouse_numberのような構成要素がまったく含まれないこともあります。どの国でも同じ形式のリクエストを送れば動作しますが、実際に返ってくる構成要素のキーは異なる場合があります。そのため、どの国でも毎回まったく同じ項目が埋まると想定するのではなく、構成要素が欠けていても対応できるように保存用のスキーマを設計してください。

避けるべきよくある間違い

すべての結果にhouse_number、street、city、region、postcodeがすべて含まれるという前提をハードコードし、いずれかが欠けた住所をパースのエラーとして扱うことはしないでください。完全に有効な住所でも、特に番地の振られた都市部の街区以外では、一部のフィールドが空のまま正当に返ってくることがあります。構成要素がすべてそろうことを前提とした厳しい検証を組むと、エンドポイントが正しくパースした実際の顧客の入力を拒否してしまいます。

元のテキストも保存しておく

元の自由入力の内容は捨てずに、パースした構成要素と並べて保存してください。構成要素が不完全な状態で返ってきた場合や、後で顧客が何かを修正する必要がある場合に、元のテキストが手元にあれば、再パースや手作業での修正が簡単になります。

部分的なパースへの対応

すべての住所が、すべての構成要素が埋まった状態で解決されるわけではありません。地方の住所はhouse_numberなしで返ってくることがあり、小さな町は独立したregionの値なしで返ってくることがあります。欠けている構成要素のフィールドはパースの失敗ではなく正当な空の値として扱い、必要な構成要素がない場合は、表示にformattedの文字列を使ってください。

妥当な一致が複数ある場合の対応

limitを1より大きくすると、フリーテキストとの一致度が高い順に並んだ複数の候補結果が返されます。最上位の一致結果を黙って確定するのではなく、顧客に短い選択肢リストを見せたい場合に便利です。これは完全な自動解析と完全な手入力フォームの中間にあたる妥当な方法で、特に信頼度のしきい値では不確かと判定されてしまう住所に適しています。

コスト

この方法でフリーテキスト欄を解析するコストは住所1件につき1リクエストで、ほかのジオコーディングの検索と同じです。既存のフリーテキスト住所のテーブルを整理するバックフィルジョブでは、テーブル全体を一括リクエストとして処理でき、1行につき1リクエストになります。

フリーテキストを構造化されたフィールドに変換することは、住所をジオコーディングする際の自然な副産物であり、追加の手順ではありません。ジオコーディングのドキュメントに、このエンドポイントが返せるすべての要素が記載されています。