Mastodon3.2.1にElasticsearch+sudachiを導入

Overview

2018年秋口にMastodonサーバの運用を始めて、それから数回Elasticsearchを導入してはやめたり、PGroongaを導入して検索にこっちを使うようにしてみたりとか色々やってましたが。

DBサーバのリソース使用状況を見てた感じ、今の環境ならサーバ代増やさずにElasticsearch導入できそうだなーと思い再び導入しました。

参考

https://blog.noellabo.jp/entry/2019/04/19/YNUL9UsohRgNKSya

https://github.com/noellabo/mastodon/

https://kurage.cc/blog-sudachi/

https://github.com/yi0713/mastodon/

ありがとうありがとう…………。

環境

  • Mastodon v3.2.1
  • Elasticsearch v7.8.1

mastodon 3.3.0でも今回改造してるファイルはコンフリクト無かった気がするので多分そのまんま使えるんじゃ無いかなー。

  • Linode RAM2GB, vCPU 1core
    • Mastodon本体, リバースプロキシ(Caddy v2)
  • Linode RAM2GB, vCPU 1core
    • PostgreSQL, Redis, Elasticsearch

OSは両方Ubuntu 20.04 LTSです。

DB鯖とApp鯖の通信はLinodeのプライベートネットワークを使っています。

ufwやElasticsearchのListen IPなど、その辺りは適宜読み替えてください。

作業概要

  • Elasticsearchを建ててそのプラグインsudachiを入れる
  • sudachiを使って検索させるため、Mastodon本体のコード改変
  • Mastodonの設定書き換え
  • ./bin/tootctl search deploy

1. ES建ててsudachiを入れる

今回は上段の環境説明に書いたDBサーバの側にESを入れます。

基本的にはElasticsearchの公式ドキュメント通りに、aptリポジトリを追加してインストールという形です。

https://www.elastic.co/guide/en/elasticsearch/reference/current/deb.html

一点注意が必要なのが、今回はElasticsearchで最初から使える日本語検索用のプラグインkuromojiではなく、サードパーティのsudachiというプラグインを使います。

kuromojiを使う場合はElasticsearchのバージョンはあまり気にせずプラグインを入れられますが、sudachiの場合はsudachi自体が対応しているバージョンのESを指定する必要があります。

https://github.com/WorksApplications/elasticsearch-sudachi/releases

この記事を書いている2020年12月12日現在、sudachiが対応している最新のElasticsearchは7.8.1なのでこれを指定してインストールします。

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list
sudo apt update
sudo apt install elasticsearch=7.8.1
sudo apt-mark hold elasticsearch

ESのバージョンが勝手に上がらないようにholdしておきます。

一先ず指定のESは入ったので、次はsudachiをインストール

wget https://github.com/WorksApplications/elasticsearch-sudachi/releases/download/v7.8.1-2.0.3/analysis-sudachi-7.8.1-2.0.3.zip
wget https://object-storage.tyo2.conoha.io/v1/nc_2520839e1f9641b08211a5c85243124a/sudachi/sudachi-dictionary-latest-full.zip
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-sudachi-7.8.1-2.0.3.zip
unzip sudachi-dictionary-latest-full.zip
sudo cp sudachi-dictionary-20200722/system_full.dic /etc/elasticsearch

とりあえず入りました。インストールの確認は適当にsystemctl statusとかcurl localhost:9200とかで確認。

次はファイアウォールとかElasticsearchのListen IPなんかの設定です。

DB鯖がApp鯖と通信するときのIPアドレスでのみListenするようにして、そのアドレスだけポートを開けるようにしましょう。

私の場合はLinodeのプライベートネットワークを使っているので、DB鯖が持っているLAN側IPアドレスをESにListenさせて、App鯖のLAN側IPアドレスが送信元という条件でFWを開けています。(UFWに関しては今回は書きません)

/etc/elasticsearch/elasticsearch.yml

略
network.host: x.x.x.x
discovery.type: single-node
略

後今回はRAM2GBのマシンで、既に載っているPostgreSQLやRedisで1.2GBほど喰っていたのでElasticsearchに渡すのは512MB程度にしておきます。

/etc/elasticsearch/jvm.options

略
-Xms512m
-Xmx512m
略

後はsudachi用に落とした辞書を使ってもらうように設定。

冒頭の参考先からコピペしたのでsystemDict以外なんも分からんな?

/etc/elasticsearch/sudachi/sudachi.json

{
    "systemDict" : "/etc/elasticsearch/system_full.dic",
    "inputTextPlugin" : [
        { "class" : "com.worksap.nlp.sudachi.DefaultInputTextPlugin" },
        { "class" : "com.worksap.nlp.sudachi.ProlongedSoundMarkInputTextPlugin",
          "prolongedSoundMarks": ["ー", "-", "⁓", "〜", "〰"],
          "replacementSymbol": "ー"}
    ],
    "oovProviderPlugin" : [
        { "class" : "com.worksap.nlp.sudachi.MeCabOovProviderPlugin" },
        { "class" : "com.worksap.nlp.sudachi.SimpleOovProviderPlugin",
          "oovPOS" : [ "補助記号", "一般", "*", "*", "*", "*" ],
          "leftId" : 5968,
          "rightId" : 5968,
          "cost" : 3857 }
    ],
    "pathRewritePlugin" : [
        { "class" : "com.worksap.nlp.sudachi.JoinNumericPlugin",
          "joinKanjiNumeric" : true },
        { "class" : "com.worksap.nlp.sudachi.JoinKatakanaOovPlugin",
          "oovPOS" : [ "名詞", "普通名詞", "一般", "*", "*", "*" ],
          "minLength" : 3
        }
    ]
}

書き終わったらsystemctlでelasticsearchを再起動して、Appサーバからcurlして通信できるかどうか確認しましょう。

2. Mastodon本体のコード改変

例によって上の参考先からほぼコピペ。

github.com/orlea/mastodon/commit/…

3. Mastodonの設定書き換え

ES_ENABLED=true
ES_HOST=x.x.x.x
ES_PORT=9200
ES_PREFIX=example

よしなに。

4. search deploy

docker使ってるならdocker execとかrunとかから、そうで無ければ適当にインストールした場所を指定して

bin/tootctl search deploy

寝る前に仕掛けて朝起きたら終わってるみたいな感じです。

むっちゃ時間かかった………。

アプデの時とか

sudachiがアプデされたときは、

  • ES止める
  • sudachiをアンインストール
  • apt-markでunhold
  • aptでまたバージョン指定してESインストール
  • sudachi落とし直し
  • インストール
  • 起動

ってな具合で。

終わったら

好きなだけ好きな単語で検索ができる!!!!

comments powered by Disqus