前面对索引库做的增删改查不能在同一个索引库里同时进行运行多个索引,下面对前面的代码进行一下修改,来解决这个问题。
首先、先写个工具类,初始化IndexWriter和关闭IndexWriter
package com.lucene.luceneutil;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
public class LuceneUtils {
private static IndexWriter indexWriter ;
static{
//初始化IndexWriter
try {
indexWriter = new IndexWriter(Configuration.getDirectory(), Configuration.getAnalyzer(), MaxFieldLength.LIMITED);
System.out.println("已经初始化了IndexWriter!");
// 在JVM退出前要执行代码
Runtime.getRuntime().addShutdownHook(new Thread(){
public void run(){
try {
indexWriter.close();
System.out.println("已经关闭了IndexWriter");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
});
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static IndexWriter getIndexWriter() {
return indexWriter;
}
public static void setIndexWriter(IndexWriter indexWriter) {
LuceneUtils.indexWriter = indexWriter;
}
}
然后,把实现类的用new方法直接创建IndexWriter对象的全部替换掉,例如:
package com.lucene.indexdao.impl;
import java.util.ArrayList;
import java.util.List;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.util.Version;
import com.lucene.entity.ArticleEntity;
import com.lucene.entity.QueryResult;
import com.lucene.indexdao.ArticleEntityIndexDao;
import com.lucene.luceneutil.ArticleDocumentUtils;
import com.lucene.luceneutil.Configuration;
import com.lucene.luceneutil.LuceneUtils;
public class ArticleEntityIndexDaoImpl implements ArticleEntityIndexDao {
@Override
public void save(ArticleEntity article) {
// 1,把Article转为Document
Document doc = ArticleDocumentUtils.Article2Document(article);
// 2,把Document存到索引库中
try {
LuceneUtils.getIndexWriter().addDocument(doc);// 建立索引
LuceneUtils.getIndexWriter().commit();//提交更改
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* Term:就是某Field中的某个关键词。
*/
@Override
public void delete(Integer id) {
try {
Term term = new Term("id", id.toString());
LuceneUtils.getIndexWriter().deleteDocuments(term); // 删除包含指定Term的索引数据
LuceneUtils.getIndexWriter().commit(); //提交更改
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 更新就是先删除再添加
*/
@Override
public void update(ArticleEntity article) {
try {
Term term = new Term("id", article.toString());
Document doc = ArticleDocumentUtils.Article2Document(article);
LuceneUtils.getIndexWriter().updateDocument(term, doc);//更新索引
LuceneUtils.getIndexWriter().commit(); //提交更改
// indexWrite.deleteDocuments(term);
// indexWrite.addDocument(doc);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public QueryResult<ArticleEntity> search(String query, int firstResult,
int number) {
IndexSearcher searchQuery = null;
QueryParser queryParser = null;
Query queryStr;
try {
// queryParser = new QueryParser(Version.LUCENE_30, "title",
// Configuration.getAnalyzer());这是默认在title里搜索
queryParser = new MultiFieldQueryParser(Version.LUCENE_30,new String[] { "title", "content" },Configuration.getAnalyzer());// 多字段中搜索
queryStr = queryParser.parse(query);
searchQuery = new IndexSearcher(Configuration.getDirectory());
TopDocs topDocs = searchQuery.search(queryStr, 1000);
int totalNum = topDocs.totalHits;// 符合条件的总记录数
ScoreDoc[] scoredoc = topDocs.scoreDocs;// 符合条件的前n条信息
// 处理结果
List<ArticleEntity> list = new ArrayList<ArticleEntity>();
int endLenght = Math.max(firstResult + number, scoredoc.length);
for (int i = firstResult; i < endLenght; i++) {
Document doc = searchQuery.doc(scoredoc[i].doc); // 得到Document对象
ArticleEntity e = ArticleDocumentUtils.Document2Article(doc); // 得到ArticleEntity对象
list.add(e);
}
return new QueryResult<ArticleEntity>(totalNum, list);
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
try {
searchQuery.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
这样,在程序加载的时候就初始化了IndexWriter对象,在JVM退出之前关闭IndexWriter对象,这样就不会出现死锁的问题了。
分享到:
相关推荐
lucene学习入门程序,程序全面系统的描述了lucene各个接口的调用,包括高亮显示,范围搜索等
Lucene的基础知识 1、案例分析:什么是全文检索,如何实现全文检索 2、Lucene实现全文检索的流程 a) 创建索引 b) 查询索引 3、配置开发环境 4、创建索引库 5、查询索引库 6、分析器的分析过程 a) 测试分析器的分词...
lucene学习笔记 3 .txt lucene入门实战.txt Lucene 的学习 .txt Lucene-2.0学习文档 .txt Lucene入门与使用 .txt lucene性能.txt 大富翁全文索引和查询的例子程序.txt 关于lucene2.0的创建、检索和删除功能...
有关lucene入门学习的PPT以及算法和倒排原理
Lucene5.2.1 入门学习例子. 这是别人的例子源码。可以参考。内有使用说明。
Lucene学习文档Lucene学习文档Lucene学习文档Lucene学习文档
很好的Lucene学习入门资料。lucene是纯java开发的,支持索引的建立和搜索
NULL 博文链接:https://kylinsoong.iteye.com/blog/719415
lucene基础学习.pdf
说明: 例子是根据lucene3.6写的,也可以说是直接copy别人的。 包括参考文章的代码,以及修改部分之后的代码
第一章 LUCENE基础 2 1.1 索引部分的核心类 2 1.2 分词部分的核心类 2 1.3 搜索部分的核心类 2 第二章 索引建立 3 2.1 创建Directory 3 2.2 创建Writer 3 2.3 创建文档并且添加索引 4 2.4 查询索引的基本信息 5 2.5 ...
lucene基础学习笔记&源码
lucene学习开发入门教程,介绍了lucene的原理,用法。有相关代码和实例。lucene绝对的实用和经典教程。
视频详细讲解,需要的小伙伴自行网盘下载,链接见附件,永久有效。 目前业界流行的ElasticSearch和Solr搜索...系统的学习Lucene全文检索技术,全面掌握搜索原理和底层知识,为学习其他应用层面搜索技术打下坚实的基础。
lucene学习笔记,lucene入门必备材料
lucene3.6入门实例教程 完整代码示例,lucene入门学习很好的资料
这是笔者近期学习Lucene.net时所看书籍,受益良多,希望可以帮助更多人。包括Lucene快速学习手册、Lucene实战、Lucene搜索引擎开发进阶三份文档。
这是我在学习lucene过程中,总结出来地认为有一定总结力度地文章,相信可以对你有所积极影响!
Lucene 基础指南,学习lucene的好文档
Lucene学习总结及例子,Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。方便大家学习避免走弯路。