上篇文章写到,Nutch采用一个MR对爬取下来的文档进行清洗和封装成一个action列表。
接下来介绍怎么爬取下来的数据如何推送给solr。
----------------------------------------------------华丽的分割线---------------------------------------------
Ntuch自定义了一个 IndexerOutputFormat,这个类继承于FileOutputFormat Override?getRecordWriter方法
代码如下:
?
public class IndexerOutputFormat extends FileOutputFormat<Text, NutchIndexAction> {
?
? @Override
? public RecordWriter<Text, NutchIndexAction> getRecordWriter(FileSystem ignored,
? ? ? JobConf job, String name, Progressable progress) throws IOException {
? ? ? ? ...
? ? ? }
方法里面调用Nutch自定义的一个接口NutchIndexWriter,我们看下他的一个实现类SolrWriter,我们主要看下他的close方法,代码如下:
?public void close() throws IOException {
? ? try {
? ? ? if (!inputDocs.isEmpty()) {
? ? ? ? LOG.info("Indexing " + Integer.toString(inputDocs.size()) + " documents");
? ? ? ? if (numDeletes > 0) {
? ? ? ? ? LOG.info("Deleting " + Integer.toString(numDeletes) + " documents");
? ? ? ? }
? ? ? ? UpdateRequest req = new UpdateRequest();
? ? ? ? req.add(inputDocs);
? ? ? ? req.setParams(params);
? ? ? ? req.process(solr);
? ? ? ? inputDocs.clear();
? ? ? }
? ? ? // solr.commit();
? ? } catch (final SolrServerException e) {
? ? ? throw makeIOException(e);
? ? }
?
在关闭的时候,Nutch会将封装好的数据采用基于http的POST的方法发送一个请求数据包给solr的服务器,solr.commit();这个方法在前面一篇文章中解释有些偏差,solr的整个事务都是在solr服务器端的,这跟以前的的事务有所区别,而这个方法就是再发送一个请求,要求提交当前的事务。
至于之前索引的增删查改也在这个类中实现,如想知道详情,可查看这个类实现。
至此,Nutch的整个index流程基本完成了。
由于时间仓促只是介绍了大概流程,如想了解其中一些细节问题,如有兴趣可以留言。或者发站内信给我。
?
第一次写,欢迎留言批评~~~~
声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。