读书人

Lucene3.3.0 烂笔尖

发布时间: 2012-06-27 14:20:09 作者: rapoo

Lucene3.3.0 烂笔头
项目中需要用到全文检索,不用说首选lucene.目前版本为3.3.0 lib中增加lucene-core-3.3.0.jar
分词器采用第三方的IKAnalyzer.版本为IKAnalyzer3.2.8.jar
由于项目并发量可能不会很大,所以在新建一个记录保存到数据时,同时对该记录进行硬盘增加索引处理。修改和删除一样.
另外.每天半夜索引重新生成一份,然后合并.

针对数据在做索引保存时,只保存id,以及需要检索的内容content.
1.新增:

/*************************************************************************** * 新增 */private void add(LuceneIndexVO luceneIndexVO) throws Exception {// 创建doc对象Document doc = new Document();// 增加相关字段doc.add(new Field(LuceneUtil.KEY_ID, luceneIndexVO.getId() + "",Field.Store.YES, Field.Index.NOT_ANALYZED));doc.add(new Field(LuceneUtil.KEY_CONTENT, luceneIndexVO.getContent(),Field.Store.YES, Field.Index.ANALYZED));// 为该对象创建索引IndexWriter writer =null;try{writer=getWriter();writer.addDocument(doc);//writer.optimize();}catch(Exception e){e.printStackTrace();}finally{if(writer!=null){writer.close();}}}

2.修改:
private void update(LuceneIndexVO luceneIndexVO) throws Exception {Document doc = new Document();// 设置文档的值doc.add(new Field(LuceneUtil.KEY_ID, luceneIndexVO.getId() + "",Field.Store.YES, Field.Index.NOT_ANALYZED));doc.add(new Field(LuceneUtil.KEY_CONTENT, luceneIndexVO.getContent(),Field.Store.YES, Field.Index.ANALYZED));// 创建关键字Term term = new Term(LuceneUtil.KEY_ID, luceneIndexVO.getId() + "");// 更新IndexWriter writer =null;try{writer=getWriter();// 跟进term 指定的id,更新writer.updateDocument(term, doc);writer.close();}catch(Exception e){e.printStackTrace();}finally{if(writer!=null){writer.close();}}}

3.删除:
private void delete(LuceneIndexVO luceneIndexVO) throws Exception {// 根据id创建查询对象Term term = new Term(LuceneUtil.KEY_ID, luceneIndexVO.getId()+ "");// 删除索引IndexWriter writer =null;try{writer=getWriter();// 根据查询条件,删除Docwriter.deleteDocuments(term);writer.close();}catch(Exception e){e.printStackTrace();}finally{if(writer!=null){writer.close();}}}


同时后台对索引的增加修改删除都有一个线程来处理:
/*** * 主要的业务处理 */private void doWork(){try {//do the main jobLuceneIndexVO luceneIndexVO=getLuceneIndexVO();if(luceneIndexVO==null){try {Thread.sleep(LuceneUtil.SLEEP_TIME);} catch (InterruptedException e) {e.printStackTrace();}return;//结束本次循环}//根据操作对象判断,进行相关操作if (luceneIndexVO.getOpt().equals(LuceneUtil.OBJ_OPT_ADD)) {//增加add(luceneIndexVO);} else if (luceneIndexVO.getOpt().equals(LuceneUtil.OBJ_OPT_UPDATE)) {//更新update(luceneIndexVO);} else if (luceneIndexVO.getOpt().equals(LuceneUtil.OBJ_OPT_DELETE)) {//删除delete(luceneIndexVO);}} catch (Exception e) {logger.error(getSubName()+"...main job occur error:"+e.getMessage()+",detail is:\n");e.printStackTrace();try {Thread.sleep(LuceneUtil.SLEEP_TIME);} catch (InterruptedException e1) {}}}


包含首次初始化
public void run() {logger.info(getSubName()+" start to run!");long workFlag=System.currentTimeMillis();//1.如果目录和索引文件不存在则需要首次初始化.initIndex();//2.如果索引目录下有lock文件则必须删除.checkWorkDirectory();while(isRunning){//一分钟打印一次信息.long interval=System.currentTimeMillis()-workFlag;long flag=interval-LuceneUtil.ONE_MINUTE_INTERVAL;if(flag>=0){logger.info(getSubName()+"...working......");workFlag=System.currentTimeMillis();}doWork();}logger.info(getSubName()+" end to run!");}


相关调用图:
原Action增加一个lucene相关的service.在对新增,修改,删除的对象,完成操作时,把该对象放入队列,后台有lucene线程来同步更新硬盘索引.

读书人网 >开源软件

热点推荐