我正在使用Nutch抓取一些网站,我正在抓取this site。
我找到了these five segments所有找到的文件(约10,000份文件)。现在我想使用readseg
命令处理文档而不是的内容,这不是将段转储为纯文本。
为此,只有每个细分的子目录content
对我有用(标签和文档的内容)。
我已经意识到在content
目录中还有两个容器:data
和index
。但是我没有找到任何解释,我怎么能读它们来处理里面的内容。我也在这个问题上找到了一些pointers,但我还没有理解算法的想法。
如何将内容存储在Nutch细分中,以及如何阅读?如果想要给出一个简短的例子(但不是必要的话),我已经给出了收集网站和细分。
答案 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();
}
}
}