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

在Java和Lucene中处理RSS提要中大量字符串的最佳实践,java,string,rss,lucene,Java,String,Rss,Lucene,我有一种情况,我每小时都有一个批处理工作,它必须解析大量的RSS提要,并从每个提要的每个条目中提取标题和描述元素的文本,然后将它们提取为字符串,然后由Lucene计算词频 但是,由于不知道每个提要有多少提要或条目,每个字符串可能包含数千个单词 我想我看到的基本伪代码是这样的: for each feed for each item within date/time window get text from title element, concatenate it to tit

我有一种情况,我每小时都有一个批处理工作,它必须解析大量的RSS提要,并从每个提要的每个条目中提取标题和描述元素的文本,然后将它们提取为字符串,然后由Lucene计算词频

但是,由于不知道每个提要有多少提要或条目,每个字符串可能包含数千个单词

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

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
有人能建议如何处理这些数据以减少内存使用吗?这与从每个提要读取数据时使用StringBuilder不同


虽然feed的内容将存储在数据库中,但我想计算单词频率“动态”,以避免在每个feed都有自己的数据库表的情况下出现所有必要的IO。

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

如果你这样做,你可以在一个恒定的时间内计算词频(好吧,不是真正的恒定时间,而是近似恒定的)。是的,这会导致IO,但使用数据库保存文本也会这样做。而且读取词频信息的速度非常快:Lucene使用数据结构,称为反向索引,即存储
单词->向量对的映射。在搜索时,Lucene不读取文档本身,而是读取索引并检索这样的映射-这足够小,可以非常快速地读取


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

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

如果你这样做,你可以在一个恒定的时间内计算词频(好吧,不是真正的恒定时间,而是近似恒定的)。是的,这会导致IO,但使用数据库保存文本也会这样做。而且读取词频信息的速度非常快:Lucene使用数据结构,称为反向索引,即存储
单词->向量对的映射。在搜索时,Lucene不读取文档本身,而是读取索引并检索这样的映射-这足够小,可以非常快速地读取


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

谢谢。但是,将提要中的数据存储在Lucene中目前不是一个选项,因为业务要求这些数据可以从数据库中获得。因此,Lucene将只用于计算频率。在这种情况下,您可以使用磁盘存储,但不要像我在回答内存存储时所描述的那样保存全文。您可以访问提要的所有统计信息,同时将全文存储在数据库中,即符合您的业务需求。我目前计划让Lucene使用内存索引计算标题和描述字符串中文本的频率,并将其存储在哈希映射中。然后使用标题hashmap中最流行的x个关键字,从描述hashmap中获取它们的频率,并将其用作每个关键字的频率。在此阶段,每个提要的实际数据都已存在于数据库中。但使用Lucene存储频率仍然是一种选择,因为其他要求将在稍后解决。谢谢你的建议。但是,将提要中的数据存储在Lucene中目前不是一个选项,因为业务要求这些数据可以从数据库中获得。因此,Lucene将只用于计算频率。在这种情况下,您可以使用磁盘存储,但不要像我在回答内存存储时所描述的那样保存全文。您可以访问提要的所有统计信息,同时将全文存储在数据库中,即符合您的业务需求。我目前计划让Lucene使用内存索引计算标题和描述字符串中文本的频率,并将其存储在哈希映射中。然后使用标题hashmap中最流行的x个关键字,从描述hashmap中获取它们的频率,并将其用作每个关键字的频率。在此阶段,每个提要的实际数据都已存在于数据库中。但使用Lucene存储频率仍然是一种选择,因为其他要求将在稍后解决。谢谢你的建议。