Edited at

MediaWikiを自前で運用している人はCirrusSearchで日本語全文検索を改善しよう

サークルなどで独自にMediaWikiを運用している方向けに、検索を改善するExtensionであるCirrusSearchの導入方法を解説します。


背景


MediaWikiのデフォルト全文検索は日本語に優しくない

MediaWikiには標準で全文検索機能がついていますが、検索結果はほぼ記事タイトルが出るだけで素っ気ない感じです。

default-search.png

※本記事の参考画像は、青空文庫収録『草枕』を適当に区切ってページを作成した状態のWikiで作成しました。

また、日本語の文章は単語ごとにスペース区切りがないため、標準の全文検索では検索漏れが発生します。

例えば以下の画像では、「写生」のキーワードに対して表示される記事は1つだけなのに、「写生帖」にすると複数の記事が出てきます。単語が適切に分割されず、検索漏れが起きてしまったと考えられます。

default-search2.png

せっかくWikiを整備したのに、必要な情報が検索に掛からないようでは困ってしまいます。そこで、CirrusSearchという検索用の拡張機能を導入します。


CirrusSearch

CirrusSearch(シーラスサーチ)は、MediaWikiの検索機能を強化する拡張機能です。Wikipediaをはじめ、ウィキメディアプロジェクトは全てこの拡張を使用しています。

検索エンジンにはElasticsearchを使用しており、軽量に全文検索を行うことができます。

インストールの手順は公式のExtension:CirrusSearchに書かれている通りです。しかし、実際に辿ってみるとあちこち調べなければ手順の全貌が分からない上、何度か落とし穴にハマったので手順を残しておきます。

インストールの複雑さは開発側も承知のようで、拡張機能のページにも「分かりにくい依存関係をなんとかしたい」と書かれています。今後は楽にインストールできるようになるかもしれません。


環境


  • CentOS 7.5


    • 掲載する手順はCentOS7を前提としますが、他OSでも導入の流れは同じです




  • MediaWiki 1.32.0

  • Elasticsearch 5.6.14


Elasticsearchを導入する

先述の通り、CirrusSearchはElasticsearchを使用するので先に導入しておく必要があります。


Java(JDK)を入れる

Elasticsearchが動くためにJavaが必要なので入れましょう。

$ sudo yum -y install java-1.8.0-openjdk-devel


Elasticsearch5を入れる

ここで早速落とし穴ですが、現時点でCirrusSearchはElasticsearch5.xまでしか対応していません。最新のElasticsearchは6系なので、普通にインストールを進めるといざ起動する段階でこのように怒られて止まります。

`Only Elasticsearch 5.x is supported.  Your version: 6.5.4.`

基本的には公式の手順を守ればよいです。バージョンの6.x5.xにするのを忘れないようにしましょう。

$rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

$ sudo vim /etc/yum.repos.d/elasticsearch.repo

name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
$ sudo yum -y install elasticsearch

起動して動作確認します。

$ sudo systemctl enable elasticsearch

$ sudo systemctl start elasticsearch
$ curl http://127.0.0.1:9200
{
"name" : "*******",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "**********************",
"version" : {
"number" : "5.6.14",
"build_hash" : "f310fe9",
"build_date" : "2018-12-05T21:20:16.416Z",
"build_snapshot" : false,
"lucene_version" : "6.6.1"
},
"tagline" : "You Know, for Search"
}


analysis-kuromojiを入れる

analysis-kuromojiは、日本語の形態素解析を行ってくれるプラグインです。これがないと日本語の検索が不完全のままなので入れましょう。

Elasticsearchがきちんと入っていれば簡単にインストールできます。

$ sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji

$ sudo /usr/share/elasticsearch/bin/elasticsearch-plugin list
analysis-kuromoji


Elasticaを導入する

MediaWikiとElasticsearchがやり取りするための拡張です。公式ページの「ダウンロード」リンクから、お使いのMediaWikiのバージョンに合ったものをダウンロードしてください。

以下は1.32の例です。

$ wget https://extdist.wmflabs.org/dist/extensions/Elastica-REL1_32-9fcf88c.tar.gz

