MediaWiki に CirrusSearch を導入して日本語の全文検索精度を上げる

MediaWiki Enterprise Linux 9
このサイトはアフィリエイト広告(Amazonアソシエイト含む)を掲載しています。
スポンサーリンク

MediaWiki はイントラでの情報共有にも有用なツールですが、日本語での全文検索がうまくできない点がネックでした。

本家ウィキペディアでも採用されている CirrusSearch(シーラスサーチ)でこの問題を解決できるようなので、トライしてみました。

環境

  • AlmaLinux release 9.4
  • PHP 8.2
  • MediaWiki 1.39.8

CirrusSearch を動かすために Elasticsearch が必要ですが、MediaWiki のバージョンに対応した Elasticsearch をインストールする必要があります。

MediaWiki 1.39 以上の環境では、Elasticsearch 7.10.2(バージョン固定?)が必要とのこと。

Extension:CirrusSearch - MediaWiki

Wikipedia(日本語版)のバージョン情報を確認したところ、MediaWiki 1.43 でも Elasticsearch 7.10.2 を使用していました。検索に関する拡張機能は CirrusSearch と Elastica、AdvancedSearch を導入しているようです。

バージョン情報 - Wikipedia

インストール手順

Elasticsearch は Java で動くプログラムなので、Elasticsearch 6 以前は OpenJDK を別途インストールする必要があったようですが、Elasticsearch 7 以降は AdoptOpenJDK が同梱されているため不要です。

Elasticsearch 7.10.2 のインストール

公式サイトの手順通り にリポジトリを追加してインストールを試みたところ、バージョン 7.17.22-1 をインストールされそうになりました。

バージョン 7.10.2 をインストールしたいので、RPM を直接指定してインストールします。

Elasticsearch 7.10.2 | Elastic
dnf install https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-x86_64.rpm
(out) Last metadata expiration check: 2:43:47 ago on Thu 11 Jul 2024 10:33:51 AM JST.
(out) elasticsearch-7.10.2-x86_64.rpm                                                                                              4.5 MB/s | 304 MB     01:07
(out) Dependencies resolved.
(out) =============================================================================================================================================================
(out)  Package                                 Architecture                     Version                               Repository                              Size
(out) =============================================================================================================================================================
(out) Installing:
(out)  elasticsearch                           x86_64                           7.10.2-1                              @commandline                           304 M
(out) 
(out) Transaction Summary
(out) =============================================================================================================================================================
(out) Install  1 Package
(out) 
(out) Total size: 304 M
(out) Installed size: 510 M
(out) Is this ok [y/N]: y
(out) Downloading Packages:
(out) Running transaction check
(out) Transaction check succeeded.
(out) Running transaction test
(out) Transaction test succeeded.
(out) Running transaction
(out)   Preparing        :                                                                                                                                     1/1
(out)   Running scriptlet: elasticsearch-7.10.2-1.x86_64                                                                                                       1/1
(out) Creating elasticsearch group... OK
(out) Creating elasticsearch user... OK
(out) 
(out)   Installing       : elasticsearch-7.10.2-1.x86_64                                                                                                       1/1
(out)   Running scriptlet: elasticsearch-7.10.2-1.x86_64                                                                                                       1/1
(out) ### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd
(out)  sudo systemctl daemon-reload
(out)  sudo systemctl enable elasticsearch.service
(out) ### You can start elasticsearch service by executing
(out)  sudo systemctl start elasticsearch.service
(out) 
(out) Created elasticsearch keystore in /etc/elasticsearch/elasticsearch.keystore
(out) 
(out) /usr/lib/tmpfiles.d/elasticsearch.conf:1: Line references path below legacy directory /var/run/, updating /var/run/elasticsearch → /run/elasticsearch; please update the tmpfiles.d/ drop-in file accordingly.
(out) 
(out)   Verifying        : elasticsearch-7.10.2-1.x86_64                                                                                                       1/1
(out) 
(out) Installed:
(out)   elasticsearch-7.10.2-1.x86_64
(out) 
(out) Complete!

指示通り /usr/lib/tmpfiles.d/elasticsearch.conf を修正します。

d    /var/run/elasticsearch   0755 elasticsearch elasticsearch - -
       ↓
d    /run/elasticsearch   0755 elasticsearch elasticsearch - -

サービスを起動して、動作確認を行います。

systemctl start elasticsearch
systemctl enable elasticsearch
(out) Created symlink /etc/systemd/system/multi-user.target.wants/elasticsearch.service → /usr/lib/systemd/system/elasticsearch.service.
(out) 
curl http://127.0.0.1:9200
(out) {
(out)   "name" : "サーバー名",
(out)   "cluster_name" : "elasticsearch",
(out)   "cluster_uuid" : "XXXXXXXXXXXXXXXXXXXXXX",
(out)   "version" : {
(out)     "number" : "7.10.2",
(out)     "build_flavor" : "default",
(out)     "build_type" : "rpm",
(out)     "build_hash" : "747e1cc71def077253878a59143c1f785afa92b9",
(out)     "build_date" : "2021-01-13T00:42:12.435326Z",
(out)     "build_snapshot" : false,
(out)     "lucene_version" : "8.7.0",
(out)     "minimum_wire_compatibility_version" : "6.8.0",
(out)     "minimum_index_compatibility_version" : "6.0.0-beta1"
(out)   },
(out)   "tagline" : "You Know, for Search"
(out) }

