PGroongaを使ったMastodon全文検索機能

またブログ立てました。今度はHexoです。書く準備に1日くらいかかりました。全然慣れません。ダメです。

Mastodonのデフォルトの全文検索はえらい棒を使ってますが、導入するのがめんどくさそうだし、えらい棒本体の更新がめんどくさそうな感じらしいので、代わりにPGroonga使って検索してみたいとおもいます。

まぁ記事ができてるってことは “おもいます” じゃなくて “おもいました” なんですけど、気にしたら負けです。
あと、えらい棒に関する情報は基本的に適当です。ちゃんと調べてません。悪意はありません。ごめんなさい。

Hexoの準備ですでにへとへとだったりします。へとへとだから許してください。

ソースコード

accelforce/odakyudoncustom/pgroongaにあります。
不定期でtootsuite:masterをマージしてます。

あと板橋丼用に、本家Mastodonのリリースバージョンごとにrebaseしてるバージョンがあります。
こっちも僕がメンテナンスしてますが、もっと不定期更新です(板橋丼の更新次第)。あとrebaseなのでマージには向かないと思います。ソースコード的には見やすいですけどね。

お好きなほうをどうぞ。

導入方法

ソースコードやデータベースの保守に関して、自分は一切の責任を負いません。データベースに変更を加えたことによりいかなる問題が生じたとしても自己責任で対処してください。
ソースコードの改変も自己責任で行ってください。改変の方法についてアドバイスが必要であれば連絡してくだされば極力対処しますが、すべてを代行することはありません。
もし特殊な支援が必要であれば可能な限り別途対応します(応相談)。

PGroongaをインストールしなきゃいけないので、若干面倒です。逆にインストールさえしてしまえば終わりです。

1. PGroongaのインストール

基本的にPGroongaのドキュメント参考にしてください。
一応ちょっとだけ説明します

1-a. Ubuntu 18.04 + PostgreSQL 10

aptでインストールします。

1
2
sudo add-apt-repository ppa:groonga/ppa
sudo apt install postgresql-10-pgroonga

1-b. Ubuntu 18.04 + PostgreSQL 11

パッケージが配布されてません。頑張ってビルドします。ちょっと面倒です。

1
2
3
4
5
6
7
wget https://packages.groonga.org/source/pgroonga/pgroonga-2.1.8.tar.gz
tar xvf pgroonga-2.1.8.tar.gz
cd pgroonga-2.1.8
sudo add-apt-repository -y ppa:groonga/ppa
sudo apt install groonga libgroonga-dev libmsgpack-dev postgresql-server-dev-11
make HAVE_MSGPACK=1
sudo make install

多分これで大丈夫です。なにかミスあったら教えてください。

2. 拡張機能の有効化

データベースでPGroongaを有効にするのにデータベースのスーパーユーザー権限が必要です。
Railsでデータベースにアクセスする際のユーザーにスーパーユーザー権限が付与されていない場合、ここで先に拡張機能を有効化する必要があります。
Mastodonの公式ドキュメント通りにサーバーを構築しているのであれば恐らくこの手順が必要です。
もしスーパーユーザー権限があるか不明な場合はここを飛ばしても問題ありません。次の項でエラーが発生したらこの手順を実行してください。

1
2
3
4
sudo su - postgres
psql -d mastodon_production # Mastodonのデータベースを指定してください
CREATE EXTENSION pgroonga IF NOT EXISTS;
\q

3. インデックスの作成

PGroongaのインデックスを作成します。前の項で拡張機能の追加をしていなければここで自動的に追加されます。
この手順には十分なストレージの余裕と少しの時間が必要です。
インスタンスのトゥート数によりますが、小田急donでは 8031616件のトゥート に対して 2.5GB 程度でした。
運用するのにつれて増加していくので、ストレージに注意して運用してください。

1
2
3
sudo su - mastodon
cd live
RAILS_ENV=production bundle exec rails db:migrate

もしここでエラーが出た場合は拡張機能が追加できていません。前の項を参考にしてください。

処理が完了したら成功です。Mastodonを再起動すると全文検索が有効になっているはずです。

使ってみたり

本家の検索機能と異なり、自分のトゥートや自分がリアクションしたトゥートだけではなく、すべての公開投稿が検索できます(理由は後述しますが…)。

スクショとりやすい検索ワード探すの大変ですね。あ、魔女兵器面白いですよ。

検索時間は、アルファベット文字列で2秒くらい、日本語が入ると5秒から10秒かかるイメージです。
悪い速度じゃないと思いますよ多分。

(やっと)中身のおはなし

検索部分

(当然っちゃ当然だけど)ここの変更が一番大きいです。というかこれとマイグレーションだけです。

app/services/search_service.rb#36-39link
1
2
3
4
results = Status.where(visibility: :public)
.where("statuses.text &@~ ?", @query)
.limit(@limit)
.order("statuses.id DESC")

PGroonga専用の演算子 &@~ で検索します。OR検索とかもできる演算子です。
statuses テーブルをそのまま使っているので、本家のElasticSearchにあった searchable_by カラムが作れません。作る努力をしていません。もし作るなら別のテーブルに作らなきゃいけないのかな。RDBはよくわかりません。だれか改良してください。まあこのままでいいんですけど。
なので全公開投稿が検索できるようになってます。なんだよサボりじゃねーか、とか言わないでください。ここまで実験と調整するのに結構時間使ってます。

ダッシュボード

これですね。ここだけコミットが分離してます。忘れてたんですね、わかります。

app/controllers/admin/dashboard_controller.rb#16link
1
@search_enabled        = true
app/serializers/initial_state_serializer.rb#16link
1
search_enabled: true,

清々しいまでのハードコーディングです。そもそもこの改造を取り込んでいる時点で全文検索が有効なのは必然なのでいいよね。

おしまい。

おしまいです。
暇な人いたら使ってみてください。
odakyu.appに登録するとすぐに使えます。下手なことしない限りアカウント消したりしないのでどんどん登録してください。
ではでは。

Author: kyori19
Link: https://b.accelf.net/mastodon/20190524-mastodon-full-text-search-using-pgroonga/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.