Fess 15.5.0のリリース

内容的な話はリリースノートを参照してもらえば良いかと思いますが、今回もいろいろな修正が入っています。

今回は実験的な機能として、AI検索モードが追加されています。AI検索モードは、AIエージェントが検索をしてくれるみたいな感じの機能です。なので、入力された質問文に対して、AIエージェントが検索クエリーを作成して、検索して、検索結果を評価した上で、検索結果を返してくれるみたいな感じです。なので、従来通りのクロールしてインデクシングできるので、ベクトル検索などを使う難しさなどはなく、利用することができます。実験的な機能なので、継続的に改善していければと思います。

他には、インデックスされたドキュメントをダンプする機能が欲しかったので、JSONやHTMLとしてファイルに出力する機能を追加しました。スケジューラーのジョブに登録してあるので、実行するとfess_config.propertiesで指定したパスに出力することができます。スクロールAPIとかでも全件取得はできますが、Fessのジョブとして、実行するだけでファイルに書き出せる感じです。

あとは、Fessをデモ的に公開していると、激しくアクセスしてくるクローラーとかがいて、Lightsailとかで運用していると負荷でクレジットを使い切ってしまい、サーバーがフリーズしてしまうことがあったので、検索画面へのアクセスにおいて、OpenSearchの負荷が高い場合は、混み合ってます的に429を返すみたいな処理を入れました。

という感じで、これら以外にもhttpclient5に移行したり、いろいろと修正は入っているので、試してみてください。今回もほぼほぼClaude Codeで開発して、自らコードをほとんど書いてない感じです。IDEも問題調査が必要なときにデバッグして、確認するくらいしか、Eclipseを開くことがなくなってきました。今も、この文を書いている裏で、実装してくれていますし。Fessの開発の仕方も変わってきてます。

次回のリリースもいろいろと変更が入ったりするかもしれませんが、何か要望があれば、フォーラムとかに投げてもらえれば、Claude Codeにやってもらって実現できるかもしれません。

Fess Crawlerのエクストラクターにweight設定を追加

Fess Crawlerのエクストラクターにweightを指定できるようにしました。これにより、同じMIMEタイプに対して複数のエクストラクターが登録されている場合に、優先度を制御できるようになります。

背景

Fess Crawlerでは、ドキュメントからテキストを抽出するためにエクストラクター(Extractor)を利用しています。エクストラクターはMIMEタイプに基づいて選択されますが、同じMIMEタイプに対して複数のエクストラクターが存在する場合、どちらを優先するかを制御する仕組みがありませんでした。

変更内容

ExtractorインターフェースにgetWeight()メソッドをデフォルトメソッドとして定義し、AbstractExtractor基底クラスにweightフィールドを追加しました。

Extractorインターフェースでは、デフォルトのweightとして1を返すようになっています。

public interface Extractor {
    ExtractData getText(InputStream in, Map<String, String> params);

    default int getWeight() {
        return 1;
    }
}

AbstractExtractorでは、weightフィールドとsetter/getterを実装しています。

public abstract class AbstractExtractor implements Extractor {
    protected int weight = 1;

    @Override
    public int getWeight() {
        return weight;
    }

    public void setWeight(final int weight) {
        this.weight = weight;
    }
}

設定方法

Fessの設定ファイル(XML)で、エクストラクターのweightを指定できます。weightの値が大きいエクストラクターが優先的に使用されます。

<component name="tikaExtractor" class="org.codelibs.fess.crawler.extractor.impl.TikaExtractor">
    <property name="weight">10</property>
</component>

デフォルトのweightは1なので、特に設定しなければ従来と同じ動作になります。

まとめ

この変更により、エクストラクターの優先度をweight値で柔軟に制御できるようになりました。カスタムエクストラクターを追加する際に、既存のエクストラクターとの優先順位を設定ファイルで簡単に調整できます。

fess-crawlerにPostScriptテキスト抽出機能を追加

fess-crawlerに、PostScript(.ps)ファイルからテキストを抽出するPsExtractorを追加しました。これにより、Fessのクロール対象としてPostScriptファイルも扱えるようになります。

PostScriptとは

PostScriptはAdobe Systemsが開発したページ記述言語で、印刷やDTPの分野で広く使われてきたフォーマットです。PostScriptファイルにはテキスト描画命令が含まれていますが、プログラミング言語としての側面もあり、テキストの抽出は単純ではありません。

PsExtractorの仕組み

PsExtractorは、PostScriptのshow系オペレータを解析してテキストを抽出します。対応しているオペレータは以下の通りです。

オペレータ説明
show基本的なテキスト描画
ashow文字間隔調整付きテキスト描画
widthshow特定文字の幅調整付きテキスト描画
awidthshowashow + widthshow の組み合わせ
kshowカーニングプロシージャ付きテキスト描画
xshow個別X座標指定のテキスト描画
yshow個別Y座標指定のテキスト描画
xyshow個別XY座標指定のテキスト描画

文字列リテラルとしては、括弧形式の文字列((Hello World))と16進文字列(<48656C6C6F>)の両方に対応しています。括弧形式の文字列では、エスケープシーケンス(\n\t、8進数など)やネストされた括弧も正しく処理されます。

DI設定

extractor.xmlpsExtractorコンポーネントを登録し、application/postscript MIMEタイプにマッピングしています。

制限事項

現在の実装では以下のケースには対応していません。

  • ループやプロシージャによる動的なテキスト生成
  • フォントエンコーディングの再定義
  • バイナリエンコードされたPostScriptファイル

静的にshow系オペレータで描画されるテキストの抽出に特化した実装となっています。

テスト

12件のテストケースを作成し、基本的なテキスト抽出、16進文字列、エスケープシーケンス、ネストされた括弧、空コンテンツ、各種show系オペレータなどの動作を検証しています。

変更の詳細はPR #140を参照してください。