忍者ブログ
RoboCup Junior Japan Rescue Kanto OB

             2005~2013
[1]  [1134]  [1133]  [1132]  [1131]  [1130]  [1129]  [1128]  [1127
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

前回に引き続き、第5回の記事です。

今回はタイトルの通り、MisskeyにMeilisearchという検索エンジンを導入する話です。

Misskeyのインスタンスを建てた話。①(Misskey紹介編)
Misskeyのインスタンスを建てた話。②(GCPでの建ち上げ編)
Misskeyのインスタンスを建てた話。③(OCIでの建ち上げ編)
Misskeyのインスタンスを建てた話。④(Webhookで対話bot作成編)


Misskeyにはノート用の検索システムが標準で搭載されているのですが、

Misskeyの標準のノート検索は時間がかかる上に、サーバーに多大な負荷を与えてしまうことから、

デフォルトでロールによりノート検索は無効になっています。

なので、従来の中規模以上のインスタンスではノート検索の有効化は非常に覚悟のいる行為でした。


しかし13.12.0バージョンからMisskeyでは、

Meilisearchという外部の検索エンジンを利用することができるようになりました。

Meilisearchは逐次検索やタイプミス耐性、ファセット検索、ジオサーチ、マルチテナンシーなどが利用でき、

何より最近注目のRustで作成されており、動作が超高速ということでリリース早々にして有名になりました。
この手のやつは日本語があやふやなことが多いのですが、ちゃんと日本語の形態素解析(Lindera)に対応しています。



今回はMisskeyにMeilisearchを導入する手法について解説していこうと思います。

こちらのサイトを参考にしたのですが、この内容が投稿されたしばらく後、バージョン13.12.2において

仕様が変更されてしまっているので一部内容を書き換えたものを掲載します。


※MisskeyのMeilisearchはSQLからjsonファイルを書き出した後、その内容を受け取って全文探索をします。
 そのため、ディスクIOを非常に多く行うので、オンプレミスでMisskeyを建てている場合はその点にご留意ください。
 特にSSDを利用している場合は注意が必要ですね。モニタリングしてないとディスクがヤバスです。




まずはインストール。Meilisearchはサーバを建ててHTTPのリクエストを飛ばして利用する感じです。

つまり、Misskey本体サーバとサーバを分けて運用することが可能となっております。

ウチもそのうち分けようと思っていますが、リソースに余裕があるのでひとまず同一サーバで建ててみます。

下記のコマンドを順に実行します。
sudo apt install curl -y
curl -L https://install.meilisearch.com | sh
chmod +x meilisearch
sudo mv ./meilisearch /usr/local/bin/
sudo useradd -d /var/lib/meilisearch -b /bin/false -m -r meilisearch
curl https://raw.githubusercontent.com/meilisearch/meilisearch/latest/config.toml > ./meilisearch.toml
これでインストールが完了します。



次に./meilisearch.tomlファイルを編集します。下記の項目を編集します。
env = "production"
master_key ="16byte以上の任意の値"
db_path = "/var/lib/meilisearch/data"
dump_dir = "/var/lib/meilisearch/dumps"
snapshot_dir = "/var/lib/meilisearch/snapshots"
no_analytics = true
envをproductionにします。

master_keyは任意に設定する値です。MisskeyからAPI送信時のキーになるものです。

db_path、dump_dir、snapshot_dir をMeilisearchインストール時に作成されたフォルダ配下に設定します。


no_analyticsですが、Meilisearchはデフォルトでテレメトリデータを開発元に送信する機能があります。

テレメトリデータから個人や検索内容の特定等はできないようですが、

テレメトリデータが個人情報に当たるケース(カリフォルニア州消費者プライバシー法など)があるらしいので

各インスタンスの規約や、通信量的に好ましくない場合は、no_analyticsをtrueにすると、送信しなくなります。


次に、この編集データの反映作業です。tomlファイルの移動やディレクトリ作成ですね。
sudo cp ./meilisearch.toml /etc/meilisearch.toml
sudo mkdir /var/lib/meilisearch/data /var/lib/meilisearch/dumps /var/lib/meilisearch/snapshots
sudo chown -R meilisearch:meilisearch /var/lib/meilisearch
sudo chmod 750 /var/lib/meilisearch
難しいことは特にしていないので流しで。

次に下記の /etc/systemd/system/meilisearch.service ファイルを作成してsystemlctlから利用できるようにします。
[Unit]
Description=Meilisearch
After=systemd-user-sessions.service

[Service]
Type=simple
WorkingDirectory=/var/lib/meilisearch
ExecStart=/usr/local/bin/meilisearch --config-file-path /etc/meilisearch.toml
User=meilisearch
Group=meilisearch

[Install]
WantedBy=multi-user.target

終わったら下記コマンドでMeilisearchを有効にします。 
sudo systemctl daemon-reload
sudo systemctl enable --now meilisearch 



次に、Misskeyの過去のノートをMeilisearchから検索できるようにindexを貼ります。

この作業を行わないと、Meilisearch導入以前のノートが検索できなくなってしまいます。
cd /var/tmp/
sudo -u postgres psql -d DB名 -c "SELECT json_agg(row_to_json(t)) ::text  FROM (SELECT id, \"createdAt\", \"userId\", \"userHost\", \"channelId\",cw,text FROM note WHERE visibility IN ('home', 'public')LIMIT 200000) t" > /var/tmp/notes_tmp

sed -i '1d;2d;x;$d;' notes_tmp

jq 'map(.createdAt |= (strptime("%Y-%m-%dT%H:%M:%S%Z") | mktime | . * 1000 + (. / 1000000 | floor)))' notes_tmp > notes.json

curl -X POST 'http://localhost:7700/indexes/INDEX名/documents?primaryKey=id' --data-binary @notes.json -H 'Content-Type: application/json' -H "Authorization: Bearer MASTER_KEY"


DB名、LIMIT後の数値、INDEX名、MASTER_KEYの編集が必要です。

DB名はMisskeyのpostgresのDB名(デフォルトはmk1)に置換してください。

LIMITの数値は適当に200000にしていますが、現在の総ノート数を確認して記述する等にしてください。

INDEX名に利用するインデックスの名前を記述します。ここは一般に「インスタンスホスト名---note」になります。

バージョン13.12.2以降、MisskeyではMeilisearchの利用にindexが必要になりました。

後述するdefault.ymlで設定したindexの値に---noteがpostfixされた値がindexとなるので、

現在のmisskeyでは、ここでのinde貼りはこの形式に合わせる必要があります。

MASTER_KEYは先ほどご自身で設定されたmaster_keyになります。



最後にMisskey側でMeilisearchを使えるように、misskey/.config/default.yml の設定を行います。
meilisearch:
  host: localhost
  port: 7700
  apiKey: 'MASTER_KEY'
  index: 'インスタンスホスト名'
サーバーを分けるときはhostを別のマシンのものに変更しましょう。

MASTER_KEYとインスタンスホスト名は上のコマンドと同じです。

ここまで設定が完了したらsystemcltでMisskeyの再起動と、Meilisearchの起動を行います。
sudo systemctl start meilisearch
sudo systemctl restart misskirara.net
多分これで検索にMeilisearchが使えるようになっていると思います。

といっても、総ノート数が4桁~5桁前半ぐらいのインスタンスではあまり変化が見られないと思うので、

おひとり様インスタンスでは実感がないかもですね。個人的にはお一人様インスタンスでは不要だと思ってます。


再びになりますが、注意点として

・日本語も対応してるが、形態素解析結果によっては正しい検索結果を返さないことがある。
・Misskeyのノート検索はロールによってデフォルトで無効にされている。
・オンプレの場合はディスクIOに気を付ける。
・indexが必須になるアップデートがあったので、旧来の方法では動かない

13.12.2 以前からMeilisearchを利用している場合は、

こちらの手順を使ってindexを張り替えることで、古いノートも検索ができるようになります。


以上がMisskeyのノート検索でMeilisearchを利用する手順となります。

Misskeyは開発思想が先進的であるが故に、割と古い機能がすぐ廃止になったり変更になったりと、

モデレーションする側としてはなかなかに胃の痛いシステムです。

開発開始から10年以上建っているのに未だに安定しないのもちょっと困りものですね・・・


という訳で今回はここまでです。また何か書くべきことがあれば更新しようと思います~

(^・ω・)ノ RadiumProduction at curonet
Comments
※コメントは内容確認後に手動で公開するようにしております。反映までしばらくお待ちください。
Your Name
Title
color
Comment
 

カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
最新CM
[05/09 ONE RoboCuper]
[05/07 HDD ほしいよー]
[04/21 ブラック3辛]
[12/26 bols-blue]
[06/08 ONE RoboCuper]
かうんた
カウンター カウンター
らじぷろ目次
らじぷろ検索機
プロフィール
HN:
Luz
性別:
男性

PR

忍者ブログ 2007-2021,Powered by Radium-Luz-Lα+-Rescatar in RadiumProduction [PR]


Related Posts Plugin for WordPress, Blogger...