👋

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用の全文検索強化モジュールです。

主な機能

  1. 自動フォールバック機能

    • Mroonga未設定でもCJK検索を可能に
    • LIKE検索への自動切り替え
    • 設定不要で即座に利用可能
  2. Mroonga連携機能

    • 形態素解析による精密検索
    • TokenMecabサポート
    • 高速インデックス検索
  3. 診断ページ

    • プラグイン状態の確認
    • テーブルエンジンの表示
    • トークナイザー情報
    • 手動エンジン切り替え
  4. 厳密な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モジュールの重要性

  1. 必須: Omeka-Sで日本語全文検索を行うにはMroongaSearchモジュールが必須
  2. 即効性: インストール直後からフォールバック機能で検索可能
  3. 段階的改善: Mroonga設定で更に高速化

推奨セットアップ

レベル 設定 検索動作 パフォーマンス
最低限 MroongaSearchモジュールのみ LIKE検索フォールバック ⚠️ 遅い(でも動く)
推奨 MroongaSearchモジュール
+ Mroonga
+ TokenMecab
形態素解析検索 ✅ 高速

導入効果

  1. 日本語検索が可能に: フォールバックにより即座に動作
  2. 精度の向上: TokenMecabによる単語単位の検索
  3. 高速化: Groongaエンジンによる最適化
  4. 柔軟性: 形態素検索と部分一致の両立

結論: Omeka-Sで日本語コンテンツを扱う場合、MroongaSearchモジュールは必須です。

参考リンク

検証環境

  • Omeka-S: 4.1.1
  • MroongaSearch: latest
  • MariaDB: latest (11.x)
  • Docker Compose
  • macOS (Darwin 24.6.0)

この記事が役に立ちましたら、GitHubリポジトリにスターをお願いします!

Discussion