住所を与えると郵便番号のデータを返すgemを作った。jipcode-address_locator / GitHub
こんな形で使う:
require 'jipcode'
require 'jipcode/address_locator'
Jipcode.locate_by_address('東京都千代田区千代田1-1', prefecture_code: true, distance: true)
# [
# {:zipcode=>"1008111", :prefecture=>"東京都", :city=>"千代田区", :town=>"千代田1−1", :prefecture_code=>13, :distance=>1.0},
# {:zipcode=>"1000001", :prefecture=>"東京都", :city=>"千代田区", :town=>"千代田", :prefecture_code=>13, :distance=>0.9538461538461538},
# {:zipcode=>"1000000", :prefecture=>"東京都", :city=>"千代田区", :town=>nil, :prefecture_code=>13, :distance=>0.9076923076923077}
# ]
郵便番号から郵便地域を取得する jipcode という非常に頻繁にメンテナンスされている素晴らしいgemがあり、このgemを拡張する形で実装した。参考記事: 郵便番号から住所を取得できるgemを作りました - Qiita
逆引きの挙動は住所→郵便番号の取得を行うWeb API、Zipcodaに近くなるように調整した。検索語句と郵便地域のどちらかがどちらかを含んでいるデータを全て洗い出し、その後Jaro Winkler距離を計算し、近いもの順にソートして返す。
毎回該当する都道府県のデータを全部チェックするので遅い。またjipcodeのデータを都道府県別にインデックスしたファイルを作成するので、初回はより時間がかかる。ハイフンや数字は全角で渡さないとヒットしない。 (ちょっとだけ正規化するようにした。v0.1.0)
変な挙動してたら issue/プルリクください