Amazon Location Serviceでサジェスト検索ができるようになりました

2022.01.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

Amazon Location Serviceではジオコーディングの機能があります。
入力のテキストがパートナーが提供するデータに近ければ近いほど良いのですが、パートナーデータから外れている場合は検索結果が意図したものにならない場合があります。

先月、サジェスト検索機能が追加されました。
この機能を使うと、地名などのテキストを元にパートナーデータに存在するデータを提案してくれます。
この提案データを使って検索を行うことでより位置情報の取得角度が高まることが期待されます。

使い方

まず、通常のジオコーディング(search-place-index-for-text)で「札幌市」とだけで検索すると1件しか取得されません。

[cloudshell-user@ip-10-0-128-168 ~]$ aws location search-place-index-for-text --index-name iwasa.esri --text 札幌市 --max-result 10 | jq '.Results[].Place.Label' -r
北海道札幌市

座標の前段階として、もう少し曖昧な検索結果候補を期待したいシーンは多いと思います。
そういった場合はジオコーディング前にまずサジェスト検索機能(search-place-index-for-suggestions)を使うことが出来ます。

[cloudshell-user@ip-10-0-128-168 ~]$ aws location search-place-index-for-suggestions --index-name iwasa.esri --text 札幌市 --max-result 10 | jq '.Results[].Text' -r
北海道札幌市
北海道札幌市中央区札幌市円山動物園
北海道札幌市中央区札幌市教育文化会館
北海道札幌市中央区札幌市民ギャラリー
北海道札幌市中央区札幌市立大
北海道札幌市中央区札幌市資料館
北海道札幌市南区札幌市立大
北海道札幌市南区札幌市立大学
北海道札幌市南区札幌市立高等専門学校
北海道札幌市南区札幌市高等専門学

このように検索テキストの候補を取得することが可能です。
デフォルトで5件取得することが出来て、max-resultパラメータで最大15件まで取得することが出来ます。

ちなみに、この取得データには座標情報は含まれず、テキストのみが取得されるので、候補を地図上へポイントしたい場合などはここからジオコーディングが必要です。

[cloudshell-user@ip-10-0-128-168 ~]$ aws location search-place-index-for-suggestions --index-name iwasa.esri --text 札幌 --max-result 10
{
    "Results": [
        {
            "Text": "北海道札幌市"
        },
        {
            "Text": "北海道札幌市東区札幌"
        },
        {
            "Text": "北海道札幌市白石区札幌"
        },
        {
            "Text": "北海道札幌市豊平区札幌"
        },
        {
            "Text": "埼玉県児玉郡美里町札幌"
        }
    ],
    "Summary": {
        "DataSource": "Esri",
        "MaxResults": 10,
        "Text": "札幌"
    }
}

検索オプション

いくつか検索オプションを組み合わせることで、サジェスト結果をコントロール出来ます。
ここでは、「美術館」というキーワードでサジェスト検索するシーンを想定します。

標準状態で検索してみると以下のようになります。

[cloudshell-user@ip-10-0-128-168 ~]$ aws location search-place-index-for-suggestions --index-name iwasa.esri --text 美術館 --max-result 15 | jq '.Results[].Text' -r
東京都小平市美術館・図書館
茨城県鹿嶋市美術館
福島県郡山市美術館通りクリニック
香川県高松市美術館北通り診療所
群馬県館林市美術館入口
台中市西區吉龍里五權西四街美術館綠園道, 403
大阪府大阪市天王寺区美術館下ゲート
山梨県甲府市美術館前
茨城県北茨城市美術館入口
高雄市鼓山區龍水里美術南二路250號美術館牙醫診所, 804
福島県福島市美術館図書館前駅
千葉県茂原市美術館郷土資料館専用
高雄市鼓山區龍水里美明路38號美術館dc大樓, 804
高雄市鼓山區龍子里美術館路, 804
高雄市鼓山區龍水里美術館路, 804

国を絞る

標準の検索結果には台中市や高雄市など台湾の都市が含まれています。
日本国内をターゲットとしたアプリケーションの場合だとこれらの検索結果は不要な場合があります。

そういった際にはfilter-countriesオプションでISO3166の3文字の国コードを指定することでフィルタリングすることが出来ます。
国コードは一度の検索で最大100カ国まで指定可能です。

