Fessのインデックスエクスポート機能で、従来のHTML形式に加えてJSON形式での出力をサポートしました。Strategyパターンを導入することで、エクスポート形式を柔軟に切り替えられるようになっています。
背景
Fessにはインデックスに保存されたドキュメントをファイルとしてエクスポートする IndexExportJob があります。これまではHTML形式でのみエクスポートが可能でしたが、データ連携や後処理の用途ではJSON形式の方が扱いやすいケースがあります。そこで、エクスポート形式を選択できるように拡張しました。
変更内容
Strategyパターンの導入
エクスポート形式の処理をStrategyパターンで設計し、IndexExportFormatterインターフェースを導入しました。
public interface IndexExportFormatter {
String getFileExtension();
String getIndexFileName();
String format(Map<String, Object> source, Set<String> excludeFields);
}
このインターフェースを実装する形で、HTML用の HtmlIndexExportFormatter とJSON用の JsonIndexExportFormatter を用意しています。
HTML形式(既存)
HtmlIndexExportFormatter は従来の動作と同じく、ドキュメントをHTML形式で出力します。タイトルやコンテンツはHTMLの構造に配置され、その他のフィールドは <meta> タグとして出力されます。
JSON形式(新規)
JsonIndexExportFormatter はドキュメントをJSONオブジェクトとして出力します。ネストされたコレクションやマップにも対応しており、適切なJSONエスケープ処理が行われます。
設定方法
fess_config.properties に以下の設定を追加します。
index.export.format=html
デフォルトはHTML形式です。JSON形式に変更するには以下のように設定します。
index.export.format=json
また、ジョブのスクリプトで format() メソッドを使って指定することもできます。
return container.getComponent("indexExportJob")
.format("json")
.execute();
format() メソッドで指定した場合は、設定ファイルの値よりも優先されます。
出力例
同じドキュメントをそれぞれの形式でエクスポートした場合の例です。
HTML形式
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>サンプルページ</title>
<meta name="fess:url" content="https://example.com/page">
<meta name="fess:host" content="example.com">
</head>
<body>
ページの本文テキスト
</body>
</html>
JSON形式
{
"title": "サンプルページ",
"content": "ページの本文テキスト",
"lang": "ja",
"url": "https://example.com/page",
"host": "example.com"
}
ファイルの拡張子
エクスポートされるファイルの拡張子も、選択したフォーマッターに応じて自動的に切り替わります。
| 形式 | 拡張子 | インデックスファイル名 |
|---|---|---|
| HTML | .html | index.html |
| JSON | .json | index.json |
まとめ
Strategyパターンの導入により、エクスポート形式の追加が容易になりました。既存のHTML形式はデフォルトとしてそのまま利用でき、JSON形式が必要な場合は設定を変更するだけで切り替えられます。この変更はFess 15.5.0で利用可能になる予定です。