项目中需要用到全文检索,不用说首选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();
// 根据查询条件,删除Doc
writer.deleteDocuments(term);
writer.close();
}catch(Exception e){e.printStackTrace();}finally{
if(writer!=null){
writer.close();
}
}
}
同时后台对索引的增加修改删除都有一个线程来处理:
/***
* 主要的业务处理
*/
private void doWork(){
try {
//do the main job
LuceneIndexVO 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线程来同步更新硬盘索引.
- 大小: 51.9 KB
分享到:
相关推荐
这是我通过对Lucene3.3.0源码进行了简单解读,依据应用详细的做了很多Demo,大家可以一道学习。
Lucene 3.3.0 API chm格式带全文索引方便携带和查询。 从之前发布其他chm文件下载用户的反映看,有不少朋友反映下载后打开无法显示,这一般不是chm文件的问题,这里统一说明一下解决办法: 如果文件打开看不到右边的...
基于Lucene3.3.0的全文检索 支持 多文件类型 多层级检索 包含:支持Jar、自测实现代码(Java) 7z压缩
lucene-3.3.0-src.ziplucene-3.3.0-src.zip
lucene-analyzers-3.3.0.jar lucene-benchmark-3.3.0.jar lucene-core-3.3.0.jar lucene-demo-3.3.0.jar lucene-grouping-3.3.0.jar lucene-highlighter-3.3.0.jar lucene-icu-3.3.0.jar lucene-instantiated-3.3.0....
lucene-core-3.3.0.jarlucene-core-3.3.0.jar
lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。
lucene-memory-3.3.0.jar 包下载
lucene-highlighter-3.3.0.jar 包下载
lucene-analyzers-3.3.0.jar包下载
lucene-analyzers-3.3.0 jar包和源码。
lucene实例lucene实例lucene实例lucene实例lucene实例lucene实例lucene实例lucene实例lucene实例
lucene,lucene教程,lucene讲解。 为了对文档进行索引,Lucene 提供了五个基础的类 public class IndexWriter org.apache.lucene.index.IndexWriter public abstract class Directory org.apache.lucene.store....
lucene3.0 lucene3.0 lucene3.0 lucene3.0 lucene3.0
lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习...
赠送jar包:lucene-core-7.7.0.jar; 赠送原API文档:lucene-core-7.7.0-javadoc.jar; 赠送源代码:lucene-core-7.7.0-sources.jar; 赠送Maven依赖信息文件:lucene-core-7.7.0.pom; 包含翻译后的API文档:lucene...
Lucene3.0特性Lucene3.0特性
赠送jar包:lucene-core-7.2.1.jar; 赠送原API文档:lucene-core-7.2.1-javadoc.jar; 赠送源代码:lucene-core-7.2.1-sources.jar; 赠送Maven依赖信息文件:lucene-core-7.2.1.pom; 包含翻译后的API文档:lucene...
本课程由浅入深的介绍了Lucene4的发展历史,开发环境搭建,分析lucene4的中文分词原理,深入讲了lucenne4的系统架构,分析lucene4索引实现原理及性能优化,了解关于lucene4的搜索算法优化及利用java结合lucene4实现...
lucene.NET 中文分词 高亮 lucene.NET 中文分词 高亮 lucene.NET 中文分词 高亮 lucene.NET 中文分词 高亮