Ruby,RailsからSQLiteの正規表現検索(REGEXP)を使う。

かなーり探したつもりなのだけれど方法が見つからず。はやく公式実装されないかなぁ・・・
とりあえずRubyREGEXP関数を作って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 ?", "東京.*(東|西|南|北)"]

とか。

パフォーマンス

  • 初代MacBook1.8GHz
  • Rails 1.2.2
  • sqlite3-ruby 1.2.1
  • SQLite 3.3.7
  • AjaxScaffoldGenerator 3.1.11

という環境で、日本郵政公社から取ってきた全国の郵便番号辞書(約12万件)に対して、

@conditions = ["regexp(?, address)", "東京.*(東|西|南|北)"]

をという検索をしてみた結果、

  • 初回ページ(25件)表示:10秒
  • 最後ページ表示:15秒

といった感じです。
まぁ12万件のデータに対して、

  • Rubyで実質1行の差し込み
  • SQLiteというお手軽環境

で得られるものとしては結構いいかなぁ。ちょっとしたデモやプロトタイプを作るくらいなら役に立ちそうだ。