【问题标题】:How to remove missing pages from Solr when old Nutch crawldb is missing?当旧的 Nutch crawldb 丢失时,如何从 Solr 中删除丢失的页面?
【发布时间】:2019-08-02 05:47:16
【问题描述】:

假设我运行 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 核心是唯一可用的选项吗?

【问题讨论】:

    标签: solr nutch


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 思路:查询Solr获取所有URL,同时获取Nutch crawldb中的所有URL。然后,从 Solr 中删除 Solr 中存在但 Nutch crawldb 中不存在的 URL。这可行吗?我是 Solr 的新手。
    • 是的,在这种情况下,脚本中的第一步和最后一步应该保持不变,从 Solr 的角度来看,它不会改变任何东西。您无需尝试从(旧)收集的 url 中获取网页,而是从 new crawldb 构建一个 映射,然后将此集合与索引中剩余的内容进行比较,应该删除仅存在于索引中的 docId。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多