fess-crawlerに一太郎ドキュメントのMIMEタイプ検出を追加

fess-crawlerに、ジャストシステムの一太郎ドキュメントのMIMEタイプ検出機能を追加しました。これにより、Fessのクローラーが一太郎ファイルを正しく識別し、コンテンツを抽出できるようになります。

一太郎のファイル形式

一太郎はジャストシステムが開発した日本語ワープロソフトで、日本の官公庁や企業で広く利用されています。一太郎のファイルはOLE2複合ドキュメント形式を使用しており、バージョンによって複数の拡張子が存在します。

対応する拡張子

今回のMIMEタイプ application/x-js-taro に対応する拡張子は以下の通りです。

拡張子説明
.jtd一太郎 基本文書
.jtt一太郎 テンプレート
.jtdc一太郎 基本文書(ZIP圧縮)
.jttc一太郎 テンプレート(ZIP圧縮)
.jfw一太郎7形式 基本文書
.jvw一太郎7形式 テンプレート
.jsw一太郎ver.4形式 基本文書
.jaw一太郎ver.5形式 基本文書
.jtw一太郎ver.5形式 テンプレート
.jbw一太郎ver.6形式 基本文書
.juw一太郎ver.6形式 テンプレート

MIMEタイプの登録

tika-mimetypes.xmlにMIMEタイプ定義を追加しています。マジックバイト(DOC\x00)とglobパターンの両方で一太郎ファイルを識別できるようにしました。一太郎はOLE2複合ドキュメント形式を使用しているため、application/x-tika-msofficeのサブクラスとして登録しています。

<mime-type type="application/x-js-taro">
  <_comment>JustSystems Ichitaro Document</_comment>
  <magic priority="50">
    <match value="DOC\x00" type="string" offset="0"/>
  </magic>
  <glob pattern="*.jtd"/>
  <glob pattern="*.jtt"/>
  <!-- 他の拡張子も同様に登録 -->
  <sub-class-of type="application/x-tika-msoffice"/>
</mime-type>

Extractorの設定

extractor.xmlapplication/x-js-taroTikaExtractorにマッピングし、一太郎ファイルからのコンテンツ抽出を有効にしています。HWP(Hangul Word Processor)など他のOLE2ベースのフォーマットと同じパターンに従った設定です。

テスト

一太郎ver.4、ver.5、ver.6、一太郎7、一太郎2016の各バージョンのテストリソースファイルを用意し、すべての拡張子に対してMIMEタイプが正しく検出されることを確認するテストケースを追加しています。

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

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値で柔軟に制御できるようになりました。カスタムエクストラクターを追加する際に、既存のエクストラクターとの優先順位を設定ファイルで簡単に調整できます。