论坛首页 Java企业应用论坛

如何在动态搜索得到大量的博客记录后,再针对它们各自的Tag进行数量统计?

浏览 6843 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-12-28  
场景:
一个博客网站,有N多的博客信息,这些信息都会被标上不同的Tag
我输入搜索某个关键字来查找我需要的博客为M条,在这个M条里各条的Tag又是不一样的。

这样在搜索结果中需要统计出每一个Tag的数量出来进行显示

比如:根据xxx关键字后搜索到的结果为以下3条,假如:Tag以空格隔离存储,split后为独立的Tag
1:Seam框架使用开发指南   对应的Tag为:Java Seam Framwork 开发
2:Spring框架最佳实践     对应的Tag为:Java Spring 最佳实践
3:Hibernate技术点对点    对应的Tag为:Java Hibernate 点对点

于是显示的结果为

Tag:
Java(3)、Seam(1)、Framework(1)、开发(1)、Spring(1)、最佳实践(1)、Hibernate(1)、点对点(1)

结果:
1:Seam框架使用开发指南
2:Spring框架最佳实践
3:Hibernate技术点对点

如果说在查询到数量不多的情况下,遍历所有的记录后,把Tag进行split后统计加和就OK了。但是如果大量的情况下,就会出现性能问题了。各位有何高招?
   发表时间:2007-12-28  
我觉得可以用全文检索来解决,在做索引的时候把博客的tag这个field的term_vector保存下来。搜索的时候,可以从全文检索里面获取某个tag在整个全文索引里面出现的次数,已经在哪些document里面出现过。
0 请登录后投票
   发表时间:2007-12-28  
tag使用频率,应该周期性的生成统计结果存储。
0 请登录后投票
   发表时间:2007-12-28  
放一个count字段让rails去维护
0 请登录后投票
   发表时间:2007-12-28  
这个应该用sql就能做出来吧  表嵌套
就是不知道大数据量的性能会怎么样
0 请登录后投票
   发表时间:2007-12-28  
其实这里关键的难点在于你不知道搜索结果中的Tag有多少,如果你想知道,那等于要遍历所有Document来统计Tag。如果Tag相对每次搜索固定,那lucene就能很好的解决啦,用一个Filter来做统计。代码就像下面这种
Filter filter = new Filter(userQuery);
Hits allHits = searcher.search(userQuery);
Hits tag1Hits = searcher.search(tag1Query,filter);
......

这个速度 那是很快的啦。
robbin说的TermVector不是那个意思吧,应该是Term在原文中的位置
0 请登录后投票
   发表时间:2008-01-07  
楼上说的filter方案也解决不了问题,因为每次查询结果相关的tag是变化的。之前我也做过类似的应用,也是因为性能的问题终止了。
0 请登录后投票
   发表时间:2008-01-10  
第一种方法, 上层一些,比较简单,但是效率差些

第一步: 在做索引的时候就计算好Tag个数, 添加一个字段tagCount,保存为Indexed和Stored属性

第二步:如果用的是Nutch的前端,则直接有参数支持按照tagCount排序, 如果是自己写的前段, 则自己把返回结果按照tagCount排序就行了


第二种方法,依然还是需要在做索引的时候就计算好Tag个数, 添加一个字段tagCount,但是把排序在 HitCollector接口实现里做掉, 效率比第一种高不少,但是写起来麻烦些。



0 请登录后投票
   发表时间:2008-01-11  
楼上还没有理解,

这个问题难就难在,需要统计当前查询相关结果中出现的tag及出现的次数。
0 请登录后投票
   发表时间:2008-01-13  
赞同robbin的方案,这类应用一般都是需要承受非常大的访问量,在查询列表时(非detail),走搜索引擎是最完美的。

增量build索引(根据修改时间)可以解决,blog数据更新的问题。

例子:商务网站 http://list.taobao.com/browse/search_auction.htm?cat=1101。每个属性都是商品的一个标签。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics