RailsでMySQL・PostgreSQL・SQLite3とGroongaを使って日本語全文検索を実現する方法MySQL・PostgreSQL・SQLite3の標準機能では日本語テキストの全文検索に難があります。追加するMroonga・PGroongaというプラグインがあります。詳細は以下を参照してください。RailsでPostgreSQLとPGroongaを使って日本語全文検索を実現する方法ここではMroonga・PGroongaを使わずに日本語全文検索を実現する方法を紹介します。それはGroongaを使う方法です。GroongaはMroonga・PGroongaのバックエンドで使われている全文検索エンジンです。Groongaを直接使うメリットは以下の通りです。MySQL・PostgreSQLのオーバーヘッドがない分Mroonga・PGroongaよりもさらに速い1つのSQLでは表現できないような検索を1クエリーで実現できる(のでさらに速い)一方、デメリットは以下の通りです。Mroonga・PGroongaに比べて学習コストが増える(Mroonga・PGroongaはSELECTのWHEREでの条件の書き方を学習するくらいでよいが、Groongaはインデックスの設計やクエリーの書き方について学習する必要がある)MySQL・PostgreSQLだけでなくGroongaサーバーも管理する必要があるので運用コストが増えるこのデメリットのうち学習コストの方をできるだけ抑えつつGroongaを使えるようにするためのライブラリーがあります。それがgroonga-client-railsです。groonga-client-railsがGroongaを使う部分の多くをフォローしてくれるため利用者は学習コストを抑えたままGroongaを使って高速な日本語全文検索システムを実現できます。実現する方法を説明します。実際にドキュメント検索システムを開発する手順を示すことで説明します。7を用いますが、他の環境でも同様の手順で実現できます。この記事ではMySQL・PostgreSQLではなくSQLite3を使っていますが、アプリケーションのコードは変更せずにMySQL・PostgreSQLでも動くので気にしないでください。@KitaitiMakotoさんが書いたgroonga-client-railsの使い方を紹介した記事もあるのでそちらもあわせて参照してください。違った視点で紹介しているので理解が深まるはずです。Railsでの検索機能にgroonga-client-railsを使う(前編)Railsでの検索機能にgroonga-client-railsを使う(後編)GroongaのインストールまずGroongaをインストールします。7以外の場合にどうすればよいかはGroongaのインストールドキュメントを参照してください。2.3をインストールします。Railsをインストールします。持ったドキュメント検索システムを開発します。newで雛形を作ります。document_searchデータベースを作成します。db:create検索対象のドキュメントを格納するテーブルを作成します。db:migrateここまでは(Groongaのインストール以外は)Groongaと関係ない手順です。ここからはGroongaを使う場合に特有の手順になります。gemをインストールします。installそれではアプリケーション側に全文検索機能を実装します。サーチャーというオブジェクトを定義します。これはGroongaでいい感じに全文検索するための機能を提供するオブジェクトです。サーチャー用のディレクトリーを作成します。app/searchersapp/searchers/application_searcher.rbにApplicationSearcherを作成します。(ジェネレーターはまだ実装されていません。Groonga::Client::SearcherendDocumentモデル用のサーチャーDocumentsSearcherをapp/searchers/documents_searcher.rbに作成します。}endモデルのカラムとサーチャーのインデックスを対応付けるコードをモデルに追加します。:contentendこの対応付けをGroongaのサーバーに反映します。groonga:sync動作を確認するためにQiitaから検索対象のドキュメントを取得するRakeタスクを作ります。endend実行して検索対象のドキュメントを作成します。data:load:qiitahttp://localhost:3000/documentsにアクセスし、データが入っていることを確認します。ビューにヒット件数表示機能と検索フォームをつけてコントローラーで全文検索するようにします。検索フォームではqueryというパラメーターに検索クエリーを指定することにします。@documentsを@result_setに変更している理由はあとでわかります。端的に言うとヒットしたドキュメントだけでなくさらに情報も持っているので@result_set(結果セット)にしています。「ヒット数」(@result_set.n_hits)も持っています。COUNT(*)を実行しないといけませんが、Groongaでは1回の検索で検索結果もヒット数も両方取得できるので効率的です。record.source}でアクセスできます。そのため、モデルが必要な処理(たとえばURLの生成)もこれまで通りの方法で使えます。/documents/1この状態で次のようにレコード数とフォームが表示されるようになります。