とあるRailsアプリで全文検索が必要になったため、PGroongaを試してみました。
環境はそれぞれこんな感じ。(表示は一部省略)
% cat /etc/lsb-release
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"
% sudo aptitude show postgresql
パッケージ: postgresql
バージョン: 9.5+173
% sudo aptitude show postgresql-9.5-pgroonga
パッケージ: postgresql-9.5-pgroonga
バージョン: 1.1.5-2~xenial1
まず、参考にしたのはこのページです。
Ruby on RailsでPostgreSQLとPGroongaを使って日本語全文検索を実現する方法 – ククログ(2015-11-09)
この記事ではRuby on Railsで作ったアプリケーションからPGroongaを使って日本語全文検索
機能を実現する方法を説明します。
そして、使ったそれぞれの関数のリファレンスはこちら。
- pgroonga.highlight_html関数 | PGroonga
検索に使ったキーワードをハイライトするため - pgroonga.query_extract_keywords関数 | PGroonga
指定したキーワードを他の関数に利用するため - pgroonga.score関数 | PGroonga
指定したキーワードとのマッチ度を使うため
実際のコードはこんな感じです。
PostgreSQLにエクステンションを追加するマイグレーション
PGroongaを使わせるためのインデックスを追加するマイグレーション
カラムがこうなっている理由はこちらです。
pgroonga.score関数を使うには、pgroongaインデックスにプライマリーキーに指定したカラムを追加する必要があります。もし、プライマリーキーに指定したカラムをpgroongaインデ>ックスに追加していない場合は、pgroonga.score関数は常に0.0を返します。
全文検索をしているクラス
titleとbodyを検索対象にしています。
実際に使用するとこうなります。
> article = Article.full_text_search('桃太郎', true).first
> article.highlighted_body
=> むかしむかしあるところで<span class="keyword">桃太郎</span>という少年が鬼ヶ島に行って鬼を退治しました。
全文検索そのものと、キーワードのハイライトについてはよかったのですが、pgroonga.score関数でとれるスコアを使ったソートで問題が・・・(つづく)
ヒント: インデックス