第17回 プラグインで検索を拡張する -- カスタムデータソースとIngestパイプラインの実装

はじめに

Fess は標準で多くのデータソースに対応していますが、企業固有のシステムやデータ形式に対応するには、プラグインによる拡張が必要になる場合があります。

本記事では、Fess のプラグインアーキテクチャを解説し、カスタムデータソースプラグインと Ingest プラグインの実装方法を紹介します。

対象読者

  • Fess を独自のデータソースに対応させたい方

  • プラグイン開発に興味がある Java 開発者

  • Fess の内部アーキテクチャを理解したい方

プラグインアーキテクチャ

Fess のプラグインは、以下の種類があります。

プラグインの種類
種類 役割
データストア (fess-ds-*) 外部データソースからデータを取得 Slack、Salesforce、DB
Ingest (fess-ingest-*) クロールデータの加工・変換 Example
テーマ (fess-theme-*) 検索画面のデザイン Simple、Code Search
スクリプト (fess-script-*) スクリプト言語のサポート OGNL
Web アプリ (fess-webapp-*) Web アプリケーション拡張 MCP サーバー

プラグインの配置

プラグインは JAR ファイルとして提供され、Fess のプラグインディレクトリに配置されます。 管理画面の [システム] > [プラグイン] からインストール・管理できます。

カスタムデータソースプラグインの開発

社内に独自の文書管理システムがある場合を想定して、データソースプラグインの開発手順を解説します。

プロジェクト構成

既存のデータストアプラグイン(例: fess-ds-git)を参考に、Maven プロジェクトを作成します。

fess-ds-custom/
├── pom.xml
└── src/
    └── main/
        └── java/
            └── org/codelibs/fess/ds/custom/
                └── CustomDataStore.java

pom.xml の設定

fess-parent を親 POM として指定し、必要な依存関係を設定します。

<parent>
    <groupId>org.codelibs.fess</groupId>
    <artifactId>fess-parent</artifactId>
    <version>15.5.0</version>
</parent>

<artifactId>fess-ds-custom</artifactId>
<packaging>jar</packaging>

<dependencies>
    <dependency>
        <groupId>org.codelibs.fess</groupId>
        <artifactId>fess</artifactId>
        <version>${fess.version}</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

データストアクラスの実装

データストアプラグインの中核は、データの取得と Fess へのドキュメント登録を行うクラスです。

実装のポイントは以下の通りです。

  1. 外部システムへの接続と認証

  2. データの取得(API 呼び出し、ファイル読み取りなど)

  3. 取得したデータを Fess のドキュメント形式に変換

  4. ドキュメントの登録

フィールドマッピング

取得したデータを Fess のフィールドにマッピングします。 主要なフィールドは以下の通りです。

  • title: ドキュメントのタイトル

  • url: ドキュメントの URL(検索結果のリンク先)

  • content: ドキュメントの本文(検索対象)

  • mimetype: MIME タイプ

  • last_modified: 最終更新日時

ビルドとデプロイ

$ mvn clean package

生成された JAR ファイルを Fess のプラグインディレクトリに配置し、Fess を再起動します。

Ingest プラグインの開発

Ingest プラグインは、クロールで取得したドキュメントをインデックスに登録する前に加工・変換する仕組みです。

ユースケース

  • クロールしたドキュメントに追加フィールドを付与

  • 本文テキストのクレンジング(不要な文字の除去)

  • 外部 API を使った情報の付加(翻訳、分類など)

  • ログ出力(デバッグ用)

実装のポイント

Ingest プラグインでは、ドキュメントがインデックスに登録される直前のデータにアクセスし、変換処理を行います。

例えば、すべてのドキュメントに組織名のメタデータを追加する処理や、本文から特定のパターンを除去する処理などを実装できます。

テーマプラグインの開発

検索画面のデザインを完全にカスタマイズしたい場合は、テーマプラグインを開発します。

テーマの構成

テーマプラグインは、JSP ファイル、CSS、JavaScript、画像ファイルで構成されます。

fess-theme-custom/
├── pom.xml
└── src/
    └── main/
        └── resources/
            ├── css/
            ├── js/
            ├── images/
            └── view/
                ├── index.jsp
                ├── search.jsp
                └── header.jsp

既存のテーマを参考にしながら、JSP と CSS を修正してカスタムデザインを実現します。

開発のベストプラクティス

既存プラグインの参考

新しいプラグインを開発する際は、既存のプラグインのソースコードを参考にすることを強く推奨します。 CodeLibs の GitHub リポジトリで、すべてのプラグインのソースコードが公開されています。

例えば、データストアプラグインの開発では fess-ds-gitfess-ds-slack が良い参考になります。

テスト

プラグインのテストは、以下の観点で行います。

  • 外部システムへの接続テスト

  • データ変換の正確性

  • エラーハンドリング(接続失敗、データ不正など)

  • パフォーマンス(大量データの処理時間)

バージョン互換性

Fess のバージョンアップ時に、プラグインの互換性を確認してください。 Fess のメジャーバージョンアップ時には、API の変更がある可能性があります。

まとめ

本記事では、Fess のプラグイン開発について解説しました。

  • プラグインアーキテクチャの概要(データストア、Ingest、テーマ、スクリプト)

  • カスタムデータソースプラグインの開発手順

  • Ingest プラグインによるドキュメント加工

  • テーマプラグインによる UI カスタマイズ

  • 開発のベストプラクティス

プラグインにより、Fess を組織固有の要件に合わせて拡張できます。 アーキテクチャ・スケーリング編はここまでです。次回からは AI・次世代検索編として、セマンティック検索の基礎を扱います。

参考資料