サークルなどで独自にMediaWikiを運用している方向けに、検索を改善するExtensionであるCirrusSearchの導入方法を解説します。
背景
MediaWikiのデフォルト全文検索は日本語に優しくない
MediaWikiには標準で全文検索機能がついていますが、検索結果はほぼ記事タイトルが出るだけで素っ気ない感じです。
※本記事の参考画像は、青空文庫収録『草枕』を適当に区切ってページを作成した状態のWikiで作成しました。
また、日本語の文章は単語ごとにスペース区切りがないため、標準の全文検索では検索漏れが発生します。
例えば以下の画像では、「写生」のキーワードに対して表示される記事は1つだけなのに、「写生帖」にすると複数の記事が出てきます。単語が適切に分割されず、検索漏れが起きてしまったと考えられます。
せっかくWikiを整備したのに、必要な情報が検索に掛からないようでは困ってしまいます。そこで、CirrusSearchという検索用の拡張機能を導入します。
CirrusSearch
CirrusSearch(シーラスサーチ)は、MediaWikiの検索機能を強化する拡張機能です。Wikipediaをはじめ、ウィキメディアプロジェクトは全てこの拡張を使用しています。
検索エンジンにはElasticsearchを使用しており、軽量に全文検索を行うことができます。
インストールの手順は公式のExtension:CirrusSearchに書かれている通りです。しかし、実際に辿ってみるとあちこち調べなければ手順の全貌が分からない上、何度か落とし穴にハマったので手順を残しておきます。
インストールの複雑さは開発側も承知のようで、拡張機能のページにも「分かりにくい依存関係をなんとかしたい」と書かれています。今後は楽にインストールできるようになるかもしれません。
環境
- CentOS
7.5
- 掲載する手順はCentOS7を前提としますが、他OSでも導入の流れは同じです
-
MediaWiki
1.32.0
- Elasticsearch
5.6.14
MediaWikiおよびCirrusSearchは活発に開発が行われているプロジェクトであり、以下の情報は最新のものでない可能性があります。
必ず公式のドキュメントやREADMEなどの一次情報と照らし合わせ、食い違いがあれば公式の指示に従ってください。
Elasticsearchを導入する
先述の通り、CirrusSearchはElasticsearchを使用するので先に導入しておく必要があります。
Java(JDK)を入れる
Elasticsearchが動くためにJavaが必要なので入れましょう。
$ sudo yum -y install java-1.8.0-openjdk-devel
Elasticsearch5 or 6を入れる
(古い情報)ここで早速落とし穴ですが、現時点でCirrusSearchはElasticsearch5.xまでしか対応していません。
MediaWikiのバージョンにより、インストールすべきElasticsearchのバージョンが違います。簡単に言うと、MediaWiki 1.32以前なら5.x、1.33以降なら6.xが必要です。
普通にインストールを進めると6.xが入るため、MediaWikiのバージョンによってはいざ起動する段階でこのように怒られて止まります。
`Only Elasticsearch 5.x is supported. Your version: 6.5.4.`
基本的には公式の手順を守ればよいです。バージョンの6.x
を5.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
で読み込みます。
wfLoadExtension( 'Elastica' );
これだけではインストールしたことにならず、composerを使う必要があります。composerがない場合は**公式**を参考に入れておいてください。
$ cd /MediaWikiが/ある/ディレクトリ/extensions/Elastica
$ composer install --no-dev
index.php/特別:バージョン情報
をブラウザで開いてElasticaが増えていればOKです。
CirrusSearchを導入する
インストール
お疲れ様でした。やっと本体のインストールに入れます。
**公式**からダウンロードしてextensionsディレクトリに展開するまではElasticaと同様です。
指示通りにLocalSettings.php
へ追記し、バージョン情報で無事インストールできたか確認します。
require_once "$IP/extensions/CirrusSearch/CirrusSearch.php";
インデックスの作成
ここからはREADMEを見るようにと書いてあるので見に行きます。
以下作業内容を解説しますが、CirrusSearchのバージョンアップで変わる可能性があるためリンク先も合わせてご確認ください。インストールに関する部分は4-31行目あたりです。
指示通りに検索を一旦停止します。
wfLoadExtension( 'Elastica' );
wfLoadExtension( 'CirrusSearch' );
$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
を実行することで回避できるようです。
最新版では上記の問題は修正されました。
再度検索を有効にします。
- $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に切り替えて作業完了です。
+ $wgSearchType = 'CirrusSearch';
検索結果を確認する
検索してみてエラーが出なければ、導入完了です! エラーが出た場合はメッセージでググる、これまでの作業で失敗していそうな部分をやり直すなどしてみましょう。
図は「写生」の検索結果です。これまで検索にかからなかった記事も発見できるようになりました。
付録:Elasticsearchのヒープサイズを抑制する
Elasticsearchはデフォルトでは2GBのヒープメモリを確保します。
安めのレンタルサーバやVPSでWikiを運用しており、メモリに余裕がないという場合は、消費できるヒープメモリを制限しておく必要があります。
こちらは所属団体のVPSでCirrusSearchを導入中、何も考えずにElasticsearchを起動した様子です。
大量のメモリスワップが発生してサーバが応答しなくなり、Mackerel先生に怒られています。
これではよくないのでメモリを制限してから起動しましょう。以下の記事を参考に修正します。
/etc/elasticsearch/jvm.options
を開いてXms
を探します(先頭にあるはずです)。Xms
とXmx
には同じ値を設定します。
制限の値は環境によって試行錯誤が必要ですが、物理メモリの50%以下とするのがよいようです。
# 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