Fessのクローラーで、同一ページ内のアンカータグから抽出されるURLに重複が含まれる問題を修正しました。
問題
FessXpathTransformerのgetAnchorListメソッドでは、HTMLページ内の<a>、<img>、<link>などのタグからURLを抽出してクロール対象のリストを作成します。しかし、同じURLが複数のタグに記述されている場合、重複したURLがそのままリストに追加されていました。これにより、クローラーが同じURLを複数回処理する無駄が発生していました。
修正内容
URLの収集に使用するコレクションをArrayListからLinkedHashSetに変更しました。
// 変更前
final List<String> urlList = new ArrayList<>(anchorList.size());
for (final RequestData requestData : anchorList) {
urlList.add(requestData.getUrl());
}
return urlList;
// 変更後
final Set<String> urlSet = new LinkedHashSet<>(anchorList.size());
for (final RequestData requestData : anchorList) {
urlSet.add(requestData.getUrl());
}
return new ArrayList<>(urlSet);
LinkedHashSetを使用することで、重複を排除しつつ、最初に出現した順序を維持します。戻り値はListのままなので、既存のインターフェースとの互換性も保たれています。
テスト
重複排除の動作を検証するため、7つのユニットテストを追加しました。
- 重複なしのケース(ベースライン)
- 同じタグ種別(
<a>)からの重複 - 異なるタグ種別(
<a>、<img>、<link>)からの重複 - 挿入順序の維持
- リンクなしの空ドキュメント
- すべてが同一URLのケース
<link>タグとの重複
PRの詳細はこちらを参照してください。