MediaWikiのtextsearch_ja対応

提供: mechanical Wiki
ナビゲーションに移動 検索に移動

MediawikiのバックエンドのDBMSにPostgreSQLを使う場合、何かしら手を入れないと日本語の全文検索ができない。 これは、PostgreSQL標準の全文検索機能が日本語をうまく扱えないため。 このため、PostgreSQL外部モジュールであるtextsearch_jaを使い、全文検索できるようにする。

本格的にやるのであれば、しかるべき全文検索エンジンを担いだ方が良いのであろうが、小規模なサイトであればこの程度で良かろうと思う。 pg_bigm対応は、何かと面倒そうだったのでやっていない。

環境

ソフトウェア バージョン
Mediawiki 1.23
PostgreSQL 9.3.5
textsearch_ja 9.0.0ベース

手順

textsearch_jaのPostgreSQL 9.3対応

textsearch_jaは、PostgreSQL 9.0時代から更新が止まっており、公式のままではPostgreSQL 9.3向けにビルドできない。 @nuko_yokohamaさんの情報を基に、textsearch_jaを改造する。

textsearch_ja公式ページのやり方に従い、ビルドとバイナリのインストールまで済ませる。 Debian wheezy用には、バイナリパッケージを作成済み。

DBのインストール

  1. DBへtextsearch_jaをインストール
  2. 全文検索用インデックスの更新

と、作業を進める。

DBへtextsearch_jaをインストール

MediawikiのDBに、DBクラスタのスーパーユーザ(postgres)で以下のコマンドを実行する。

$ psql -U postgres -f $PGSHARE/contrib/textsearch_ja.sql <wikidb>

CREATE EXTENSION対応はしていない。

また、postgresql.confのdefault_text_search_configpg_catalog.japaneseに変更する。 この変更により、to_tsvector()to_tsquery()で文字列をパースする際、textsearch_jaの機能が利用されるようになる。

全文検索用インデックスの更新

初期構築であれば特に不要だが、すでに何かしらのページを作成している場合は以下のSQLを実行する。 MediawikiのDBに、Mediawikiのユーザでログインし、実行する。 Mediawikiのオブジェクトはpublicスキーマにないため、postgresなどでログインするとsearch_pathを設定しない限りは見えない。

$ psql -U <wikiuser> <wikidb>
-- ページタイトル
UPDATE page SET titlevector = to_tsvector(REPLACE(page_title, '/', ' '));
VACUUM FULL page;
ANALYZE page;
-- ページ内容
UPDATE pagecontent SET textvector = to_tsvector(old_text)
                 WHERE textvector IS NOT NULL;
VACUUM FULL pagecontent;
ANALYZE pagecontent;

検索対象は、ページタイトルとページ内容の2カラム。 ページタイトルは、「/」を適切に扱う必要がある。 ページ内容(old_text)列には古いバージョンの行も含まれる。 この、古いバージョンの行(textvectorがNULLの行)には、検索用インデックスを張らない。