プログラミングなんてわからないんですけど〜

元プログラマによるプライベートでのプログラミング日記。1/3のつもりだけどソフト関連はここがメイン

mastodonの全文検索インデックスの定期更新をしてみた

mastodon全文検索ですが、オリジナルのソースコードを使用している場合はインデックスの更新は適宜行われます。
ただし、私のように公開タイムラインのトゥートまで検索対象にしている場合は、ソースコードのかなり深いところまで手を入れないと更新されません。
なかなか難しいので、別のアプローチとして定期的にchewy:syncを実行するようにしてみました。

まずは、chewy:syncの実行にどれくらい時間がかかるかをはかるため、以下のようなシェルスクリプトを用意します。

#!/bin/sh
TIME_A=`date +%s`   #A
#処理時間を計測したい処理
/bin/bash -c 'cd /home/mastodon/live && RAILS_ENV=production /home/mastodon/.rbenv/shims/bundle exec rails chewy:parallel:sync[2,StatusesIndex]  >> 
~/log/chewy_sync.log 2>&1'

TIME_B=`date +%s`   #B
PT=`expr ${TIME_B} - ${TIME_A}`
H=`expr ${PT} / 3600`
PT=`expr ${PT} % 3600`
M=`expr ${PT} / 60`
S=`expr ${PT} % 60`
echo "${H}:${M}:${S}"

なお、/home/mastodon配下にlogフォルダを作成してそこにログを出力させるようにしています。
このシェルスクリプトは実行時間を標準出力に出すだけですので、これを「crontab -e」でcronでの自動実行をさせるようにします。

0 */3 * * * sh -x /home/mastodon/chewysync.sh 1>> /home/mastodon/log/chewy_exec.log 2>> /home/mastodon/log/chewy_error.log

なぜ3時間おきかというと、数回試した感じで私の環境では常に1時間前後かかることがわかったからです。
この設定で2日程度様子を見てみました。chewy_exec.logには、だいたい以下のような出力がされていました。

1:2:12
1:1:34
1:2:25
1:0:28
0:1:19
0:54:28
0:55:40
0:58:22
0:55:30
0:55:38

1時間以内に終わりそうですが、1時間を超えることもあるので90分おきに実行するシェルスクリプトを組んでみました。

# 90分ごとにコマンドを実行
DATE=`date "+%Y.%m.%d  %H:%M:%S"`
DATE_SEC=`date +%s`    # 現在のエポック秒(1970.1.1 0:00:00からの経過時間)
DATE_MIN=`expr $DATE_SEC / 60`    # エポック秒を分に変換

if [ `expr $DATE_MIN % 90` -eq 0 ];
then
    echo $DATE >> ~/log/hoge.log
    sh -x /home/mastodon/chewysync.sh 1>> /home/mastodon/log/chewy_exec.log 2>> /home/mastodon/log/chewy_error.log
    # ここに実行したいコマンド
else
    echo "nonAction.$DATE... $DATE_MIN:$DATE_SEC" >> ~/log/hoge.log
fi

hoge.logに出力しているのはコピペの残りですw。
これを、先ほどの3時間ごとの設定と以下のように置き換えます。

*/30  *  *  *  * /home/mastodon/run90.sh

こうすることで、90分ごとに全文検索インデックスが最新化されるようになりました。
なお、CPUのコア数などにより更新の時間がかなり違う場合があります。まずは、最初のスクリプトで通常の使用に負担がかからない範囲で更新ができるか試してみてください。

github.com

qiita.com

ama-ch.hatenablog.com