MediaWiki はイントラでの情報共有にも有用なツールですが、日本語での全文検索がうまくできない点がネックでした。
本家ウィキペディアでも採用されている CirrusSearch(シーラスサーチ)でこの問題を解決できるようなので、トライしてみました。
環境
- AlmaLinux release 9.4
- PHP 8.2
- MediaWiki 1.39.8
CirrusSearch を動かすために Elasticsearch が必要ですが、MediaWiki のバージョンに対応した Elasticsearch をインストールする必要があります。
MediaWiki 1.39 以上の環境では、Elasticsearch 7.10.2(バージョン固定?)が必要とのこと。
Wikipedia(日本語版)のバージョン情報を確認したところ、MediaWiki 1.43 でも Elasticsearch 7.10.2 を使用していました。拡張機能は CirrusSearch と Elastica、AdvancedSearch を導入しているようです。
インストール手順
Elasticsearch は Java で動くプログラムなので、Elasticsearch 6 以前は OpenJDK を別途インストールする必要があったようですが、Elasticsearch 7 以降は AdoptOpenJDK が同梱されているため不要です。
Elasticsearch 7.10.2 のインストール
公式サイトの手順通り にリポジトリを追加してインストールを試みたところ、バージョン 7.17.22-1 をインストールされそうになりました。
バージョン 7.10.2 をインストールしたいので、RPM を直接指定してインストールします。
![](https://www.elastic.co/static-res/images/social_media_default.png)
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | # dnf install https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-x86_64.rpm Last metadata expiration check: 2:43:47 ago on Thu 11 Jul 2024 10:33:51 AM JST. elasticsearch-7.10.2-x86_64.rpm 4.5 MB/s | 304 MB 01:07 Dependencies resolved. ============================================================================================================================================================= Package Architecture Version Repository Size ============================================================================================================================================================= Installing: elasticsearch x86_64 7.10.2-1 @commandline 304 M Transaction Summary ============================================================================================================================================================= Install 1 Package Total size: 304 M Installed size: 510 M Is this ok [y/N]: y Downloading Packages: Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Running scriptlet: elasticsearch-7.10.2-1.x86_64 1/1 Creating elasticsearch group... OK Creating elasticsearch user... OK Installing : elasticsearch-7.10.2-1.x86_64 1/1 Running scriptlet: elasticsearch-7.10.2-1.x86_64 1/1 ### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd sudo systemctl daemon-reload sudo systemctl enable elasticsearch.service ### You can start elasticsearch service by executing sudo systemctl start elasticsearch.service Created elasticsearch keystore in /etc/elasticsearch/elasticsearch.keystore /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. Verifying : elasticsearch-7.10.2-1.x86_64 1/1 Installed: elasticsearch-7.10.2-1.x86_64 Complete! |
指示通り /usr/lib/tmpfiles.d/elasticsearch.conf を修正します。
1 2 3 | d /var/run/elasticsearch 0755 elasticsearch elasticsearch - - ↓ d /run/elasticsearch 0755 elasticsearch elasticsearch - - |
サービスを起動して、動作確認を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # systemctl start elasticsearch # systemctl enable elasticsearch Created symlink /etc/systemd/system/multi-user.target.wants/elasticsearch.service → /usr/lib/systemd/system/elasticsearch.service. # curl http://127.0.0.1:9200 { "name" : "サーバー名", "cluster_name" : "elasticsearch", "cluster_uuid" : "XXXXXXXXXXXXXXXXXXXXXX", "version" : { "number" : "7.10.2", "build_flavor" : "default", "build_type" : "rpm", "build_hash" : "747e1cc71def077253878a59143c1f785afa92b9", "build_date" : "2021-01-13T00:42:12.435326Z", "build_snapshot" : false, "lucene_version" : "8.7.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" } |
昔は Java のバージョンとの相性問題で大変だったようですが、何事もなく導入できました。
Elasticsearch のプラグインをインストール
日本語の検索を正しく行うため、形態素解析を行ってくれる kuromoji をインストールします。
1 2 3 4 5 | # /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji -> Installing analysis-kuromoji -> Downloading analysis-kuromoji from elastic [=================================================] 100% -> Installed analysis-kuromoji |
また、Unicode の国際化サポートをしてくれる ICU(International Components for Unicode)もインストールします。
1 2 3 4 5 | # /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-icu -> Installing analysis-icu -> Downloading analysis-icu from elastic [=================================================] 100% -> Installed analysis-icu |
プラグインをインストールした後は、Elasticsearch を再起動しておいたほうが良さそうです。
1 | # systemctl restart elasticsearch |
MediaWiki 拡張機能のインストール
続いて MediaWiki の拡張機能を導入していきます。
拡張機能のインストールには、パッケージ管理ツールの composer が必要になりますので、事前にインストールしておきます。
1 | # dnf install composer --enablerepo=epel |
Elastica のインストール
まずは、MediaWiki と Elasticsearch がやり取りするために必要な Elastica をインストールします。
MediaWiki のバージョン(1.39)に合わせたファイルをダウンロードして、extensions ディレクトリに解凍します。
解凍したディレクトリ(/path/to/mediawiki/extensions/Elastica)に移動し、composer install --no-dev でパッケージをインストールします。
1 2 3 4 5 6 | # 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 を読み込む設定を追記します。
1 | wfLoadExtension( 'Elastica' ); |
CirrusSearch のインストール
ここで本題の CirrusSearch をインストールします。
先程と同じ要領でインストールしていきます。
1 2 3 4 5 6 | # 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 を読み込む設定を追記します。
1 2 | wfLoadExtension( 'Elastica' ); wfLoadExtension( 'CirrusSearch' ); |
AdvancedSearch のインストール
MediaWiki の検索機能を拡張する AdvancedSearch もインストールします。
![](https://upload.wikimedia.org/wikipedia/commons/5/51/AdvSearch_Screen_20170620.png)
同じ要領でインストールしていきます。
1 2 3 4 5 6 | # 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 を読み込む設定を追記します。
1 2 3 | wfLoadExtension( 'Elastica' ); wfLoadExtension( 'CirrusSearch' ); wfLoadExtension( 'AdvancedSearch' ); |
MediaWiki の特別ページにアクセスして、バージョン情報を開きます。
インストール済みソフトウェアに「Elasticsearch」、拡張機能がインストールされたか確認します。
![](https://psychoco.net/wp-content/uploads/2024/07/cirussearch_1-1024x670.png)
![](https://psychoco.net/wp-content/uploads/2024/07/cirussearch_2-1024x412.png)
とりあえず全ての拡張機能をインストールすることができました。
インデックスの作成
必要な環境が構築できたので、検索のインデックスを作成していきます。
最初のインデックスを作成する前に MediaWiki の LocalSetting.php を編集して、検索を一時的に無効にします。
また、AdvancedSearch も CirrusSearch に依存する機能なので、インデックスの作成が終わるまでコメントアウトしておきます。
1 2 3 4 | wfLoadExtension( 'Elastica' ); wfLoadExtension( 'CirrusSearch' ); $wgDisableSearchUpdate = true; #wfLoadExtension( 'AdvancedSearch' ); |
検索を無効にしたら、Elasticsearch のインデックスを作成します。
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | # php /path/to/mediawiki/extensions/CirrusSearch/maintenance/UpdateSearchIndexConfig.php Updating cluster ... indexing namespaces... mw_cirrus_metastore missing, creating new metastore index. Creating metastore index... mw_cirrus_metastore_first Scanning available plugins...none ok Green!Creating mw_cirrus_metastore alias to mw_cirrus_metastore_first. Indexing namespaces...done content index... Fetching Elasticsearch version...7.10.2...ok Scanning available plugins...none Picking analyzer...cjk Inferring index identifier...mediawiki_content_first Creating index...ok Validating number of shards...ok Validating replica range...ok Validating shard allocation settings... Clearing 'include' allocations...done Validating max shards per node...ok Validating analyzers...ok Validating mappings... Validating mapping...different...corrected Validating aliases... Validating mediawiki_content alias...alias is free...corrected Validating mediawiki alias...alias not already assigned to this index...corrected Updating tracking indexes...done general index... Fetching Elasticsearch version...7.10.2...ok Scanning available plugins...none Picking analyzer...cjk Inferring index identifier...mediawiki_general_first Creating index...ok Validating number of shards...ok Validating replica range...ok Validating shard allocation settings... Clearing 'include' allocations...done Validating max shards per node...ok Validating analyzers...ok Validating mappings... Validating mapping...different...corrected Validating aliases... Validating mediawiki_general alias...alias is free...corrected Validating mediawiki alias...alias not already assigned to this index...corrected Updating tracking indexes...done |
Elasticsearch のインデックスを作成したら、LocalSetting.php で検索を有効に戻します。
1 2 3 4 | wfLoadExtension( 'Elastica' ); wfLoadExtension( 'CirrusSearch' ); #$wgDisableSearchUpdate = true; #wfLoadExtension( 'AdvancedSearch' ); |
続いて、検索インデックスを作成します。
1 2 3 4 5 6 7 8 9 10 11 | # php /path/to/mediawiki/extensions/CirrusSearch/maintenance/ForceSearchIndex.php --skipLinks --indexOnSkip [ mediawiki] Indexed 10 pages ending at 10 at 29/second … [ mediawiki] Indexed 5 pages ending at 5614 at 76/second Indexed a total of 5147 pages at 76/second # php /path/to/mediawiki/extensions/CirrusSearch/maintenance/ForceSearchIndex.php --skipParse [ mediawiki] Indexed 50 pages ending at 50 at 55/second … [ mediawiki] Indexed 15 pages ending at 5614 at 74/second Indexed a total of 5147 pages at 74/second |
検索インデックスを作成したら、検索方法を CirrusSearch に切り替えます。
また、コメントアウトしていた AdvancedSearch も有効化します。
1 2 3 4 5 | wfLoadExtension( 'Elastica' ); wfLoadExtension( 'CirrusSearch' ); #$wgDisableSearchUpdate = true; $wgSearchType = 'CirrusSearch'; wfLoadExtension( 'AdvancedSearch' ); |
以上で MediaWiki の検索を CirrusSearch に切り替えることができました!
少し長かったですが、手順通り進めれば割とスムーズに導入することができると思います。
ただし、自分の管理している Wiki では参照読み込みを多用しているせいもあって、検索インデックスが作成されるまで数日かかりました。すぐに検索結果に反映されないからと言って焦らないようにしましょう。
日本語の全文検索の精度も改善されてとても満足です。
参考にしたサイト
![](https://hppy.net/wp-content/uploads/2022/09/MediaWiki-2020-logo.svg_.png)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9TWVkaWFXaWtpJUUzJTgyJTkyJUU4JTg3JUFBJUU1JTg5JThEJUUzJTgxJUE3JUU5JTgxJThCJUU3JTk0JUE4JUUzJTgxJTk3JUUzJTgxJUE2JUUzJTgxJTg0JUUzJTgyJThCJUU0JUJBJUJBJUUzJTgxJUFGQ2lycnVzU2VhcmNoJUUzJTgxJUE3JUU2JTk3JUE1JUU2JTlDJUFDJUU4JUFBJTlFJUU1JTg1JUE4JUU2JTk2JTg3JUU2JUE0JTlDJUU3JUI0JUEyJUUzJTgyJTkyJUU2JTk0JUI5JUU1JTk2JTg0JUUzJTgxJTk3JUUzJTgyJTg4JUUzJTgxJTg2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmcz04ZmE2MWIyYjQ1ZDFiZWU4YzVkNzhiNmI3NjAwZTk1NA&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBrbjFjaHQmdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPTI1MzU2MDc0YWRkYzc2MmVkM2U5YTZiYjhkZWNhZWEz&blend-x=142&blend-y=486&blend-mode=normal&s=a8db9bf43a115f3482f63233848e0057)
追記
しばらく運用したところ、Elasticsearch が落ちて検索できなくなる状況がありました。ステータスを確認すると、メモリ不足でプロセスが強制終了された様子です。
検索できなくなってしまっては本末転倒なので、Elasticsearch が落ちたら自動的に再起動する事で対処しました。
1 2 3 4 5 6 7 | # 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 を起動します。
1 2 | # systemctl daemon-reload # systemctl start elasticsearch |
本来ならメモリを増やすなり、チューニングを施した方が良いのですが、暫くこれで様子を見てみます。
コメント