星云外

测试nutch-1.0的IndexWriter

        public static void main(String[] args) throws IOException{
                String indexPath = "F:\\nutch\\test1";
               
                LuceneWriter writer = new LuceneWriter();
               
                Configuration conf  = NutchConfiguration.create();
                JobConf job = new NutchJob(conf);               
                FileOutputFormat.setOutputPath(job, new Path(indexPath));
               
               LuceneWriter.addFieldOptions("query", LuceneWriter.STORE.YES, LuceneWriter.INDEX.UNTOKENIZED, job);
               LuceneWriter.addFieldOptions("ch", LuceneWriter.STORE.YES, LuceneWriter.INDEX.UNTOKENIZED, job);
               
                writer.open(job, indexPath);               
            
              NutchDocument doc = new NutchDocument();
              doc.add("query", "mm");
             doc.add("ch", "美女");          
             doc.setScore(1.0f);
            
             writer.write(doc);              
            writer.close();          
        }
   
解释以下几点:
1.  Nutch为什么不直接使用Lucene的Document,而自己定义一个NutchDocument?
    在hadoop中,从mapper传递到reducer阶段的数据结构,都必须implements Writable, 而Lucene的Document定义为:public final classDocument implements java.io.Serializable,它未实现Writable接口,但又是final的,不允许再被继承等。

 

2.  为什么要定义LuceneWriter,不直接使用Lucene的IndexWriter?
    应该是为了维护代码的可读性,把所有对Nutch的NutchDocument的操作与转换等都放到这里,包括filed的解析,analyzer的实现,Lucene的IndexWriter的各个参数设置等。

3.  doc.setScore(1.0f),score必须设定么?
    NutchDocument的构造中, 默认score =0.0f,setScore之后会覆盖default值,在转换为Lucene的Document时,会将这个值赋值给Document:out.setBoost(doc.getScore());如果不设置的话,最后索引中的document的boost都为0.0,是搜索不到结果的。

4.  最后生成的Index怎么不是3个文件,即使是optimize了?
    在LuceneWriter中对writer的参数设置时,调用了writer.setUseCompoundFile(false),所以生产的索引并没有把segment merge到一起。

5.  field的value只能是String类型的?
   恐怕是这样了,NutchDocument中使用List<String>来存储field的Value,所以限定了value只能是String类型的。如果需要其他类型的,可以修改下NutchDocument类,将List<String>修改为List<Object>,再修改相应的readFields(DataInput in)及write(DataOutputout);
    不过这里是可以存储field对应的多个value的,类似:

     document.add(new Field("query","str1", Store.Yes, Index.No));
     document.add(new Field("query","str2", Store.Yes,Index.No));

    但是NutchDocument只提供了add(String name, Stringvalue)这个一个接口,可以用循环调用的方式(效率有点低的),但其实可以修改下NutchDocument,添加一个add(Stringname, String[] value)这样的方法。

posted on 2010-04-05 22:01  星云外  阅读(349)  评论(0)    收藏  举报