Lucene爬虫(它需要构建lucene索引)

我正在寻找用java编写的Apache Lucene网络爬虫(如果可能或任何其他语言)。 爬虫必须使用lucene并创建一个有效的lucene索引和文档文件,所以这就是为什么nutch被淘汰的原因……

有没有人知道这样的网络爬虫存在,如果答案是肯定的,我可以找到它。 TNX …

你问的是两个组成部分:

  1. 网络爬虫
  2. 基于Lucene的自动索引器

首先是勇气:去过那里,做到了。 从制作自己的角度来看,我将单独处理这两个组件,因为我不相信你可以使用Lucene做你要求的事情,而不会真正理解下面发生了什么。

网络爬虫

因此,您有一个网站/目录,您希望“抓取”以收集特定资源。 假设它是列出目录内容的任何常见Web服务器,使Web爬虫很容易:只需将其指向目录的根目录并定义用于收集实际文件的规则,例如“以.txt结尾”。 非常简单的东西,真的。

实际的实现可能是这样的:使用HttpClient获取实际的网页/目录列表,以您发现最有效的方式解析它们,例如使用XPath从提取的文档中选择所有链接或者仅使用正则表达式解析它Java的Pattern和Matcher类随时可用。 如果您决定使用XPath路由,请考虑使用JDOM进行DOM处理,将Jaxen用于实际的XPath。

获得所需的实际资源(如一堆文本文件)后,您需要确定数据类型,以便能够知道要编制索引的内容以及可以安全忽略的内容。 为简单起见,我假设这些是没有字段或任何内容的纯文本文件,并且不会更深入,但如果你有多个字段要存储,我建议你让你的爬虫生成1..n的带访问器的专用bean 和mutators ( 奖励点:让bean 不可变 ,不允许访问器改变bean的内部状态,为bean创建一个拷贝构造函数 )在另一个组件中使用。

在API调用方面,你应该有类似HttpCrawler#getDocuments(String url) ,它返回一个List以与实际索引器一起使用。

基于Lucene的自动索引器

除了Lucene 的显而易见的东西 ,比如设置一个目录并理解它的线程模型( 任何时候只允许一个写操作,即使索引被更新也可以存在多个读取 ),你当然希望将bean提供给指数。 我已经链接到的五分钟教程基本上就是这样,查看示例addDoc(..)方法,只需用YourBean替换String。

请注意,Lucene IndexWriter确实有一些清理方法,这些方法可以方便地以受控方式执行,例如只有在将一堆文档添加到索引后才调用IndexWriter#commit()有利于提高性能,然后调用IndexWriter#optimize()确保索引不会随着时间的推移而变得非常膨胀也是一个好主意。 始终记得关闭索引以避免抛出不必要的LockObtainFailedException ,就像Java中的所有IO一样,这样的操作当然应该在finally块中完成。

注意事项

  • 你需要记住偶尔使你的Lucene索引的内容过期,否则你永远不会删除任何东西,它会变得臃肿,最终因为它自己的内部复杂性而死亡。
  • 由于线程模型,您很可能需要为索引本身创建单独的读/写抽象层,以确保在任何给定时间只有一个实例可以写入索引。
  • 由于源数据采集是通过HTTP完成的,因此您需要考虑数据validation和可能的错误情况,例如服务器不可用,以避免任何forms的错误索引和客户端挂起。
  • 您需要知道要从索引中搜索的内容才能决定要将其放入其中。 请注意,必须按日期编制索引,以便将日期分为年,月,日,小时,分钟,秒而不是毫秒值,因为从Lucene索引执行范围查询时, [0 to 5]实际上会转换为+0 +1 +2 +3 +4 +5这意味着范围查询很快消失,因为查询子部分的数量最多。

有了这些信息,我相信你可以在不到一天的时间里制作出你自己的特殊Lucene索引器,如果你想要严格测试它,可以使用三个。

看一下solr搜索服务器和nutch (crawler),两者都与lucene项目有关。