FessのウィザードでWebクロール設定のデフォルト除外パターンを適用

Fess 15.5で、管理画面のウィザード機能でWebクロール設定を作成する際に、デフォルトの除外パターンが適用されるように改善しました。

これまで、Webクロール設定をウィザードから作成した場合、除外URLのフィールドが空の状態で作成されていました。一方、Webクロール設定画面から作成した場合は、(?i).*(css|js|jpeg|jpg|gif|png|bmp|wmv|xml|ico|exe)というデフォルトの除外パターンが設定されていました。この不一致により、ウィザードで作成した設定では、検索対象としては不要なCSSやJavaScript、画像ファイルなどもクロール対象に含まれてしまう状態でした。

今回の修正で、ウィザードから作成した場合でも同じデフォルト除外パターンが適用されるようになり、一貫した動作となりました。これにより、ウィザードを使ったクロール設定でも、最初から適切なファイルが除外されるので、効率的なクロールが可能になります。

FessのテストをJUnit 5へ移行

Fessのテストコードを JUnit 4 から JUnit 5(Jupiter)へ移行しました。4000以上のテストケースがあるため、かなりの作業量になりましたが、無事に完了しました。

移行の背景

JUnit 4は長らくJavaのテストフレームワークのデファクトスタンダードでしたが、JUnit 5では以下のような改善が行われています。

  • アノテーションの刷新(@Before@BeforeEach@After@AfterEach など)
  • より柔軟な拡張モデル
  • ネストしたテストのサポート
  • パラメータ化テストの改善

Fessでも最新のテスト環境を維持するため、移行を実施しました。

移行作業の内容

@AfterEachアノテーションの追加

JUnit 5では、テストメソッドの後処理に@AfterEachアノテーションが必要です。従来のtearDown()メソッドに対して、このアノテーションを追加しました。

import org.junit.jupiter.api.AfterEach;

public class SampleTest extends UnitFessTestCase {

    @AfterEach
    public void tearDown() throws Exception {
        // クリーンアップ処理
    }
}

この変更だけで6000行以上の修正が必要でした。テストクラスの数が多いため、すべてのtearDown()メソッドにアノテーションを追加し、importステートメントも更新しました。

  • PR #3012: fix(test): add @AfterEach annotation for JUnit 5 compatibility

テストカバレッジの向上

移行に合わせて、これまでテストが不足していた箇所にも新規テストを追加しました。

追加したテストの内容:

  • Service層: FessAppServiceTestでベースサービス機能をテスト
  • Storage関連: StorageItemTest、StorageTypeTestでストレージクラスをテスト
  • Pagerクラス: 24個の新規Pagerテスト(GroupPager、RolePager、UserPager、SchedulerPager、PathMapPager、KeyMatchPager、ElevateWordPager、FailureUrlPager、JobLogPager、FileConfigPager、WebConfigPager、RelatedContentPager、RelatedQueryPager、RoleTypePager、SearchLogPager、WebAuthPager、FileAuthPager、ReqHeaderPager、SynonymPager、KuromojiPager、StopwordsPager、ProtwordsPager、StemmerOverridePager、LabelTypePager)
  • Jobクラス: AllJobSchedulerTest、ScriptExecutorJobTestでジョブスケジューリングをテスト

これらの追加により、以下のカバレッジギャップを解消しました。

対象移行前カバレッジ移行後
Service層0%テスト追加
Pagerクラス22.6%大幅に向上
Storageクラス0%テスト追加
App Jobクラス0%テスト追加
  • PR #3011: test: add unit tests for improved test coverage

まとめ

4000以上のテストケースを持つFessのJUnit 5移行を完了しました。移行作業は主にアノテーションの置き換えとimport文の更新でしたが、テストクラスの数が多いため手間のかかる作業でした。また、移行を機にテストカバレッジも改善し、これまで手薄だった箇所にテストを追加しました。

FessにAIモード(RAGチャット機能)を追加

全文検索サーバーFessの次期バージョン15.5に、LLMを使ったRAG(Retrieval-Augmented Generation)チャット機能をAIモードとして追加しました。

企業の文書検索において、ChatGPTのような対話形式で回答を得たいというニーズは増えています。一般的なRAGの実装では、ベクトル検索(Embedding検索)を使って関連文書を取得しますが、数百万から数千万件規模のドキュメントをベクトル検索で運用するには、計算リソースやインフラコストの面でハードルが高いのが現状です。Fessでベクトル検索でRAGをしたい場合は、商用サポートに相談みたいな感じかな。

FessのAIモードでは、検索部分は従来どおりの全文検索(OpenSearch)を使い、検索結果をコンテキストとしてLLMに渡すことで、RAGを実現しています。これにより、既存のFess環境にLLMを追加するだけでRAGチャットが使えるようになります。

主な機能

マルチLLMプロバイダー対応

以下のLLMプロバイダーをサポートしています。

  • Ollama: ローカルで動作するLLM。APIキー不要で、プライベート環境での利用に最適
  • OpenAI (GPT-4, GPT-4o等): OpenAI APIを使用
  • Google Gemini: Google AI StudioのAPIを使用

デフォルトではOllamaが設定されており、ローカル環境で手軽に試すことができます。

ストリーミングレスポンス

REST APIでServer-Sent Events(SSE)によるストリーミングに対応しています。LLMからの応答をリアルタイムで表示できるため、ユーザー体験が向上します。

  • 同期API: /api/v1/chat
  • ストリーミングAPI: /api/v1/chat/stream

チャットセッション管理

会話履歴を保持するセッション管理機能を実装しています。

  • セッションタイムアウト: デフォルト30分(設定変更可)
  • レートリミット: デフォルト10リクエスト/分(設定変更可)

チャットUI

Web UIにチャット画面を追加しました。検索結果を基にした対話形式での情報探索が可能です。

アーキテクチャ

AIモードのワークフローは以下のとおりです。

  1. ユーザーからの質問を受け取る
  2. Fessの全文検索で関連文書を検索
  3. 検索結果をコンテキストとしてLLMに渡す
  4. LLMが回答を生成してユーザーに返す

LLMクライアントは抽象化されており、LlmClientインターフェースを実装することで、他のLLMプロバイダーも追加できます。

設定

fess_config.propertiesで各種設定が可能です。

  • LLMプロバイダーの選択
  • APIキー
  • モデル名
  • レートリミット
  • セッションタイムアウト

まとめ

Fess 15.5のAIモードは、全文検索とLLMを組み合わせることで、現実的なコストでRAGを実現する機能です。大規模なベクトルDBを構築せずとも、既存のFess環境を活かしてAIチャット機能を追加できます。

現時点では実験的な機能として提供しますが、フィードバックをいただきながら改善していく予定です。