使用solr构建标签云

亲爱的stackoverflow社区:

鉴于一些文本,我希望在文本中获得前50个最常用的单词,并从中创建一个标签云,从而以图形方式显示文本的主要内容。

文本实际上是一组100左右的评论PER每个ITEM(一张图片)有大约120个项目,我还希望保持云更新 – 通过保持评论索引,并使用云生成代码每次运行新的网络请求出现了。

我决定使用Solr索引文本,现在想知道如何从Solr TermsVectorComponant中获得前50个单词。 以下是术语矢量组件返回的结果示例,在您通过说tv.tf="true"打开术语频率后:

   MA147LL/A  5 3 10 11    3007WFP  5 4   

如你所见,我有两个问题:

  1. 我获得了该文档中的所有条款,不仅仅是前100名
  2. 并且它们没有按频率排序,因此我必须得到术语并将其排序在内存中以执行即时尝试。

有没有更好的办法? (或者)我可以告诉solr termvector组件以某种方式对它进行排序并为我提取100个吗? (或)我可以使用其他一些框架吗? 我需要保留新的评论标记,因此标签云始终是最新的 – 对于云生成器,它需要一个加权单词的字典,并使其成为一个很好的图像。

这个答案没有帮助。

编辑 – 尝试jpountz和paige厨师的答案

这是我为此查询得到的结果:

  select?q=Id:d4439543-afd4-42fb-978a-b72eab0c07f9&facet=true &facet.field=Post_Content&facet.minCount=1&facet.limit=50 1 1 1 1 1 1 1 1 1 1 1 1 1 1 

我有50个这样的元素,@ jpountz感谢帮助限制结果,但为什么单个元素的所有FIFTY都保持值1 ? 我的想法是:数字1表示与我的查询匹配的文档的数量(自我通过Id:Guid查询后,它只能是一个)并且它们不代表Post_Content单词的频率

为了certificate这一点,我从查询中删除了Id:GUID,结果是:

 33 17 16 16 16 15 15 14 14 14 

我的问题是如何在文档中获取术语频率,而不是许多术语的文档频率。 例如,我知道可引导的是一个在Post_content中使用了6次的单词,所以我希望对一组文档进行排序,如(6,“可引导”),(5,“光盘”)。

这篇文章描述了如何设置标签云 – 使用Solr和PHP创建标签云 。 虽然PHP部分可能不适用于您,但我认为标签云的实际生成是……

本文介绍了一种使用空白标记生成器创建文本字段的方法,以返回单个单词,然后对该字段执行构面搜索。 我知道您可以设置方面限制,因此在您的情况下,您只能获得前100个结果。

如果Lucene文档是注释,则可以使用分面来执行此操作。 例如,以下请求http://solr:port/solr/select?q={!lucene}uniqueKey:(MA147LL/A OR 3007WFP)&facet=true&facet.field=includes&facet.minCount=1&facet.limit=50会有所帮助为评论MA147LL/A3007WFP构建标签云。

但是,这种方法会:

  • make Solr为includes字段实例化一个UnInvertedField实例,该实例需要内存,
  • 计算与术语匹配的文档数,而不是此术语的总出现次数。

我想出了一个STOPGAP解决方案:(我为每个solr文档调用一个“post”为例)

Solr中有一个术语组件,其目的似乎是公开任何给定字段的所有索引术语。 它主要用于实现自动完成等function,以及在术语级别运行的其他function。 默认情况下,它按频率排序 – 首先出现的字段中出现的频率更高。

我所做的是创建一个名为content_的动态字段,并根据类别在自己的字段中索引每个post-set。 这意味着将有数百个动态字段实例,每个实例包含一个post-set,我可以使用该字段上的terms组件来获取该postset的TOP TERMS。

如图:

 content_postSetOne : contains indexed version of a set of posts content_postSetTwo : contains indexed version of another set of posts content_postSetThree : contains indexed version of a third set of posts 

这个解决方案对我来说很有用,如果需要,你也可以轻松地为每个Post创建一个字段。 我也有兴趣知道使用这样的动态字段的含义:这会是一个问题吗?

这与Paige和jPountz的答案有何不同:

  1. 术语频率是“A”或“A文档集”中的单词计数,而不是包含该术语的文档数。
  2. 我可以从一个文档中获取最常出现的术语,如果需要也可以从一组文档中获得。
  3. 我没有使用刻面,因为它主要根据文档数量给出频率,而不是根据文档出现的次数而不管哪个文档。