前回のエントリでSolr最新版とコアの作成まで行いました。
今回はインデックスの作成と、実際の位置検索を試してみたいと思います。
Schemaの設定
前回作成したコア「new_core」のスキーマ設定を行います。
スキーマについてはGUIから設定が行えるので、まずは「http://localhost:8983/solr/」にアクセスして管理画面を表示します
左側の「core selector」ドロップダウンから「new_core」を選択し、左下の「schema」から設定を行います。

今回は、以下の3つのフィールドを設定しました。
name | field type |
---|---|
spot_name | string |
spot_lonlat | location |
spot_lonlat_rpt | location_rpt |
ドキュメントを追加してみる
次にドキュメントを登録してみます
こちらもGUIから操作でいるので以下の操作で登録します
管理画面左メニューの「Documents」を選択し、ドキュメント登録画面を開く。
Request-Handler (qt)が/update、Document Typeがjsonになっていることを確認。
あとはテキストエリアに登録したいデータをjson形式で貼り付けて「Submit Document」ボタンを押せばドキュメントが登録されます。
今回は皇居の座標を登録してみます
{ "spot_name":"皇居" "spot_lonlat":"35.68522718327026, 139.75281855559894", "spot_lonlat_rpt":"35.68522718327026, 139.75281855559894" } 登録が完了すると、画面右側にリザルトが表示されます

クエリ画面から登録したドキュメントを確認することができます

データが皇居だけだと寂しいので、他のデータも登録します
{ "spot_name":"六本木ヒルズ" "spot_lonlat":"35.66033276799776, 139.7300920663161", "spot_lonlat_rpt":"35.66033276799776, 139.7300920663161" }, { "spot_name":"東京タワー" "spot_lonlat":"35.65904325721179, 139.74552781219253", "spot_lonlat_rpt":"35.65904325721179, 139.74552781219253" }, { "spot_name":"東京スカイツリー" "spot_lonlat":"35.710531307005695, 139.8145881641507", "spot_lonlat_rpt":"35.710531307005695, 139.8145881641507" }, { "spot_name":"浅草寺" "spot_lonlat":"35.714392041907836, 139.79623220947755", "spot_lonlat_rpt":"35.714392041907836, 139.79623220947755" }

ちなみに、各ランドマークの緯度経度はGooglemap上で右クリックで調べることができます

位置検索を試してみる
データの登録が終わったので、実際に位置検索を行ってみます。
試した感じだとGUIからは実行できないようなので、ブラウザに以下のURLを指定して実行します
http://localhost:8983/solr/new_core/select?indent=true&q=*:*&fq={!geofilt}&sfield=spot_lonlat&pt=35.68552452793649,%20139.7528424411283&d=10
URLにアクセスすると、以下のような結果が返っています

パラメータ詳細は公式マニュアルを参照していただくのが一番です。
ここではptパラメータに皇居の座標を、dパラメータに10を指定しているので「皇居から10Km以内のスポット」を検索しているということになります。
試しにdパラメータを少なくします

dパラメータを5(5Km内)に設定したところ、浅草寺とスカイツリーは結果から外れてしまいました。
皇居から浅草寺まで距離を測ってみると、5.14Km前後だったため、たしかに5Km内には含まれませんでした。
正しく検索できているようですね。

以上
Solrで位置検索をやってみたというお話でした。これを使えば、「今いる場所から一番近いコンビニ」みたいな検索もできるようになりますね。
location_rptについては、より高度な位置検索(複雑な範囲内に存在するスポットなど)を検索できるらしいです(未確認・・・)