昔は Java のバージョンとの相性問題で大変だったようですが、何事もなく導入できました。

Elasticsearch のプラグインをインストール

日本語の検索を正しく行うため、形態素解析を行ってくれる kuromoji をインストールします。

/usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji
(out) -> Installing analysis-kuromoji
(out) -> Downloading analysis-kuromoji from elastic
(out) [=================================================] 100%  
(out) -> Installed analysis-kuromoji

また、Unicode の国際化サポートをしてくれる ICU(International Components for Unicode)もインストールします。

/usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-icu
(out) -> Installing analysis-icu
(out) -> Downloading analysis-icu from elastic
(out) [=================================================] 100%  
(out) -> Installed analysis-icu

プラグインをインストールした後は、Elasticsearch を再起動しておいたほうが良さそうです。

systemctl restart elasticsearch

MediaWiki 拡張機能のインストール

続いて MediaWiki の拡張機能を導入していきます。

拡張機能のインストールには、パッケージ管理ツールの composer が必要になりますので、事前にインストールしておきます。

dnf install composer --enablerepo=epel

Elastica のインストール

まずは、MediaWiki と Elasticsearch がやり取りするために必要な Elastica をインストールします。

Extension:Elastica - MediaWiki

MediaWiki のバージョン(1.39)に合わせたファイルをダウンロードして、extensions ディレクトリに解凍します。

Download MediaWiki extension - MediaWiki

解凍したディレクトリ(/path/to/mediawiki/extensions/Elastica)に移動し、composer install --no-dev でパッケージをインストールします。

wget https://extdist.wmflabs.org/dist/extensions/Elastica-REL1_39-ab0fa8b.tar.gz
tar -xzf Elastica-REL1_39-ab0fa8b.tar.gz -C /path/to/mediawiki/extensions
chown apache. -R /path/to/mediawiki/extensions/Elastica
rm -f Elastica-REL1_39-ab0fa8b.tar.gz
cd /path/to/mediawiki/extensions/Elastica
sudo -u apache composer install --no-dev

MediaWiki の LocalSettings.php に Elastica を読み込む設定を追記します。

wfLoadExtension( 'Elastica' );

CirrusSearch のインストール

ここで本題の CirrusSearch をインストールします。

Extension:CirrusSearch - MediaWiki

先程と同じ要領でインストールしていきます。

Download MediaWiki extension - MediaWiki
wget https://extdist.wmflabs.org/dist/extensions/CirrusSearch-REL1_39-573b62a.tar.gz
tar -xzf CirrusSearch-REL1_39-573b62a.tar.gz -C /path/to/mediawiki/extensions
rm -f CirrusSearch-REL1_39-573b62a.tar.gz
chown apache. -R /path/to/mediawiki/extensions/CirrusSearch
cd /path/to/mediawiki/extensions/CirrusSearch
sudo -u apache composer install --no-dev

MediaWiki の LocalSettings.php に CirusSearch を読み込む設定を追記します。

wfLoadExtension( 'Elastica' );
wfLoadExtension( 'CirrusSearch' );

AdvancedSearch のインストール

MediaWiki の検索機能を拡張する AdvancedSearch もインストールします。

Extension:AdvancedSearch - MediaWiki

同じ要領でインストールしていきます。

Download MediaWiki extension - MediaWiki
wget https://extdist.wmflabs.org/dist/extensions/AdvancedSearch-REL1_39-117fca9.tar.gz
tar -xzf AdvancedSearch-REL1_39-117fca9.tar.gz -C /path/to/mediawiki/extensions
rm -f AdvancedSearch-REL1_39-117fca9.tar.gz
chown apache. -R /path/to/mediawiki/extensions/AdvancedSearch
cd /path/to/mediawiki/extensions/AdvancedSearch
sudo -u apache composer install --no-dev

MediaWiki の LocalSettings.php に AdvancedSearch を読み込む設定を追記します。

wfLoadExtension( 'Elastica' );
wfLoadExtension( 'CirrusSearch' );
wfLoadExtension( 'AdvancedSearch' );

MediaWiki の特別ページにアクセスして、バージョン情報を開きます。

インストール済みソフトウェアに「Elasticsearch」、拡張機能がインストールされたか確認します。

とりあえず全ての拡張機能をインストールすることができました。

インデックスの作成

必要な環境が構築できたので、検索のインデックスを作成していきます。

README - mediawiki/extensions/CirrusSearch - Gitiles

最初のインデックスを作成する前に MediaWiki の LocalSetting.php を編集して、検索を一時的に無効にします。

また、AdvancedSearch も CirrusSearch に依存する機能なので、インデックスの作成が終わるまでコメントアウトしておきます。

wfLoadExtension( 'Elastica' );
wfLoadExtension( 'CirrusSearch' );
$wgDisableSearchUpdate = true;
#wfLoadExtension( 'AdvancedSearch' );

