mroongaを使ってchikamap.comを作った地価マップ作成者です。
筆者は趣味でプログラムなどをしています。元々はWindowsをメインで使っていましたが、数年前からRubyが気になりMacへ乗り替えてRuby On Railsで色々個人的なサイトを作っています。
今回は、素人ながらgroonga、mroongaを使ってサイトを作った事例を紹介します。
chikamap.comとは
chikamap.comは中古住宅・土地購入の際に参考になる地価履歴やその周辺の公共施設・交通機関などの基本的な情報を地図から表示するというだけの簡単なサイトです。
サイトとしてはデータを表示するだけなので構築は比較的簡単な部類だと思いますが、「地図への地価履歴表示」と「その周辺の公共施設、交通機関を表示」部分について位置情報としてのデータベース検索が必要になります。
地図への地価履歴表示
検索の方法はデータベースに登録してある地価の位置情報を、Google マップで表示している地図の北西の緯度経度と南東の緯度経度から、四角いエリアとしてその内側にあるデータを絞り込んで表示します。
その周辺の公共施設、交通機関を表示
この地図に表示された地価のポイントをクリックすることで、指定の半径何kmの周辺施設、交通機関を検索し表示します。
データベース自体には上のような四角いエリア内のデータを検索するような機能は元々あったりしますが、ある位置から半径何kmのデータを検索するようなデータベースの機能は作成当時の自分では見つけることができませんでした。
しかし位置情報からのデータベース検索方法を色々探している内に、このククログの記事が目に留まりました。この記事ではgroongaを使って四角いエリア内、半径何km内のデータを検索する方法が記載されており、まさに自分の必要としている機能が簡単に実現できるものでした。
groongaを直接コマンドから実行しても良いのですがchikamap.comはRuby On Railsを使って作っているため、MySQL経由でgroongaが使えればデータの登録から検索までコードがすっきりするのではないかと思い今回初めてmroongaを使ってみました。
データベースへの位置情報データ登録について
地価の情報、周辺施設・交通機関のデータについては緯度経度としてデータを保存します。これにはMySQLのデータタイプとしてpoint
というspatialデータタイプを使うことになります。しかし素のRailsではmigrationでエラーが出るためactiverecord-mysql2spatial-adapter gemを使っています。これを使うとt.point
のようにmigrationが書けます。
データはRuby On Railsでいつもやるようにモデルを経由してsave
していけば良いので、groongaを使うための特別な変更は必要ありません。
四角いエリアのデータ検索
データを入れた後、地図に表示されている四角いエリアでのデータは次のように検索しています。
難しいことは抜きにして、北西と南東の緯度経度さえ分かればこれだけでそのエリア内のデータが抽出できとても簡単です。
半径何kmのデータ検索
四角いエリアは先述のように検索できるのですが、クリックした地価ポイントから半径何kmの円の内側にある施設等をSQLで実行する方法がよく分かりませんでした。そこで、groongaを外部コマンドとして実行し何とか動くようにしたいと考えました。
実際にはストレージモードの特徴を使い、多少無理矢理っぽいのですが、MySQLのデータディレクトリにできているgroongaファイルをRailsから次のように外部コマンドで実行しています。
色々やっていますが、要はククログの記事と全く同じです。mroongaで作ったgroongaのデータファイルを探すところが増えているぐらいで、後はJSONで返ってくる結果を分解して、テーブルのプライマリキーとなる値を_key
から集めていき、それをまとめてActiveRecordから再度検索しています。
まとめ
今回groongaで全文検索の機能は使っていませんが、Ruby On RailsでもMySQLとmroongaで全文検索をつかうことが簡単に実現できます。
一つ問題があるとすれば、mroongaをRuby On Railsで使い、かつMySQL5.5以降を使っている場合には、全文検索用のインデックスにparserの指定をインデックスのコメントとして記述する必要があることが挙げられます。
特にmigrationファイルではインデックスにコメントをつけることができず、エラーになるため、筆者は次のようなモンキーパッチでインデックスにコメントをつけられるように変更して使っています。
この変更は次のように使います。
全文検索をするときはMATCH AGAINSTを使います。
WindowsからMacに乗り替えて、Ruby On Railsにもまだまだついて行けないことが多いのですが、筆者でもgroongaを使うことで位置情報のエリア内検索をしたり、全文検索をしたりがいとも簡単にできてしまいます。
すこし前まではインストールはソースからなどと、筆者のような初心者にはとても敷居が高かったのですが、最近ではHomebrewがとても便利でgroonga、mroongaもコマンド一発でインストールできてしまいます(Windows、Linuxでもインストールは簡単です)。
全文検索はどうも難しそうだと思われていた方、筆者のような初心者でも簡単に導入することができるため、この機会にgroongaを一度インストールして体感してみてください。