/lexical_search

ActiveRecord用のGoogle風簡易検索

Primary LanguageRubyMIT LicenseMIT

Google風かんたん検索(AR用)

簡単な使い方

モデルに以下を書いて

scope :search, proc { |q| where(LexicalSearch::ArelBuilder.new(self, q).run) }

検索

AR.search("a") # => #<ActiveRecord::Relation [#<User id: 1, name: "alice">]>

構文

構文意味備考SQL
aa を含む文字列カラムが対象
-aa を含まない
‘a b’‘a b’ を含む“aa bb” にマッチ
a ba と b を含むa AND b と同等
a or ba または b を含む
( )優先度の確定普通の式と同じ
x==1x カラムが 1x = 1
x!=1x カラムが 1 ではないx != 1 AND x IS NOT NULL
x=@yx カラムに y を含むx LIKE ‘%y%’
x!@yx カラムに y を含まないx NOT LIKE ‘%y%’ AND x IS NOT NULL
x>=1x カラムが 1 以上x >= 1
x<=1x カラムが 1 以下x <= 1
x<1x カラムが 1 未満x < 1
x>1x カラムが 1 より大きいx > 1

特殊検索(secureオプションがfalseのとき有効)

構文・演算子意味備考
blank:xx カラムが空空は NULL または空文字列
present:xx カラムが空ではない

AND OR () の関係

クエリ意味
(a OR b) (c OR d)aまたはb かつ cまたはd を含む
a b OR c daとb または cとd を含む
(a b) OR (c d)aとb または cとd を含む
a (b OR c) da b c を含む または a c d を含む
a (b OR c) d -ea b c を含む または a c d を含む が e は含まない

できないこと

-(a OR B) のような書き方はできないので (-a AND -b) のように書換える

コントローラーに書いとくといいもの

rescue_from LexicalSearch::SyntaxError do |exception|
  flash.now[:error] = I18n.t("lexical_search.syntax_error")
  render :nothing => true, :layout => true
end

TODO & 自分メモ

  • q=<word> で単語検索対応
  • joinが入ったときの例も追加
  • 文字ではなく文字の種類も持つべき?
  • require “active_support/all” の時点で node.rb や builder.rb が読み込まれるためファイル名を変更している。
  • 1.9系だとそうならない。1.9に移行したら arel_builder.rb → builder.rb に変更する。