[cloudshell-user@ip-10-0-128-168 ~]$ aws location search-place-index-for-suggestions --index-name iwasa.esri --text 美術館 --filter-countries JPN --max-result 15 | jq '.Results[].Text' -r
東京都小平市美術館・図書館
茨城県鹿嶋市美術館
福島県郡山市美術館通りクリニック
香川県高松市美術館北通り診療所
群馬県館林市美術館入口
大阪府大阪市天王寺区美術館下ゲート
山梨県甲府市美術館前
茨城県北茨城市美術館入口
福島県福島市美術館図書館前駅
千葉県茂原市美術館郷土資料館専用

検索結果が日本のみとなりましたね。
逆に先程の結果から日本を省く場合は以下となります。

[cloudshell-user@ip-10-0-128-168 ~]$ aws location search-place-index-for-suggestions --index-name iwasa.esri --text 美術館 --filter-countries TWN --max-result 15 | jq '.Results[].Text' -r
台中市西區吉龍里五權西四街美術館綠園道, 403
高雄市鼓山區龍水里美術南二路250號美術館牙醫診所, 804
高雄市鼓山區龍水里美明路38號美術館dc大樓, 804
高雄市鼓山區龍子里美術館路, 804
高雄市鼓山區龍水里美術館路, 804

特定位置を基準にする

群馬県館林市内で美術館を検索する場合は、館林市美術館が優先候補にあがってほしいところだと思います。
そういった際はbias-positionを使うことが出来ます。

ここでは、館林駅の座標(36.322, 139.012)を指定してみました。

[cloudshell-user@ip-10-0-27-121 ~]$ aws location search-place-index-for-suggestions --index-name iwasa.esri --text 美術館 --bias-position [139.527,36.246] --max-result 5 | jq '.Results[].Text' -r
群馬県館林市美術館入口
東京都小平市美術館・図書館
茨城県鹿嶋市美術館
福島県郡山市美術館通りクリニック
香川県高松市美術館北通り診療所

「群馬県館林市美術館入口」が最初に表示されるようになりましたね。
今回Esriのみ試しましたが、「高崎駅」を指定した場合は東京都が上位に来たのでどの程度のこのパラメーターが期待に近い挙動となるかは事前に評価したほうが良さそうです。

特定座標内でフィルタリング

最後に、2点の座標からなるボックスを指定することで検索結果のフィルタリングが可能です。
例えば、東京近郊の検索結果のみサジェストして欲しい場合などです。

[cloudshell-user@ip-10-0-128-168 ~]$ aws location search-place-index-for-suggestions --index-name iwasa.esri --text 美術館 --filter-b-box [139.28,35.49,140.07,36.00] --max-result 15 | jq '.Results[].Text' -r
東京都小平市美術館・図書館

東京都の美術館のみ取得することが出来ました。

注意点として、指定する場合は南西の角と北東の角を指定する必要があります。
座標の順序が不正(北西と南東を指定した)な場合は以下のエラーメッセージが表示されました。

[cloudshell-user@ip-10-0-128-168 ~]$ aws location search-place-index-for-suggestions --index-name iwasa.esri --text 美術館 --filter-b-box [139.68,37.729,139.87,35.649] --max-result 15 | jq '.Results[].Text' -r

An error occurred (ValidationException) when calling the SearchPlaceIndexForSuggestions operation: 'FilterBBox' must have more southwesterly point before more northeasterly point

さいごに

本日はAmazon Location Serviceのサジェスト検索機能を試してみました。

ジオコーディング機能のみだと期待した結果を取得できないシーンが多いと感じていたので、本機能で曖昧なテキストを前段階として検索できるのはとても良いですね。ユーザー体験が向上する重要な機能だと思います。

オプションについて、複数の国に跨って利用するアプリでない限りはfilter-countriesはほぼデフォルトで使っても良さそうですね。
また、アプリケーションで位置情報の検索を行う多くのケースでは現在位置など何かしらのコンテキストとなる位置情報が存在することが多いので、bias-positionも多様することになりそうな気がします。

一方、filter-b-boxについては使い方によっては全く検索結果が得られなくなってしまうので慎重に使ったほうが良いかなという所感です。