Ruby,RailsからSQLiteの正規表現検索(REGEXP)を使う。
かなーり探したつもりなのだけれど方法が見つからず。はやく公式実装されないかなぁ・・・
とりあえずRubyでREGEXP関数を作ってRailsで使うの巻。ちょー遅いけど動くのでOK。
準備
ApplicationControllerにREGEXP機能を差し込むコードを書く。
class ApplicationController < ActionController::Base session :session_key => '_hogehoge_session_id' #REGEXP演算子(regexp()関数)の実装を差し込み db = ActiveRecord::Base.connection.instance_variable_get(:@connection) db.create_function( "regexp", 2 ) do |func, pattern, value | func.result = value.to_s =~ /#{pattern.to_s}/ end end
以上。・・・こんな短いコードに辿り着くまでに3時間も掛かるわたしっていったい。
func.resultがnilなら失敗、それ以外なら成功、となるらしい。
使い方
普通に条件式でREGEXP演算子が使える。Railsのfindで「address列に対して、東京の地名で方角が入っているもの」を探すとすると、
@conditions = ["regexp(?, address)", "東京.*(東|西|南|北)"]
とか
@conditions = ["address REGEXP ?", "東京.*(東|西|南|北)"]
とか。
パフォーマンス
という環境で、日本郵政公社から取ってきた全国の郵便番号辞書(約12万件)に対して、
@conditions = ["regexp(?, address)", "東京.*(東|西|南|北)"]
をという検索をしてみた結果、
- 初回ページ(25件)表示:10秒
- 最後ページ表示:15秒
といった感じです。
まぁ12万件のデータに対して、
で得られるものとしては結構いいかなぁ。ちょっとしたデモやプロトタイプを作るくらいなら役に立ちそうだ。