`
duanjiangong
  • 浏览: 61471 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用lucene做分类统计

阅读更多

现在好多网站需要在搜索结果上进行分类统计,比如招聘网站需要统计出某一关键词下的满足本科的有多少岗位、满足专科的有多少岗位、满足4000-6000薪资的多少岗位等等,这就需要对搜索结果进行分类统计了。但现在一直没有发现有人在lucene上很好的实现这个功能,呵呵,可能是大牛们没有时间研究这个吧。

我在分析了Lucene的源码的基础上开发出了这个功能,因牵扯到公司机密无法透露具体代码,但可以给大家共享一下原理和思路,供大家参加,也许还有更好的方法实现。

思路:我们可以参照lucene里面的排序原理来对lucene的源码进行重构,我们都知道lucene是可以按照不同的字段进行排序的,排序用的字段从哪里来呢?如果我们可以访问到排序的字段是否就可以访问到分类统计的字段呢。访问到分类统计的字段,剩下的工作的就很简单了对吧。大家可以看看Lucene的TopDocCollector类源码,然后再自己实现HitCollector这个抽象类就可以啦,不知道说明白了吗?希望对大家有帮助。

1
0
分享到:
评论
10 楼 xu101q 2011-10-17  
还是不懂啊~~~~ LZ 能否 在清楚一点呢 我用的是3.2的版本
9 楼 oyd 2011-03-22  
FieldCache.DEFAULT.getInts(reader, fieldname);
就这样一句
8 楼 stta04 2010-07-02  
duanjiangong 写道
看来大家还是没有认真阅读啊,看看lucene在排序的时候它是如何得到排序字段的值的。我们来效仿一下,不就解决了吗?

今天仔细去调试了一下源代码,还真的发现这个好东西,以前采用reader取出Document真的是太慢了。非常感谢你的提示。
7 楼 duanjiangong 2009-12-25  
看来大家还是没有认真阅读啊,看看lucene在排序的时候它是如何得到排序字段的值的。我们来效仿一下,不就解决了吗?
6 楼 ybzshizds 2009-12-24  
研究了半天,今天偶然发现了个新东西,bobo-browser(bobo-browse 是一用java写的lucene扩展组件,通过它可以很方便在lucene上实现分组统计功能),然后测试了一下(200W条索引数据),分组查询速度在150ms,基本和不分组时候的查询速度差不多。
5 楼 ybzshizds 2009-12-24  
引用
读取Document这个是不太现实,建议阅读TopDocCollector这个类的源码!

   private ArrayList<int,int> category_count;
   category_count=new ArrayList<String,int>();
  public void Collect(int doc,float score){
   if(score>0.0f){
      Documentd=reader.Document(doc); //这一步是比较耗时的
      String category = d.get("category");
      if(category_count.ContainsKey(category))
        category_count[category]++;
      else
        category_count.add(category,1);
        totalHits++;
        if(hq.Size()<numHits||score>=minScore){
          hq.Insert(newScoreDoc(doc,score));
          minScore=((ScoreDoc)hq.Top()).score;//maintainminScore
        }
      }
  }

lucene查询的时候,在取返回具体document之前,排序,过滤都只是对docId进行操作,一旦涉及到要访问document的具体内容,就很费时间了。分类统计,不通过取document再作相应的操作,那怎么办呢。希望高人提醒。
      
4 楼 ybzshizds 2009-12-24  
大家看看这篇文章吧,已经说的很清楚了,只不过是.net版的lucene,java版的应该是一样的原理。http://www.cnblogs.com/birdshover/archive/2009/01/09/1372906.html
3 楼 ybzshizds 2009-12-23  
根据这个就能得到分类统计的字段吗?
FieldCacheImpl.Entry entry = (factory != null)
      ? new FieldCacheImpl.Entry (field, factory)
      : new FieldCacheImpl.Entry (field, type, locale);
请指教!
2 楼 duanjiangong 2009-10-09  
读取Document这个是不太现实,建议阅读TopDocCollector这个类的源码!
1 楼 stta04 2009-09-30  
我也是这样做的,可发现性能是很大一个问题。不知你在这个HitCollector实现类里是如何做的?我是通过reader取出Document,然后再做取出分类的那个字段的值来做统计

相关推荐

Global site tag (gtag.js) - Google Analytics