LoginSignup
14
9

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-02-10

サークルなどで独自に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

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.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のバージョンアップで変わる可能性があるためリンク先も合わせてご確認ください。インストールに関する部分は4-31行目あたりです。

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

LocalSettings.php
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を実行することで回避できるようです。

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

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

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
14
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
9