「京都」が検索に出てこない — 3.4万都市のデータに潜んでいた、日本語だけの落とし穴

旅行アプリ「Daylight Trip」の都市検索で、「京都」が出てこないことに気づきました。「Kyoto」なら出る。「キョウト」でも出る。でも、漢字の「京都」では出ない。

日本人が地名を入力するとき、最初に打つのはまず漢字です。つまり実質「京都が収録されていない」のと同じでした。今日はこの修正(v1.2.1)を両ストアの審査に出したので、原因を書き残しておきます。

目次

原因: 「かなを含む名前を選ぶ」ルールの裏目

Daylight Trip は完全オフラインで動くために、GeoNames由来の約3.4万都市を内蔵しています。各都市にはたくさんの別名(各国語の表記)がぶら下がっていて、その中から日本語名を選ぶとき、私はこういうルールにしていました。

「かな(ひらがな・カタカナ)を含む、いちばん短い別名を採用する」

パリ→「パリ」、オスロ→「オスロ」。海外の都市では完璧に働きます。日本語の表記はカタカナですから。

ところが日本の都市では、このルールが読み仮名を拾ってしまう。京都の別名リストには「京都」「京都市」「キョウト」が並んでいて、「かなを含む」条件に合うのはキョウトだけ。結果、京都の日本語名は「キョウト」になり、漢字検索に一致しなくなっていました。大阪は「おおさかし」、奈良にいたっては日本語名なし。調べてみると、日本の都市192件が同じ状態でした。

海外都市のために作ったルールが、母国の都市でだけ壊れる。灯台下暗しとはこのことです。

第2の罠: 東京が「东京」になる

修正は「漢字を含むいちばん短い別名を選ぶ」に変えるだけ——と思ったら、もうひとつ罠がありました。

検証すると、東京が 「东京」 になっている。「东」は中国語の簡体字です。GeoNamesの別名リストには中国語表記も混ざっていて、「東京」と「东京」はどちらも2文字。文字コード順で簡体字が先に選ばれてしまったのです。

日本語では使わない簡体字(东・广・岛・泽など)の除外リストを作って解決しました。広島が「广岛」になる未来を、ぎりぎりで回避です。

教訓

  • 多言語データの「日本語名」選びは、カタカナ圏(海外)と漢字圏(国内)でルールが逆になる。ひとつのルールで両方を賄おうとすると片方が壊れる
  • 修正のテストには「東京が簡体字でないこと」まで入れました。データの罠は、直した形でテストに固定しておかないと再発します
  • そして、市クラスの地名はデータで、観光地や小さな駅は自由入力+履歴で。検索の守備範囲を「全部データで」ではなく二段構えにしたことが、今回の修正を小さく保ってくれました

v1.2.1 は現在審査中です。「京都に行こう」と思ったときに「京都」と打てば出てくる——当たり前のことが、ようやく当たり前になります。

アプリの詳細はこちら: Daylight Trip 紹介ページ


Daylight Trip は SINQWELL のアプリです(Android / iOS で公開中)。

目次