0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RailsでSimStringを使う

Posted at

概要

  • railsの検索で曖昧な語句を検索するためのモジュール (gem) です。
  • 検索はsimstring_pure をつかっています。

ソース

使い方

インストール

gem 'simstring_searchable', github: 'junara/simstring_searchable'
bundle install

使用したいモデルに SimstringSearchable を追加する

your_model.rb
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 の値を変更すると良くなることがありますので調整してみてください。

以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?