$ tar -xzf Elastica-REL1_32-9fcf88c.tar.gz -C /MediaWikiが/ある/ディレクトリ/extensions

LocalSettings.phpで読み込みます。


LocalSettings.php

wfLoadExtension( 'Elastica' );


これだけではインストールしたことにならず、composerを使う必要があります。composerがない場合は公式を参考に入れておいてください。

$ cd /MediaWikiが/ある/ディレクトリ/extensions/Elastica

$ composer install --no-dev

index.php/特別:バージョン情報をブラウザで開いてElasticaが増えていればOKです。

version-elastica.png


CirrusSearchを導入する


インストール

お疲れ様でした。やっと本体のインストールに入れます。

公式からダウンロードしてextensionsディレクトリに展開するまではElasticaと同様です。

指示通りにLocalSettings.phpへ追記し、バージョン情報で無事インストールできたか確認します。


LocalSettings.php

require_once "$IP/extensions/CirrusSearch/CirrusSearch.php";



インデックスの作成

ここからはREADMEを見るようにと書いてあるので見に行きます。

以下作業内容を解説しますが、CirrusSearchのバージョンアップで変わる可能性があるためリンク先も合わせてご確認ください。インストールに関する部分は26-49行目あたりです。

指示通りに検索を一旦停止します。


LocalSettings.php

$wgDisableSearchUpdate = true;


インデックスの設定を作るスクリプトを実行します。

$ php extensions/CirrusSearch/maintenance/updateSearchIndexConfig.php

content index...
Fetching Elasticsearch version...5.6.14...ok
Scanning available plugins...none
...
Updating tracking indexes...done
Deleting namespaces...done
Indexing namespaces...done

(コメントで情報いただきました)updateSearchIndexConfig.phpの実行に失敗する場合があります

修正が予定されていますが、発生した場合はmetastore.phpを実行することで回避できるようです。

最新版では上記の問題は修正されました。

再度検索を有効にします。


LocalSettings.php

- $wgDisableSearchUpdate = true;


いよいよインデックスを作成します。規模の大きいWikiの場合はそれなりに時間がかかるので、お茶でも飲んで待機します。

$ php extensions/CirrusSearch/maintenance/forceSearchIndex.php --skipLinks --indexOnSkip

[ wikidb] Indexed 10 pages ending at 10 at 13/second
Indexed a total of 10 pages at 13/second

$ php extensions/CirrusSearch/maintenance/forceSearchIndex.php --skipParse
[ wikidb] Indexed 10 pages ending at 10 at 10/second
Indexed a total of 10 pages at 10/second

ここまで来たら、検索エンジンをCirrusSearchに切り替えて作業完了です。


LocalSettings.php

+ $wgSearchType = 'CirrusSearch';



検索結果を確認する

検索してみてエラーが出なければ、導入完了です! エラーが出た場合はメッセージでググる、これまでの作業で失敗していそうな部分をやり直すなどしてみましょう。

図は「写生」の検索結果です。これまで検索にかからなかった記事も発見できるようになりました。

success.png


付録:Elasticsearchのヒープサイズを抑制する

Elasticsearchはデフォルトでは2GBのヒープメモリを確保します。

安めのレンタルサーバやVPSでWikiを運用しており、メモリに余裕がないという場合は、消費できるヒープメモリを制限しておく必要があります。

こちらは所属団体のVPSでCirrusSearchを導入中、何も考えずにElasticsearchを起動した様子です。

大量のメモリスワップが発生してサーバが応答しなくなり、Mackerel先生に怒られています。

elastic-heavy.png

これではよくないのでメモリを制限してから起動しましょう。以下の記事を参考に修正します。

/etc/elasticsearch/jvm.optionsを開いてXmsを探します(先頭にあるはずです)。XmsXmxには同じ値を設定します。

制限の値は環境によって試行錯誤が必要ですが、物理メモリの50%以下とするのがよいようです。


/etc/elasticsearch/jvm.options

  # Xms represents the initial size of total heap space

# Xmx represents the maximum size of total heap space

- -Xms2g
+ -Xms500m
- -Xmx2g
+ -Xmx500m


Elasticsearchを再起動し、検索が軽くなっていればOKです。

$ sudo systemctl restart elasticsearch