- 浏览: 1064729 次
- 性别:
- 来自: 长沙
文章分类
- 全部博客 (639)
- 服务器配置篇 (58)
- hibernate篇 (14)
- spring篇 (33)
- struts篇 (28)
- JS篇 (46)
- 其他技术篇 (46)
- 数据库集群配置 (6)
- JAVA基础相关 (48)
- 分布式框架HadHoop的应用 (2)
- FLEX篇 (8)
- SQLSERVER技术 (32)
- Android学习 (13)
- amchart学习笔记 (1)
- openfire+smark搭建即时通讯 (9)
- Linux学习 (18)
- Oracle数据库 (15)
- 网站优化技术 (12)
- mysql数据库 (2)
- 项目学习总结 (18)
- 工具类(JAVA) (12)
- 工具类(JS) (2)
- 设计模式 (10)
- Lucene学习 (24)
- EJB3学习 (6)
- Sphinx搜索引擎 (3)
- 工作中用到的软件小工具 (5)
- .NET (49)
- JAVA 连接SQLSERVER2008步骤 (1)
- MongoDB (19)
- Android手机开发 (3)
- Maven (6)
- vue (9)
- Shiro (4)
- mybatis (3)
- netty框架 (1)
- SpringCloud (3)
- spring-cloud (7)
- Git (1)
- dubbo (2)
- springboot (13)
- rocketmq (1)
- git学习 (2)
- kafka服务器 (2)
- linux (10)
- WEB系统辅助项目 (1)
- jenkins (2)
- docker (4)
- influxdb (3)
- python (2)
- nginx (1)
最新评论
-
jiangfuofu555:
这样数据量大,效率怎么样?
sqlserver 实现分页的前台代码 以及后台的sqlserver语句 -
w156445045:
博主请问下,如何做到实时的刷新呢,
另外我后台是Java 谢谢 ...
web 版本的汽车仪表盘,非常好看。还有各种图形 -
jackyin5918:
<transportConnector name=&qu ...
ActiveMQ的activemq.xml详细配置讲解 -
握着橄榄枝的人:
你这个不是spring1.x的吧
spring1.x使用AOP实例 -
xiaophai:
全乱套了!
openfire+spark搭建完美的及时通讯
bobo-browse 是一款用java写的lucene扩展组件,通过它直接使用lucene建立的索引文件,就可以很方便的在lucene上实现分组统计功能。虽然lucene的使用已经很广泛,稳定性和效率方面都得到了大家的认可,但是在对搜索结果进行分组统计时就有些无能为力了。这样致使不少有需求的项目中,不得不修改lucene的源代码来实现分组统计的功能,要修改lucene源码首先必须对lucene的TopDocCollector类和排序原理有很深的理解,而且还要考虑多线程和性能的问题,如果你的项目中用到了compass,那还得修改compass的源代码,另外给后续的升级还会带来很多麻烦。 bobo-browse为了填补lucene在分组统计功能上的空缺,由此而诞生。早期的bobo-browse开源项目放在sourceforge上,后来被搬到google code上。目前项目地址为http://code.google.com/p/bobo-browse/
下载安装
Get the source:
svn co https://bobo-browse.googlecode.com/svn/trunk bobo-trunk
Assuming checked out to ~/bobo-trunk: Build: Builds jars:
* cd ~/bobo-trunk * ant
Run cardemo app:
* In ~/bobo-trunk, do ant run-cardemo * cardemo should be deployed at: http://localhost:8888/cars/
cars.war is generated under cardemo/ Build Javadocs
* In ~/bobo-trunk, do ant javadoc * javadocs are generated under doc/
cardemo运行起来的效果(该例子中还用到了springMVC, springIOC,ajax技术DWR,总的索引数据是1.5W条)
测试代码:
package com.jobcn.test; import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.Map; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.index.IndexReader; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.Query; import org.apache.lucene.search.SortField; import org.apache.lucene.store.FSDirectory; import com.browseengine.bobo.api.BoboBrowser; import com.browseengine.bobo.api.BoboIndexReader; import com.browseengine.bobo.api.Browsable; import com.browseengine.bobo.api.BrowseFacet; import com.browseengine.bobo.api.BrowseHit; import com.browseengine.bobo.api.BrowseRequest; import com.browseengine.bobo.api.BrowseResult; import com.browseengine.bobo.api.FacetAccessible; import com.browseengine.bobo.api.FacetSpec; import com.browseengine.bobo.api.FacetSpec.FacetSortSpec; import com.browseengine.bobo.facets.FacetHandler; import com.browseengine.bobo.facets.impl.SimpleFacetHandler; public class TestSearchPosByLucene { private static FSDirectory fsd; static { String indexDir = "/use/lucene/target/index/compos_0"; try { if(fsd == null){ fsd = FSDirectory.getDirectory(indexDir); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void test(String keyWord) throws Exception{ // reqworkyear facet handler SimpleFacetHandler reqworkyearHandler = new SimpleFacetHandler("reqworkyear"); // reqdegreeid facet handler SimpleFacetHandler reqdegreeidHandler = new SimpleFacetHandler("reqdegreeid"); List<FacetHandler> handlerList = Arrays.asList(new FacetHandler[]{reqworkyearHandler, reqdegreeidHandler}); IndexReader reader = IndexReader.open(fsd,true); // decorate it with a bobo index reader BoboIndexReader boboReader = BoboIndexReader.getInstance(reader,handlerList); // creating a browse request BrowseRequest br=new BrowseRequest(); br.setCount(5); br.setOffset(0); br.setFetchStoredFields(true); // parse a query QueryParser parser = new QueryParser("alltext",new StandardAnalyzer()); Query q=parser.parse(keyWord); br.setQuery(q); SortField[] sortFields = new SortField[2]; //按学历+发布日期排序 sortFields[0] = new SortField("reqdegreeid", SortField.INT, true); sortFields[1] = new SortField("postdate", SortField.STRING, true); br.setSort(sortFields); // add the facet output specs FacetSpec reqworkyearSpec = new FacetSpec(); reqworkyearSpec.setOrderBy(FacetSortSpec.OrderHitsDesc); FacetSpec reqdegreeidSpec = new FacetSpec(); reqdegreeidSpec.setMinHitCount(2); reqdegreeidSpec.setOrderBy(FacetSortSpec.OrderHitsDesc); br.setFacetSpec("reqworkyear",reqworkyearSpec); br.setFacetSpec("reqdegreeid",reqdegreeidSpec); long startTime = System.currentTimeMillis(); // perform browse Browsable browser=new BoboBrowser(boboReader); BrowseResult result=browser.browse(br); int totalHits = result.getNumHits(); System.out.println("公司发布的职位信息中含有‘"+keyWord+"’关键字的职位总数:" + totalHits); System.out.println("打印前"+ br.getCount() +"个职位Id:"); BrowseHit[] hits = result.getHits(); for(BrowseHit hit : hits){ System.out.println(hit.getStoredFields().get("$/compos/Id")); } Map<String,FacetAccessible> facetMap = result.getFacetMap(); FacetAccessible colorFacets = facetMap.get("reqdegreeid"); List<BrowseFacet> facetVals = colorFacets.getFacets(); System.out.println("学历统计:"); for(BrowseFacet facetVal : facetVals){ System.out.println(facetVal.getValue() +"--->"+ facetVal.getHitCount() ); } FacetAccessible colorFacets2 = facetMap.get("reqworkyear"); List<BrowseFacet> facetVals2 = colorFacets2.getFacets(); System.out.println("工作经验统计:"); for(BrowseFacet facetVal : facetVals2){ System.out.println(facetVal.getValue() +"--->"+ facetVal.getHitCount() ); } long endTime = System.currentTimeMillis(); System.out.println("总共用时:"+(endTime - startTime) + " ms"); } public static void main(String args[]) throws Exception{ TestSearchPosByLucene t = new TestSearchPosByLucene(); t.test("软件工程师"); t.test("销售"); t.test("文员"); t.test("程序员"); t.test("机械"); t.test("品质"); t.test("采购"); t.test("网络"); } }
测试结果(测试数据为464667条索引数据)
公司发布的职位信息中含有‘软件工程师’关键字的职位总数:4411
打印前5个职位Id:
146985307
1614164
147057728
146493293
146883100
学历统计:
50--->2850
40--->922
0--->541
60--->64
30--->20
20--->13
工作经验统计:
002--->1377
001--->967
003--->904
000--->894
005--->131
-100--->99
-001--->13
004--->12
008--->8
010--->3
006--->2
009--->1
总共用时:2203 ms
职位信息中含有‘销售’关键字的职位总数:105705
打印前5个职位Id:
146746253
145398731
144558278
146676991
145903475
学历统计:
40--->53122
0--->20360
50--->19842
30--->7235
20--->4950
60--->189
70--->7
工作经验统计:
000--->32267
001--->24848
002--->23029
003--->15861
005--->6687
-100--->1575
008--->777
010--->324
-001--->145
004--->132
006--->46
007--->13
009--->1
总共用时:530 ms
职位信息中含有‘文员’关键字的职位总数:8951
打印前5个职位Id:
147021795
1589251
1622088
1597617
1617689
学历统计:
40--->3207
0--->2172
30--->1837
20--->1230
50--->504
工作经验统计:
000--->3482
001--->2848
002--->1298
-100--->951
003--->306
005--->39
-001--->17
010--->4
004--->3
008--->2
006--->1
总共用时:187 ms
职位信息中含有‘程序员’关键字的职位总数:2907
打印前5个职位Id:
147212315
136862380
145218476
146803412
146799915
学历统计:
50--->1111
40--->1093
0--->662
30--->25
60--->11
20--->5
工作经验统计:
001--->954
002--->860
000--->668
003--->330
005--->49
-100--->37
-001--->4
004--->3
008--->1
010--->1
总共用时:129 ms
职位信息中含有‘机械’关键字的职位总数:21289
打印前5个职位Id:
1581752
1621668
1627486
147070171
147190901
学历统计:
40--->7886
50--->6918
0--->3535
30--->1992
20--->808
60--->145
70--->5
工作经验统计:
003--->5191
002--->4824
000--->3485
005--->3158
001--->2456
-100--->1182
008--->409
010--->283
004--->175
006--->75
007--->28
-001--->17
011--->5
009--->1
总共用时:155 ms
职位信息中含有‘品质’关键字的职位总数:9401
打印前5个职位Id:
146711801
1618120
1621358
1621362
1621387
学历统计:
40--->3820
50--->2690
0--->1420
30--->755
20--->661
60--->54
工作经验统计:
003--->2307
002--->1970
000--->1479
005--->1384
001--->1309
-100--->464
008--->204
010--->135
004--->93
006--->38
007--->13
-001--->3
009--->2
总共用时:185 ms
职位信息中含有‘采购’关键字的职位总数:10897
打印前5个职位Id:
146820815
146820816
1517476
1597948
1627281
学历统计:
40--->4872
50--->3172
0--->1612
30--->789
20--->416
60--->34
70--->2
工作经验统计:
003--->2637
002--->2365
000--->1872
001--->1767
005--->1520
-100--->318
008--->218
010--->116
004--->52
-001--->14
006--->13
007--->3
009--->2
总共用时:106 ms
职位信息中含有‘网络’关键字的职位总数:36103
打印前5个职位Id:
1634505
1617099
146026202
145398731
146298700
学历统计:
40--->15922
50--->10997
0--->6604
30--->1665
20--->688
60--->218
70--->9
工作经验统计:
000--->9680
001--->9171
002--->8501
003--->5569
005--->2215
-100--->427
008--->202
-001--->142
010--->138
004--->40
006--->13
007--->4
009--->1
总共用时:121 ms
<!-- end content -->
发表评论
-
使用Lucene-Spatial实现集成地理位置的全文检索
2015-05-27 17:33 1330Lucene通过Spatial包提供了对基于地理位置的 ... -
Lucene4.10.2开发之高亮显示
2015-05-05 23:13 596转载请注明,原创地址,谢谢配合! http://qindo ... -
Lucene 2 通过updateDocument更新索引
2010-12-30 15:47 2061package com.lucene; i ... -
Lucene 3建立索引和查询索引详解
2010-12-22 23:02 1843public void index() throws Corr ... -
Lucene3 查询索引
2010-12-22 22:46 1772package lucene3; import java.i ... -
Lucene3 建立索引
2010-12-22 22:25 1404Lucene3在建立索引的API上有比较大的变化。直接上程序: ... -
Lucene 3.0的简单解析及变化
2010-12-22 21:59 1144一、 概述 Lucene3 ... -
Lucene分词器之庖丁解牛
2010-12-22 07:47 3491注意:这里配置环境变量要重新启动系统后生效 我现在测试 ... -
Lucene从结果中取出数据
2010-12-21 20:23 1235有些应用,比如我们首先要搜索一个Person的索引文件,然后通 ... -
Lucene过滤器
2010-12-21 20:05 3796有的应用有些要求,对于某类型的内容即使满足条件了,但是也不能被 ... -
Lucene对于短语匹配查询的用法
2010-12-21 17:41 1378通常对于ID查询或者是比较确定字段内容的查询,我们就用: T ... -
Lucene 对所查的结果进行排序
2010-12-20 23:01 1224前面介绍完查询以后,现在要对查询结果进行排序的显示。 代码: ... -
Lucene 搜索方法(模糊搜索)
2010-12-20 11:54 3515LUCENE提供了一种模糊搜 ... -
Lucene 搜索方法(多短语搜索)
2010-12-20 11:42 1193短语搜索解决了短语搜索的问题,在很多情况下,用户输入某个关键字 ... -
Lucene 搜索方法(短语搜索)
2010-12-20 11:15 1828用户在搜索的时候,更多的情况是输入一个以上的关键字,这些关键字 ... -
Lucene 搜索方法(前缀搜索)
2010-12-20 10:27 1887PrefixQuery是一种前缀搜索,在检索的时候,常常需要进 ... -
Lucene 的索引读取工具(IndexReader)
2010-12-19 23:00 1613Lucene有一个很重要的工具IndexReader负责对索引 ... -
Lucene 搜索方法(范围搜索)
2010-12-19 22:54 1293在某些情况下,用户需要查找一定范围内的文档,比如时间,ID等。 ... -
Lucene 搜索方法(布尔搜索)
2010-12-19 22:04 1622布尔搜索: 布尔查询的对象中,包含一个子句的集合。各种子句间都 ... -
Lucene 搜索方法(词条搜索)
2010-12-19 21:15 1262词条搜索是LUCENE最为简单的一种搜索方式,通过对某个固定的 ...
相关推荐
《Lucene Facet 使用Bobo-Browse实现详解》 在信息检索领域,Lucene作为一款强大的全文搜索引擎,被广泛应用于各种复杂的数据检索场景。然而,随着数据量的日益增大,如何有效地对搜索结果进行分类和统计,即所谓的...
基于bobo-browse参照path统计方式实现类扩展自定义自己的实现类,可实现分类编码每4位为一个级别:如:1000000100301001 即可统计出1000、10000001、100000010030、1000000100301001,也可选择从第几级开始最多统计...
"bobo-chat-client win" 是一个专为Windows操作系统设计的应用程序,从标签"Application"我们可以推断出这是一款基于Java Socket实现的聊天客户端。这款应用很可能允许用户通过网络进行实时交流,提供基本的文字、...
详细见 见https://gitee.com/BoBojc/bobo-chat-server
【标题】"BOBO--影楼专用版PHOTOSHOP全自动平台动作.rar"指的是一个针对影楼行业的Photoshop自动化操作集合。这个压缩包文件包含了多种专业级别的动作(Actions),是Photoshop用户,尤其是影楼后期制作人员提升工作...
"Python库 | bobo-2.0.0.tar.gz" 是一个针对Python编程语言的库,版本号为2.0.0,它被封装在tar.gz格式的压缩包中。这个压缩包的名字是“bobo-2.0.0”,这通常意味着库的名称为“bobo”。tar.gz是一种常见的打包和...
【标题】"bobo-chat-client lunix" 是一个专为Linux操作系统设计的Bobo聊天客户端。这个客户端基于Java Socket技术,允许用户通过TCP/IP协议在本地网络或互联网上进行实时通信。Bobo Chat Client旨在提供一个简洁、...
我们报告了在西布基纳法索(西非)的Bobo-Dioulasso CHU-SS进行的1022上消化道内窥镜检查的结果。 这项研究的目的是记录在CHUSS的高内镜检查中发现的适应症和病变。 患者与方法:这是一项横断面研究,旨在描述2015...
作者打算描述Bobo-Dioulasso顶尖运动员的静息心电图特征。 这项描述性横向研究于2015年8月至2016年2月在Bobo-Dioulasso的CHU Sanou Souro心脏病学部门进行。 该研究对年龄在17至35岁之间的顶级运动员进行了抽样调查...
这项研究的目的是描述Bobo-Dioulasso市(布基纳法索)的学生饮食。 方法:这是一项描述性横断面研究,于2016年3月至4月进行,涉及Bobo-Dioulasso市公立和私立学校的1、4、7年级学生。 饮食调查方法可以提醒您过去24...
bobo-2.4.0
这项研究的目的是确定布基纳法索Bobo-Dioulasso的性活跃妇女群体中HPV-HR基因型的流行程度。 方法:这项研究于2017年9月至2017年6月在Bobo-Dioulasso的Souro Sanou教学医院进行。在同意后,总共有234名处于妇科和性...
方法:这项横断面研究于2016年3月至4月在Bobo-Dioulasso市的公立和私立学校的1、4、7年级学生中进行。 营养调查方法包括提醒人们过去24小时与食物消费频率问卷相关的信息。 过量摄入甜饮料的定义是每天消耗超过3种...
该研究的目的是了解Bobo-Dioulasso市妇女人口中的DA现象。 方法:这是一项描述性横断面研究,于2016年4月16日至4月30日进行,包括437名年龄在13至55岁之间的女性。 实现了多阶段随机抽样。卡方检验用于比较显着阈值...
音乐
发病率和各种偏见关系到不同的参与者,尤其是在Bobo-Dioulasso到布基纳法索的腰果行业。 我们认为适合在工厂的腰果脱壳站中处理腰果的妇女进行这项研究。 目的是为寻找适合这种健康风险的预防和治疗方案做出贡献。 ...
Bobo-Browse是建立在Lucene.Net之上的功能强大且可扩展的多面搜索引擎库。 它是John Wang用Java编写的的C#端口。 该项目基于和早期工作,但两个版本均基于Bobo-Browse.Net2.x。 这是的(几乎)完整的端口,它与...
【bobo-ui-website】项目概述 `bobo-ui-website`是一个专注于用户界面设计的网站项目,其核心目标是提供一套美观、易用且功能丰富的前端UI组件库。这个项目可能包含了HTML、CSS、JavaScript以及其他相关的前端技术...