MediaWikiのtextsearch_ja対応
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のインストール
- DBへtextsearch_jaをインストール
- 全文検索用インデックスの更新
と、作業を進める。
DBへtextsearch_jaをインストール
MediawikiのDBに、DBクラスタのスーパーユーザ(postgres)で以下のコマンドを実行する。
$ psql -U postgres -f $PGSHARE/contrib/textsearch_ja.sql <wikidb>
CREATE EXTENSION
対応はしていない。
また、postgresql.confのdefault_text_search_config
をpg_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の行)には、検索用インデックスを張らない。