Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

mroongaで論理積・論理和の検索条件を扱う(Boolean mode編)

mroongaで論理積・論理和の検索条件を扱う - Bye Bye Mooreではmroonga_commandを使う方法を採用しました。
今回はMySQL全文検索方式に倣ってBoolean modeによる論理積を実装してみます。

当該modelの末尾あたりに

  scope :search_with, ->(name) { where(%Q(match(name) against("#{name.split(' ').map {|a| %Q(+#{a}) }.join(' ')}"  in boolean mode))) }                     

と追加するだけです。

これをrails cで確認すると...

>> Professor.search_with 'alpha beta'
  Professor Load (16.6ms)  SELECT `professors`.* FROM `professors` WHERE (match(name) against("+alpha +beta" in boolean mode))
=> #<ActiveRecord::Relation [#<Professor id: 254, name: "beta alpha", ... , updated_at: "2014-05-19 05:23:59">]>

のように半角スペースで区切ったフレーズをAND検索しています。

注意

このままだと全角スペースを区切り文字と認識しない等々、
若干ユーザーアンフレンドリーな部分があります。
必要に応じてsedして下さい。