Omeka-SのMroongaSearchモジュールで日本語全文検索を実現する
はじめに
Omeka-Sは強力なデジタルアーカイブシステムですが、デフォルトでは日本語の全文検索がほとんど機能しません。本記事では、MroongaSearchモジュールを導入することで、日本語全文検索を実現する方法を解説します。
重要:なぜMroongaSearchモジュールが必要なのか
Omeka-Sの標準検索の問題点
Omeka-Sの標準フルテキスト検索(FullTextSearchモジュール)は、InnoDBエンジンを使用しており、以下の致命的な問題があります:
日本語単語検索の例:
データ: 「東京大学で人工知能を研究する」
検索語: 「人工知能」
結果: ❌ ヒットしない
InnoDBのフルテキスト検索は英語のようなスペース区切り言語を前提としているため、日本語では:
- 単語検索が不可能: 文字列全体が1つの単語として扱われる
- 部分一致も機能しない: FULLTEXTインデックスが日本語を正しく処理できない
- 検索結果がゼロ: ユーザーは何も見つけられない
MroongaSearchモジュールの解決策
MroongaSearchモジュールは、この問題を2段階で解決します:
1. フォールバック機能(モジュール導入直後から有効)
重要: MroongaSearchモジュールをインストールするだけで、特別な設定なしで日本語検索が動作するようになります。
データ: 「東京大学で人工知能を研究する」
検索語: 「人工知能」
【MroongaSearchモジュールなし】
→ ❌ 結果ゼロ
【MroongaSearchモジュールあり(Mroonga未設定でも)】
→ ✅ LIKE '%人工知能%' にフォールバック
→ ✅ 検索結果が返る!
MroongaSearchモジュールのフォールバック機能:
- CJK(日本語・中国語・韓国語)の単一語検索を自動検出
-
LIKE '%term%'
検索に自動的にフォールバック - Mroongaが設定されていなくても動作する
- これがないと、日本語全文検索がそもそもうまくいかない
2. Mroonga+TokenMecabによる高速・高精度検索(推奨)
さらに、MariaDBにMroongaプラグインを設定すると:
- ✅ 形態素解析による精密な単語検索
- ✅ 高速な全文検索(LIKEの数百倍高速)
- ✅ AND/OR検索の厳密な制御
MroongaSearchモジュールとは
MroongaSearchは、Omeka-S用の全文検索強化モジュールです。
主な機能
-
自動フォールバック機能
- Mroonga未設定でもCJK検索を可能に
- LIKE検索への自動切り替え
- 設定不要で即座に利用可能
-
Mroonga連携機能
- 形態素解析による精密検索
- TokenMecabサポート
- 高速インデックス検索
-
診断ページ
- プラグイン状態の確認
- テーブルエンジンの表示
- トークナイザー情報
- 手動エンジン切り替え
-
厳密なAND/OR検索
- 標準のFullTextSearchより精密な検索ロジック
開発者
- Kentaro Fukuchi (初期版)
- Kazufumi Fukuda (機能拡張)
- Toshihito Waki (現メンテナー)
セットアップ手順
ステップ1: MroongaSearchモジュールのインストール
cd /path/to/omeka-s/modules
git clone https://github.com/wakitosh/MroongaSearch.git
Omeka-S管理画面からモジュールを有効化します。
これだけで日本語検索が動作するようになります!(LIKE検索のフォールバック)
ステップ2: Mroonga環境の構築(推奨)
より高速・高精度な検索のため、MariaDBにMroongaプラグインを設定します。
Docker環境の場合
ディレクトリ構成:
omeka-s-docker/
├── Dockerfile
├── docker-compose.yml
└── mariadb/
├── Dockerfile
└── init.sql
mariadb/Dockerfile:
FROM mariadb:latest
# Install Mroonga plugin and MeCab for Japanese tokenization
RUN apt-get update && \
apt-get install -y \
mariadb-plugin-mroonga \
groonga-tokenizer-mecab \
mecab \
mecab-ipadic-utf8 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Enable Mroonga plugin on startup
RUN echo "plugin_load_add = ha_mroonga" >> /etc/mysql/mariadb.conf.d/50-server.cnf
mariadb/init.sql:
-- Install Mroonga plugin and UDF functions
INSTALL SONAME 'ha_mroonga';
-- Install Mroonga UDF functions
CREATE FUNCTION IF NOT EXISTS mroonga_snippet HTML SONAME 'ha_mroonga.so';
CREATE FUNCTION IF NOT EXISTS mroonga_command RETURNS STRING SONAME 'ha_mroonga.so';
CREATE FUNCTION IF NOT EXISTS mroonga_escape RETURNS STRING SONAME 'ha_mroonga.so';
docker-compose.yml(mariadbセクション):
services:
mariadb:
build:
context: ./mariadb
dockerfile: Dockerfile
restart: always
volumes:
- mariadb:/var/lib/mysql
- ./mariadb/init.sql:/docker-entrypoint-initdb.d/init.sql
environment:
MYSQL_ROOT_PASSWORD: your_password
MYSQL_DATABASE: omeka
MYSQL_USER: omeka
MYSQL_PASSWORD: omeka
コンテナの再構築:
docker compose down
docker compose build mariadb
docker compose up -d
ステップ3: セットアップの検証
1. Mroongaプラグインの確認
docker exec <container-name> mariadb -u root -p<password> \
-e "SHOW PLUGINS" | grep -i mroonga
期待される出力:
Mroonga ACTIVE STORAGE ENGINE ha_mroonga.so GPL
2. TokenMecabの確認
docker exec <container-name> mariadb -u root -p<password> \
-e "SELECT mroonga_command('tokenizer_list')"
期待される出力(抜粋):
[{"name":"TokenMecab"},{"name":"TokenBigram"}, ...]
✅ TokenMecab
が含まれていればOK
3. MroongaSearch診断ページの確認
Omeka-S管理画面で:
モジュール → MroongaSearch → Configure → Diagnostics
表示内容:
- Plugin status: ACTIVE / NOT ACTIVE
- Table engine: InnoDB / Mroonga
- Tokenizer: TokenMecab / なし
- Mroonga effective: YES / NO
「Mroonga effective: NO」の場合:
- プラグインはACTIVEだが、テーブルエンジンがInnoDBのまま
- フォールバック検索(LIKE)が使用される
- 動作はするが、速度は遅い
「Mroonga effective: YES」にするには:
- 診断ページから手動でエンジンをMroongaに切り替え
- または、SQLで直接変更:
ALTER TABLE omeka.fulltext_search
ENGINE=Mroonga
COMMENT='table "ms_fulltext" tokenizer "TokenMecab"';
4. 再インデックス
診断ページまたはOmeka-S管理画面から再インデックスを実行します。
検索動作の仕組み
Mroonga未設定時(フォールバック)
検索語: 「人工知能」(CJK単一語)
MroongaSearchモジュールの判定:
→ CJK文字を検出
→ Mroonga未設定を検出
→ LIKE '%人工知能%' にフォールバック
→ ✅ 検索結果が返る
Mroonga+TokenMecab設定時
データ: 「東京大学で人工知能を研究する」
TokenMecabで形態素解析:
→ 「東京」/「大学」/「で」/「人工」/「知能」/「を」/「研究」/「する」
検索語: 「人工知能」
→ ✅ 「人工」AND「知能」でヒット(高速)
検索語: 「東京」
→ ✅ 「東京」でヒット
検索語: 「研究」
→ ✅ 「研究」でヒット
部分文字列検索も機能する
Mroongaは形態素解析だけでなく、部分文字列検索もサポート:
検索語: 「工知」
→ 「人**工知**能」にヒット ✅
これにより、ユーザーが正確な単語を知らない場合でも結果を得られます。
TokenMecabによる形態素解析
形態素解析とは
日本語には英語のようなスペース区切りがないため、文を単語に分割する必要があります。
例:
入力: 「東京大学で勉強する」
↓ TokenMecabで分割
出力: 「東京」/「大学」/「で」/「勉強」/「する」
これにより、「東京」や「大学」といった単語単位での検索が可能になります。
形態素解析の限界
TokenMecabは強力ですが、以下のケースでは期待通りに動作しない場合があります:
1. 固有名詞(辞書にない新語)
「鬼滅の刃」→「鬼」/「滅」/「の」/「刃」
(作品名として認識されない)
2. 複合語・専門用語
「機械学習」→「機械」/「学習」
(分離されると意味が変わる可能性)
3. 造語・新語
「エモい」→「エモ」/「い」または未知語扱い
4. 複数の分割パターン
「子供服」→「子供」/「服」or「子」/「供」/「服」
解決策
- ユーザー辞書: カスタム単語をMeCab辞書に追加
- TokenBigram併用: 2文字N-gramで部分一致を補完
- フォールバック: MroongaSearchが自動的にLIKE検索も併用
利用可能なトークナイザー
トークナイザー | 説明 | 用途 |
---|---|---|
TokenMecab | 形態素解析 | 日本語検索(推奨) |
TokenBigram | 2文字ずつ分割 | 部分一致重視 |
TokenUnigram | 1文字ずつ分割 | 完全一致のみ |
TokenDelimit | 区切り文字で分割 | 英語など |
パフォーマンス比較
LIKE検索(フォールバック)
SELECT * FROM fulltext_search WHERE text LIKE '%人工知能%';
- ⚠️ 全行スキャン
- ⚠️ データ量に比例して遅延
- ✅ ただし、検索結果は返る(モジュールなしではゼロ)
Mroonga全文検索
SELECT * FROM fulltext_search
WHERE MATCH(text) AGAINST('人工知能' IN BOOLEAN MODE);
- ✅ インデックス使用
- ✅ 高速検索(LIKEの数百倍)
- ✅ スケーラブル
まとめ
MroongaSearchモジュールの重要性
- 必須: Omeka-Sで日本語全文検索を行うにはMroongaSearchモジュールが必須
- 即効性: インストール直後からフォールバック機能で検索可能
- 段階的改善: Mroonga設定で更に高速化
推奨セットアップ
レベル | 設定 | 検索動作 | パフォーマンス |
---|---|---|---|
最低限 | MroongaSearchモジュールのみ | LIKE検索フォールバック | ⚠️ 遅い(でも動く) |
推奨 | MroongaSearchモジュール + Mroonga + TokenMecab |
形態素解析検索 | ✅ 高速 |
導入効果
- ✅ 日本語検索が可能に: フォールバックにより即座に動作
- ✅ 精度の向上: TokenMecabによる単語単位の検索
- ✅ 高速化: Groongaエンジンによる最適化
- ✅ 柔軟性: 形態素検索と部分一致の両立
結論: Omeka-Sで日本語コンテンツを扱う場合、MroongaSearchモジュールは必須です。
参考リンク
検証環境
- Omeka-S: 4.1.1
- MroongaSearch: latest
- MariaDB: latest (11.x)
- Docker Compose
- macOS (Darwin 24.6.0)
この記事が役に立ちましたら、GitHubリポジトリにスターをお願いします!
Discussion