Mediawikiに全文検索エンジンを導入

実際にMediawikiの検索機能を使用してみると分かるが、標準検索機能は実用に耐えられないレベルである。そこで、検索結果向上のため全文検索エンジンを導入したいと思う。
データベースのストレージエンジンが「innodb」以外を選択するなら多少の改善方法もあるが、今回は「Elasticsearch」を使用した日本語全文検索エンジンを実装する。

MediawikiにElasticsearchを導入するためには、MediawikiのExtension (拡張機能) を使って実装することになるが、Mediawikiバージョン1.33ではExtensionのElasticsearch対応バージョン6.5.4迄となっている。

公式サイトから引用:詳細
Mediawiki 1.29.x and 1.30.x require Elasticsearch 5.3.x or 5.4.x.
Mediawiki 1.31.x and 1.32.x require Elasticsearch 5.5.x or 5.6.x.
Mediawiki 1.33.x and 1.34.x require Elasticsearch 6.5.x (6.5.4 recommended).

ちなみにMediawikiのバージョンを1.34以上にする事ができないのは、PHPやMySQLのバージョン変更を今現在行えない事情があるためやむを得ない。
MediawikiのPHPとMySQLのバージョン対応表

現在のMediawikiでは、Extensionを利用するためにPHPのパッケージ管理ソフト「composer」を使う事が主流であり、今回利用する2つのExtension「Elastica」「Cirrus Search」でも必須となる。
※構築環境にcomposerを入れてなかったのもあるが、クローズド環境のためcomposerを使用しない方法を模索したがElasticaが正常に動作しないため断念した。composerをクローズド環境で導入してみたが、今度はCirrussearchが正しく認識できなかった。結局サーバを新規構築して、その際にElasticsearchを実装してからクローズド環境へ移行したのサーバとリプレイスした経緯がある。


前提条件
・Mediawikiが既に動作している環境
Mediawikiセットアップ状況

 

 

 


Mediawiki の Extension導入準備

Elasticsearchのセットアップ
Elasticsearchプラグインのインストール
・analysis-icu(文字列正規化フィルター)
・Analysis Kuromoji(日本語形態素解析プラグイン)
composerインストール

Elastica(ElasticsearchのAPI)のインストール
※Mediawikiがドキュメントルート配下「mediawiki」ディレクトリにある場合

①Extension「Elastica」をダウンロード
Elastica公式URL:https://www.mediawiki.org/wiki/Extension:Elastica/ja

# cd /var/www/html/mediawiki/extensions/
# wget https://extdist.wmflabs.org/dist/extensions/Elastica-REL1_33-cb92585.tar.gz

②ファイルの展開および削除

# tar -xzf Elastica-REL1_33-cb92585.tar.gz
# rm -f Elastica-REL1_33-cb92585.tar.gz

③Composerで拡張機能を導入

# cd ./Elastica
# composer install --no-dev
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Loading composer repositories with package information
Updating dependencies
Package operations: 6 installs, 0 updates, 0 removals
- Installing psr/log (1.1.3): Downloading (100%) 
- Installing react/promise (v2.8.0): Downloading (100%) 
- Installing guzzlehttp/streams (3.0.0): Downloading (100%) 
- Installing guzzlehttp/ringphp (1.1.1): Downloading (100%) 
- Installing elasticsearch/elasticsearch (v6.0.1): Downloading (100%) 
- Installing ruflin/elastica (6.0.2): Downloading (100%) 
Package guzzlehttp/streams is abandoned, you should avoid using it. No replacement was suggested.
Package guzzlehttp/ringphp is abandoned, you should avoid using it. No replacement was suggested.
Writing lock file
Generating autoload files

④Mediawiki設定ファイルの最終行に拡張機能を追加

# vi /var/www/html/mediawiki/LocalSettings.php
wfLoadExtension( 'Elastica' );

⑤extensionを認識しているか確認
Mediawiki左側メニュー >バージョン情報を開き、拡張機能「Elastica」を認識しているか確認Elastica

 

 

 

 

CirrusSearch(実装プラグイン)のインストール
※Mediawikiがドキュメントルート配下「mediawiki」ディレクトリにある場合

①Extension「CirrusSearch」をダウンロード
CirrusSearch公式URLhttps://www.mediawiki.org/wiki/Extension:CirrusSearch/ja

# cd /var/www/html/mediawiki/extensions/
# wget https://extdist.wmflabs.org/dist/extensions/CirrusSearch-REL1_33-2daa9b8.tar.gz

②ファイルの展開および削除

# tar -xzf CirrusSearch-REL1_33-2daa9b8.tar.gz
# rm -f CirrusSearch-REL1_33-2daa9b8.tar.gz

③Mediawiki設定ファイルの最終行に拡張機能を追加
Mediawiki 1.33 以前のバージョン:require_once $IP/extensions/CirrusSearch/CirrusSearch.php”;
Mediawiki 1.34 以降のバージョン:wfLoadExtension( ‘CirrusSearch’ );
今回はMediawiki-1.33.2にインストールするので、以下内容を設定ファイル最終行に追加

# vi /var/www/html/mediawiki/LocalSettings.php
require_once "$IP/extensions/CirrusSearch/CirrusSearch.php";
$wgDisableSearchUpdate = true;

