向nutch中添加自己的field也是比较简单的,和直接调用lucene向索引中添加field基本相同,首先设定添加的field是否要被存储分词索引,然后将field添加到NutchDocument中,其他的工作就nutch会自动完成:
(1)首先要在Indexer的index函数配置执行索引工作前设定添加Field的属性,因为添加的pagetime是用来进行对结果排序使用的,所以它的属性不能被分词需要被索引,设置属性代码改动如下:[html] view plaincopy
/**
* 修改方法:根据爬取深度建立索引,depth就是爬取深度
* @param luceneDir
* @param crawlDb
* @param linkDb
* @param segments
* @param depth
* @throws IOException
*/
public void index(Path luceneDir, Path crawlDb,
Path linkDb, List<Path> segments, int depth)throws IOException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long start = System.currentTimeMillis();
LOG.info("Indexer: starting at " + sdf.format(start));
final JobConf job = new NutchJob(getConf());
job.setJobName("index-lucene " + luceneDir);
IndexerMapReduce.initMRJob(crawlDb, linkDb, segments, job, depth);
FileOutputFormat.setOutputPath(job, luceneDir);
LuceneWriter.addFieldOptions("segment", LuceneWriter.STORE.YES, LuceneWriter.INDEX.NO, job);
LuceneWriter.addFieldOptions("digest", LuceneWriter.STORE.YES, LuceneWriter.INDEX.NO, job);
LuceneWriter.addFieldOptions("boost", LuceneWriter.STORE.YES, LuceneWriter.INDEX.NO, job);
/**
* 设置pagetime的属性值
*/
LuceneWriter.addFieldOptions("pagetime", LuceneWriter.STORE.YES, LuceneWriter.INDEX.UNTOKENIZED, job);
NutchIndexWriterFactory.addClassToConf(job, LuceneWriter.class);
JobClient.runJob(job);
long end = System.currentTimeMillis();
LOG.info("Indexer: finished at " + sdf.format(end) + ", elapsed: " + TimingUtil.elapsedTime(start, end));
}
(2)因为IndexerMapReduce负责将需要索引的数据添加到NutchDocument中,然后由Nutch完成索引建立工作,所以需要在这个地方将我们添加的pageTime属性添加到NutchDocument文档中,代码改动如下:
- /**
- * 先比较dbDatum和fetchDatum中的pageTime的值,选择最大的作为索引值。
- */
- long temp=dbDatum.getPageTime();
- if(temp<fetchDatum.getPageTime()){
- temp=fetchDatum.getPageTime();
- }
- doc.add("pagetime", temp);
long temp=dbDatum.getFetchTime();
if(temp<fetchDatum.getFetchTime()){
temp=fetchDatum.getFetchTime();
}
doc.add("pagetime", temp);
运行程序,在最终的索引文件中,会看到我们添加的Field。