検索を無効にしたら、Elasticsearch のインデックスを作成します。

php /path/to/mediawiki/extensions/CirrusSearch/maintenance/UpdateSearchIndexConfig.php
(out) Updating cluster ...
(out) indexing namespaces...
(out) mw_cirrus_metastore missing, creating new metastore index.
(out) Creating metastore index... mw_cirrus_metastore_first   Scanning available plugins...none
(out)  ok
(out)                 Green!Creating mw_cirrus_metastore alias to mw_cirrus_metastore_first.
(out)         Indexing namespaces...done
(out) content index...
(out)         Fetching Elasticsearch version...7.10.2...ok
(out)         Scanning available plugins...none
(out)         Picking analyzer...cjk
(out)         Inferring index identifier...mediawiki_content_first
(out)         Creating index...ok
(out)                 Validating number of shards...ok
(out)                 Validating replica range...ok
(out)                 Validating shard allocation settings...
(out)                         Clearing 'include' allocations...done
(out)                 Validating max shards per node...ok
(out)         Validating analyzers...ok
(out)         Validating mappings...
(out)                 Validating mapping...different...corrected
(out)         Validating aliases...
(out)                 Validating mediawiki_content alias...alias is free...corrected
(out)                 Validating mediawiki alias...alias not already assigned to this index...corrected
(out)                 Updating tracking indexes...done
(out) general index...
(out)         Fetching Elasticsearch version...7.10.2...ok
(out)         Scanning available plugins...none
(out)         Picking analyzer...cjk
(out)         Inferring index identifier...mediawiki_general_first
(out)         Creating index...ok
(out)                 Validating number of shards...ok
(out)                 Validating replica range...ok
(out)                 Validating shard allocation settings...
(out)                         Clearing 'include' allocations...done
(out)                 Validating max shards per node...ok
(out)         Validating analyzers...ok
(out)         Validating mappings...
(out)                 Validating mapping...different...corrected
(out)         Validating aliases...
(out)                 Validating mediawiki_general alias...alias is free...corrected
(out)                 Validating mediawiki alias...alias not already assigned to this index...corrected
(out)                 Updating tracking indexes...done

Elasticsearch のインデックスを作成したら、LocalSetting.php で検索を有効に戻します。

wfLoadExtension( 'Elastica' );
wfLoadExtension( 'CirrusSearch' );
#$wgDisableSearchUpdate = true;
#wfLoadExtension( 'AdvancedSearch' );

続いて、検索インデックスを作成します。

php /path/to/mediawiki/extensions/CirrusSearch/maintenance/ForceSearchIndex.php --skipLinks --indexOnSkip
(out) [           mediawiki] Indexed 10 pages ending at 10 at 29/second
(out) …
(out) [           mediawiki] Indexed 5 pages ending at 5614 at 76/second
(out) Indexed a total of 5147 pages at 76/second
(out) 
php /path/to/mediawiki/extensions/CirrusSearch/maintenance/ForceSearchIndex.php --skipParse
(out) [           mediawiki] Indexed 50 pages ending at 50 at 55/second
(out) …
(out) [           mediawiki] Indexed 15 pages ending at 5614 at 74/second
(out) Indexed a total of 5147 pages at 74/second

検索インデックスを作成したら、検索方法を CirrusSearch に切り替えます。

また、コメントアウトしていた AdvancedSearch も有効化します。

wfLoadExtension( 'Elastica' );
wfLoadExtension( 'CirrusSearch' );
#$wgDisableSearchUpdate = true;
$wgSearchType = 'CirrusSearch';
wfLoadExtension( 'AdvancedSearch' );

以上で MediaWiki の検索を CirrusSearch に切り替えることができました!

少し長かったですが、手順通り進めれば割とスムーズに導入することができると思います。

ただし、自分の管理している Wiki では参照読み込みを多用しているせいもあって、検索インデックスが作成されるまで数日かかりました。すぐに検索結果に反映されないからと言って焦らないようにしましょう。

日本語の全文検索の精度も改善されてとても満足です。

参考にしたサイト

hppy.net
MediaWikiを自前で運用している人はCirrusSearchで日本語全文検索を改善しよう - Qiita
サークルなどで独自にMediaWikiを運用している方向けに、検索を改善するExtensionであるCirrusSearchの導入方法を解説します。 背景 MediaWikiのデフォルト全文検索は日本語に優しくない MediaWikiには標...

追記

しばらく運用したところ、Elasticsearch が落ちて検索できなくなる状況がありました。ステータスを確認すると、メモリ不足でプロセスが強制終了された様子です。

検索できなくなってしまっては本末転倒なので、Elasticsearch が落ちたら自動的に再起動する事で対処しました。

# Allow a slow startup before the systemd notifier module kicks in to extend the timeout
TimeoutStartSec=75

Restart=always

[Install]
WantedBy=multi-user.target

systemd に反映して、Elasticsearch を起動します。

systemctl daemon-reload
systemctl start elasticsearch

本来ならメモリを増やすなり、チューニングを施した方が良いのですが、暫くこれで様子を見てみます。

コメント

タイトルとURLをコピーしました