読者です 読者をやめる 読者になる 読者になる

Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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して下さい。