Fessクローラーのアンカー URL重複排除

Fessのクローラーで、同一ページ内のアンカータグから抽出されるURLに重複が含まれる問題を修正しました。

問題

FessXpathTransformergetAnchorListメソッドでは、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の詳細はこちらを参照してください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です