精华帖 (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了。但是如果大量的情况下,就会出现性能问题了。各位有何高招? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-12-28
我觉得可以用全文检索来解决,在做索引的时候把博客的tag这个field的term_vector保存下来。搜索的时候,可以从全文检索里面获取某个tag在整个全文索引里面出现的次数,已经在哪些document里面出现过。
|
|
返回顶楼 | |
发表时间:2007-12-28
tag使用频率,应该周期性的生成统计结果存储。
|
|
返回顶楼 | |
发表时间:2007-12-28
放一个count字段让rails去维护
|
|
返回顶楼 | |
发表时间:2007-12-28
这个应该用sql就能做出来吧 表嵌套
就是不知道大数据量的性能会怎么样 |
|
返回顶楼 | |
发表时间: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在原文中的位置 |
|
返回顶楼 | |
发表时间:2008-01-07
楼上说的filter方案也解决不了问题,因为每次查询结果相关的tag是变化的。之前我也做过类似的应用,也是因为性能的问题终止了。
|
|
返回顶楼 | |
发表时间:2008-01-10
第一种方法, 上层一些,比较简单,但是效率差些
第一步: 在做索引的时候就计算好Tag个数, 添加一个字段tagCount,保存为Indexed和Stored属性 第二步:如果用的是Nutch的前端,则直接有参数支持按照tagCount排序, 如果是自己写的前段, 则自己把返回结果按照tagCount排序就行了 第二种方法,依然还是需要在做索引的时候就计算好Tag个数, 添加一个字段tagCount,但是把排序在 HitCollector接口实现里做掉, 效率比第一种高不少,但是写起来麻烦些。 |
|
返回顶楼 | |
发表时间:2008-01-11
楼上还没有理解,
这个问题难就难在,需要统计当前查询相关结果中出现的tag及出现的次数。 |
|
返回顶楼 | |
发表时间:2008-01-13
赞同robbin的方案,这类应用一般都是需要承受非常大的访问量,在查询列表时(非detail),走搜索引擎是最完美的。
增量build索引(根据修改时间)可以解决,blog数据更新的问题。 例子:商务网站 http://list.taobao.com/browse/search_auction.htm?cat=1101。每个属性都是商品的一个标签。 |
|
返回顶楼 | |