根据您的问题:
Number of Documents = 110000
Dictionary => List of [TermID, Title Terms] = 40million entries
Size of documents = 11000 * 1KB per document on an average = 26.9GB
(1KB per document on an average)
Size of dictionary = 40million * 256bytes = 9.5GB of raw data
(256bytes per entry on an average)
您是如何得出 75 天估算的?
有许多性能目标:
- 您如何存储文档?
- 您如何存储/检索字典?(假设不是全部都在内存中,除非你负担得起)
- 你在多少台机器上运行它?
- 您是否并行执行字典查找?(当然,一旦你已经处理了整个维基百科,假设字典是不可变的)
以下是我认为您正在做的事情的大纲:
dictionary = read wikipedia dictionary
document = a sequence of documents
documents.map { doc =>
var docTermFreq = Map[String, Int]()
for(term <- doc.terms.map if(dictionary.contains(term)) ) {
docTermFreq = docTermFreq + (term -> docTermFreq.getOrElse(term, 0) + 1)
}
// store docTermFreq map
}
这实际上是将每个文档分解为标记,然后在维基百科词典中查找其标记的存在。
这正是Lucene Analyzer所做的。
Lucene Tokenizer会将文档转换为令牌。这发生在术语被索引到 lucene 之前。所以你所要做的就是实现一个分析器,它可以查找维基百科词典,以确定一个标记是否在词典中。
我会这样做:
- 获取每个文档并准备一个令牌流(使用上述分析器)
- 索引文档术语。
- 此时,您将在 Lucene 索引中只有 wikipedia 术语。
执行此操作时,您将从 Lucene Index 获得现成的统计信息,例如:
您可以做很多事情来提高性能。例如:
我希望这会有所帮助。