首页 > 解决方案 > 当旧的 Nutch crawldb 丢失时,如何从 Solr 中删除丢失的页面?

问题描述

假设我运行 Apache Nutch 来抓取网站,并将文档添加到 Apache Solr 核心。假设我现在删除了包含 crawldb 的 Apache Nutch 目录。如果在此期间网站上的某些页面已被删除,而我现在运行新的爬网(使用新的 crawldb),则丢失的页面仍将被 Solr 索引。

通常,在旧的 crawldb 存在的情况下,Nutch 将尝试从之前的爬虫中获取它所知道的所有页面,并且对于给出 404 的页面,它会指示 Solr 从其索引中删除它们。然而,在我的例子中,我已经删除了旧的 crawldb,所以 Nutch 将从头开始爬行,它不会知道以前可用的页面现在给出 404。

如果旧的 Nutch crawldb 已被删除(意外或其他原因),那么让 Nutch 删除 Solr 中的条目的适当方法是什么?换句话说,如何删除 Solr 中不在 Nutch crawldb 中的文档?

启动新的 Solr 核心并删除旧的 Solr 核心是唯一可用的选项吗?

标签: solrnutch

解决方案


在这种情况下,新创建的 crawldb 只会触发一次索引更新,因为 Nutch 无法指示 Solr 处理具有特定 ID 的删除查询(没有关于已删除文档的信息)。

重新索引通常意味着删除索引而不是核心除非您跟踪每个文档状态,例如,在这种情况下可以检索|排除已删除的文档):deleted:<0|1>

/solr/<core>/update?stream.body=<delete><query>*:*</query></delete>&commit=true

但可能还有另一种方法,使用一个小脚本:

  • 查询 Solr 以检索所有文档(包括要删除的文档)。使用fl参数获取每个文档的 url。
  • 在循环中:根据每个文档 url,手动获取文档指向的网页。
  • 根据每个请求的响应状态码(如果不是ok..),标记对应的文档要删除。
  • 使用收集到的 docId,使用 operator 准备一个 delete-by-query 语句OR

    <delete><query>id:(123 OR 456 OR 789) </query></delete>
    

推荐阅读