从Java和Lucene中的RSS提要处理大量字符串的最佳实践

时间:2010-12-05 20:48:34

标签: java string rss lucene

我有一种情况,我有一个每小时的批处理作业,必须解析大量的RSS提要,并从每个项目的每个项目中提取标题和描述元素的文本,到字符串,然后计算他们的单词频率作者:Lucene

但是,不知道每个Feed有多少Feed或项目,每个字符串可能包含数千个单词。

我想我看的基本伪代码是这样的:

for each feed
   for each item within date/time window
      get text from title element, concatenate it to title_string
      get text from description element, 
          concatenate it to description_string
          calculate top x keywords from title_string  

for each keyword y in x
   calculate frequency of keyword y in description_string

有人可以建议如何处理这些数据以减少内存使用量吗?这与使用StringBuilders不同,因为从每个Feed读取数据。

虽然Feed的内容将存储在数据库中,但我想在运行时计算单词频率,以避免每个Feed都有自己的数据库表所需的所有IO。

1 个答案:

答案 0 :(得分:1)

首先,如果您已经拥有Lucene,我不明白为什么要将文本存储在数据库中。 Lucene是一种类型的数据库,索引建立在单词上,而不是记录ID,这是文本文档的唯一区别。例如,您可以将Feed中的每个项目存储为单独的文档,其中包含“title”,“description”等字段。如果您需要存储有关Feed本身的信息,请为Feed创建另一种类型的文档,生成id并将其放置此ID作为所有Feed项的参考。

如果你这样做,你可以在一个恒定的时间内计算词频(好吧,不是真正的恒定时间,而是大致恒定)。是的,它会导致IO,但使用数据库保存文本也会这样做。并且读取字频率信息非常快:Lucene使用称为倒置索引的数据结构,即存储word -> vector of < doc_number/frequency > pairs的映射。在搜索时,Lucene本身并不读取文档,而是读取索引并检索这样的地图 - 这个很小,可以很快读取。

如果在Lucene索引中存储文本不是一个选项而您只需要有关字频的信息,请使用内存索引分析每个单独的一批Feed,在某处保存频率信息并擦除索引。此外,在向文档添加字段时,将store参数设置为Field.Store.NO以仅存储频率信息,但不存储字段本身。

相关问题