④extensionを認識しているか確認
・Mediawiki左側メニュー  > バージョン情報 > 「Elasticsearch」を認識しているか確認
Mediawikiインストール状況

 

 

 

 

 

 


・Mediawiki左側メニュー  > バージョン情報 > 「CirrusSearch」を認識しているか確認
CirrusSearch

 

 

⑤CirrusSearchのインデックス設定

#  php /var/www/html/mediawiki/extensions/CirrusSearch/maintenance/updateSearchIndexConfig.php

indexing namespaces...
mw_cirrus_metastore missing, creating new metastore index.
Creating metastore index... mw_cirrus_metastore_first   Scanning available plugins...
                analysis-icu, analysis-kuromoji
 ok
                Green!Creating mw_cirrus_metastore alias to mw_cirrus_metastore_first.
        Indexing namespaces...done
content index...
        Fetching Elasticsearch version...6.5.4...ok
        Scanning available plugins...
                analysis-icu, analysis-kuromoji
        Picking analyzer...japanese
        Inferring index identifier...wiki-mw__content_first
        Creating index...ok
                Validating number of shards...ok
                Validating replica range...ok
                Validating shard allocation settings...done
                Validating max shards per node...ok
        Validating analyzers...ok
        Validating mappings...
                Validating mapping...different...corrected
        Validating aliases...
                Validating wiki-mw__content alias...alias is free...corrected
                Validating wiki-mw_ alias...alias not already assigned to this index...corrected
                Updating tracking indexes...done
general index...
        Fetching Elasticsearch version...6.5.4...ok
        Scanning available plugins...
                analysis-icu, analysis-kuromoji
        Picking analyzer...japanese
        Inferring index identifier...wiki-mw__general_first
        Creating index...ok
                Validating number of shards...ok
                Validating replica range...ok
                Validating shard allocation settings...done
                Validating max shards per node...ok
        Validating analyzers...ok
        Validating mappings...
                Validating mapping...different...corrected
        Validating aliases...
                Validating wiki-mw__general alias...alias is free...corrected
                Validating wiki-mw_ alias...alias not already assigned to this index...corrected
                Updating tracking indexes...done
archive index...
        Fetching Elasticsearch version...6.5.4...ok
        Scanning available plugins...
                analysis-icu, analysis-kuromoji
        Picking analyzer...japanese
        Inferring index identifier...wiki-mw__archive_first
        Creating index...ok
                Validating number of shards...ok
                Validating replica range...ok
                Validating shard allocation settings...done
                Validating max shards per node...ok
        Validating analyzers...ok
        Validating mappings...
                Validating mapping...different...corrected
        Validating aliases...
                Validating wiki-mw__archive alias...alias is free...corrected
                Updating tracking indexes...done

⑥③でLocalSettings.phpに追加した以下の行を削除

# vi /var/www/html/mediawiki/LocalSettings.php
$wgDisableSearchUpdate = true; ← この行を削除

⑦インデックス作成

# php /var/www/html/mediawiki/extensions/CirrusSearch/maintenance/forceSearchIndex.php --skipLinks --indexOnSkip ipLinks

[            wiki-mw_] Indexed 9 pages ending at 10 at 0.5/second
[            wiki-mw_] Indexed 10 pages ending at 21 at 1/second
[            wiki-mw_] Indexed 8 pages ending at 31 at 2/second
[            wiki-mw_] Indexed 10 pages ending at 41 at 2/second
[            wiki-mw_] Indexed 9 pages ending at 52 at 3/second
[            wiki-mw_] Indexed 10 pages ending at 62 at 3/second
[            wiki-mw_] Indexed 10 pages ending at 73 at 4/second
[            wiki-mw_] Indexed 10 pages ending at 83 at 4/second
[            wiki-mw_] Indexed 10 pages ending at 97 at 5/second
[            wiki-mw_] Indexed 1 pages ending at 98 at 5/second
Indexed a total of 87 pages at 5/second
# php /var/www/html/mediawiki/extensions/CirrusSearch/maintenance/forceSearchIndex.php --skipParse

[            wiki-mw_] Indexed 46 pages ending at 52 at 102/second
[            wiki-mw_] Indexed 41 pages ending at 98 at 130/second
Indexed a total of 87 pages at 130/second

⑧検索エンジンをCirrusSearchに切り替え。LocalSettings.php最終行に以下追加

# vi /var/www/html/mediawiki/LocalSettings.php
$wgSearchType = 'CirrusSearch';

⑨Mediawikiで実際に検索をしてみる
以下例では、コンテンツ本文のテキストも検索対象となっていることが確認できる

MediaWiki検索結果

 

 

 

 

 

 

 

 

 

 

 

⑩追加記事を自動でインデキシング出来るようにcrontabに追加 (例:30分毎)

0,30 * * * * /usr/bin/php /var/www/labs/mediawiki/maintenance/runJobs.php > /var/log/mediawiki/runJobs.log 2>&1

検証するにはMediawikiに記事を追加して、「/var/log/mediawiki/runJobs.log」をtailでモニタリングしながらコマンド実行

/usr/bin/php /var/www/labs/mediawiki/maintenance/runJobs.php > /var/log/mediawiki/runJobs.log

キューがない場合:Job queue is empty. と表示される