概要
- railsの検索で曖昧な語句を検索するためのモジュール (gem) です。
- 検索はsimstring_pure をつかっています。
ソース
使い方
インストール
gem 'simstring_searchable', github: 'junara/simstring_searchable'
bundle install
使用したいモデルに SimstringSearchable
を追加する
class YourModel < ActiveRecord
include SimstringSearchable
これで準備完了
検索
インデックス作成
最初にインデックスを作成する必要があります。インデックスの作成は、 create_simstring_index
methodでおこないます。
引数には、検索したい(インデックスを作成したい)カラム名を指定してください。
インデックス作成後、追加したデータでインデックスを更新したい場合も同じメソッドを実行してください。(更新のみをおこなうメソッドは用意していません)
作成された、インデックスは後述の remove_simstring_index
で破棄するまで有効です。
irb> YourModel.create_simstring_index(:name)
オプションとして 連続したn個の文字で分割するかを第2引数に渡して(整数)設定することができます。デフォルトは3です。
検索
検索は、 simstring_search_result
でおこないます。
第1引数に検索したいカラム。第2引数に 検索文字列
を入れてください。」
irb> YourModel.simstring_search_result(:name, '検索文字列')
オプションとして閾値(threshold (0から1。1が最もマッチしていることを示す))とデータ数(limit。上位いくつのデータを表示するか)を設定することができます。閾値のデフォルトは0.5、データ数のデフォルトは10です。
最もマッチしたデータのみ取得する場合は、 simstring_find_by
を使ってください。イメージとしては、railsのfind_byに似たかんじのメソッドです。
インデックスの破棄
作成されたインデックスは破棄するまで有効です。メモリを喰うので、使わなくなったら破棄してください。
irb> YourModel.remove_simstring_index(:name)
なお、まとめてインデックスを破棄できるメソッドはこちらです。
irb> YourModel.remove_whole_simstring_indexes
アドバンスド
インデックス作成の際に、ブロックを渡すことで文字列を加工する事ができます。
全角英数字を半角英数字に修正したいとうありましたらこちらを利用してください。
下記では、空白(全角 or 半角)を削除してインデックスを作成する例です。
irb> YourModel.create_simstring_index(:name, gram = 3) {|str| str.gsub(/( | )/, '')} # replace space by ''
その他
検索結果が空 [] or nil
の場合はthresholdの値を低く(たとえば 0.1) して検討してください。
また、 結果の順位が印象と合わない場合は、 gram
の値を変更すると良くなることがありますので調整してみてください。
以上。