如何在没有readseg命令的情况下读取Nutch段

时间:2016-11-23 23:21:03

标签: java web-crawler nutch

我正在使用Nutch抓取一些网站,我正在抓取this site

我找到了these five segments所有找到的文件(约10,000份文件)。现在我想使用readseg命令处理文档而不是的内容,这不是将段转储为纯文本。

为此,只有每个细分的子目录content对我有用(标签和文档的内容)。

我已经意识到在content目录中还有两个容器:dataindex。但是我没有找到任何解释,我怎么能读它们来处理里面的内容。我也在这个问题上找到了一些pointers,但我还没有理解算法的想法。

如何将内容存储在Nutch细分中,以及如何阅读?如果想要给出一个简短的例子(但不是必要的话),我已经给出了收集网站和细分。

3 个答案:

答案 0 :(得分:1)

您需要对内容做什么?你可以编写一个自定义的IndexWriter。它将在索引步骤中调用,并允许您访问内容。或者看看'转储'命令(org.apache.nutch.tools.FileDumper)并修改代码。

BTW' Hadoop the Definitive Guide'作者:Tom White对Nutch数据结构有一个很好的章节。

如果您想对页面进行进一步处理,例如NLP或分类,Behemoth可用于将Nutch段转换为“中性”和“中性”。 HDFS上的数据结构,然后可以使用各种工具进行处理。

答案 1 :(得分:0)

根据@JulienNioche的回复,这是我的实施。

IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(index)));
IndexSearcher searcher = new IndexSearcher(reader);
Analyzer analyzer = new StandardAnalyzer();

BufferedReader in = null;
in = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8));

QueryParser parser1 = new QueryParser("A", analyzer);// i have 5 different QueryParser
Query qPersonen = parser1.parse("searchstring"); // i have also 5 Queries
booleanQuery.add(qPersonen, BooleanClause.Occur.MUST);

TotalHitCountCollector collector = new TotalHitCountCollector();
TopDocs results = searcher.search(booleanQuery.build(), 100);

ScoreDoc[] hits = results.scoreDocs;
int numTotalHits = results.totalHits;
System.out.println("Results: " + numTotalHits);

答案 2 :(得分:0)

我知道这是一个旧的 Q,但我在试图找到相同 Q 的答案时偶然发现了它。我搜索了一些答案,想出了这个简单的 java 循环来获取片段内容。关键类是读取索引和数据文件的 org.apache.hadoop.io.MapFile.Reader。免责声明我是 nutch 和 hadoop 的新手,但这对我有用。

private void readContent(Path[] segmentPaths) throws Exception {
    
    String[] fileTypes = {"content", "crawl_fetch", "parse_data", "parse_text"};
    String partR = "part-r-00000";
    
    for (Path path : segmentPaths) {
        for (String type : fileTypes) {
            Path file = new Path(path, type + "/" + partR);
            MapFile.Reader reader = new MapFile.Reader(file, conf);
            
            WritableComparable key = (WritableComparable) ReflectionUtils.newInstance(reader.getKeyClass(), conf);
            Writable value = (Writable) ReflectionUtils.newInstance(reader.getValueClass(), conf);
            while (reader.next(key, value)) {
                System.out.printf("%s\t%s\n", key, value);
            }
            reader.close();
        }
        
    }
}