基础应用,在保存信息时调用luceneDao中的save方法产生索引,搜索时调用search依据进行查询。
@Repository("luceneDao")
public class LuceneDao {
/**
*
* save: 产生索引
* 由于在通过IndexWriter对象操作索引库的时候,忘记关闭该对象流了。
* 当关闭时,程序退出自会上索引锁,所以在用IndexWriter进行
* 索引库操作的时候一定要记得关闭该对象流!
* @param @param message 设定文件
* @return void DOM对象
* @throws
* @since search1.0
*/
public void save(Message message) {
IndexWriter indexWriter = null;
try {
indexWriter = SearchUtils.getIndexWriter();
indexWriter.addDocument(SearchUtils.parseMessageToDocument(message));
indexWriter.setMergeFactor(4);
indexWriter.optimize();
indexWriter.commit();
} catch (Exception e) {
e.printStackTrace();
}finally{
if(null != indexWriter){
try {
indexWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
*
* search:查询
*
* @param @param query
* @param @return 设定文件
* @return List<MessageBean> DOM对象
* @throws
* @since search1.0
*/
public List<MessageBean> search(String query) {
List<MessageBean> messageBeans = new ArrayList<MessageBean>();
IndexSearcher indexSearcher = SearchUtils.getIndexSearch();
String[] fields = {"title", "content"};
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30, fields, SearchUtils.analyzer);
try {
Query luceneQuery = queryParser.parse(query);
TopDocs topDocs = indexSearcher.search(luceneQuery, 100);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
Formatter formatter = new SimpleHTMLFormatter("<font color='red'>", "</font>");
QueryScorer scorer = new QueryScorer(luceneQuery);
Highlighter highlighter = new Highlighter(formatter, scorer);
Fragmenter fragmenter = new SimpleFragmenter(20);
highlighter.setTextFragmenter(fragmenter);
for(ScoreDoc scoreDoc : scoreDocs){
Document doc = indexSearcher.doc(scoreDoc.doc);
String title = highlighter.getBestFragment(SearchUtils.analyzer, "title", doc.get("title"));
String content = highlighter.getBestFragment(SearchUtils.analyzer, "content", doc.get("content"));
if( null != title){
doc.getField("title").setValue(title);
}
if( null != content){
doc.getField("content").setValue(content);
}
messageBeans.add(SearchUtils.parseDocumentToMessageBean(doc));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(null != indexSearcher){
try {
indexSearcher.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return messageBeans;
}
}
public class SearchUtils {
public static IKAnalyzer analyzer;
public static Directory directory;
static {
File file = new File("./indexs/");
try {
directory = FSDirectory.open(file);
analyzer = new IKAnalyzer();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
*
* getIndexWriter:return indexwriter
*
* @param @return 设定文件
* @return IndexWriter DOM对象
* @throws
* @since search1.0
*/
public static IndexWriter getIndexWriter(){
IndexWriter indexWriter = null;
try {
//字段设置为有限长度
indexWriter = new IndexWriter(directory, analyzer,
MaxFieldLength.LIMITED);
//indexWriter.setMaxFieldLength(100);设置最大长度
} catch (Exception e) {
e.printStackTrace();
}
return indexWriter;
}
/**
*
* getIndexSearch:return indexsearcher
*
* @param @return 设定文件
* @return IndexSearcher DOM对象
* @throws
* @since search1.0
*/
public static IndexSearcher getIndexSearch(){
IndexSearcher indexSearcher = null;
try {
indexSearcher = new IndexSearcher(directory);
} catch (Exception e) {
e.printStackTrace();
}
return indexSearcher;
}
public static IndexReader getIndexReader(){
IndexReader reader = null;
try {
reader = IndexReader.open(directory);
} catch (Exception e) {
e.printStackTrace();
}
return reader;
}
/**
*
* parseToObject:from document to Object
*
* @param @param document
* @param @return 设定文件
* @return Lucene DOM对象
* @throws
* @since search1.0
*/
public static Lucene parseToObject(Document document) {
Lucene lucene = new Lucene();
lucene.setTitle(document.get("title"));
lucene.setUrl(document.get("url"));
lucene.setDigest(document.get("digest"));
return lucene;
}
/**
*
* parseMessageToDocument:parse message to document
*
* @param @param message
* @param @return 设定文件
* @return Document DOM对象
* @throws
* @since search1.0
*/
public static Document parseMessageToDocument(Message message){
Document doc = new Document();
doc.add(new Field("id", message.getId(), Store.YES, Index.NOT_ANALYZED));
doc.add(new Field("title", message.getTitle(), Store.YES, Index.ANALYZED));
doc.add(new Field("author", message.getAuthor(), Store.YES, Index.ANALYZED));
doc.add(new Field("keywords", message.getKeywords(), Store.YES,
Index.ANALYZED));
doc.add(new Field("content", message.getContent(), Store.YES,
Index.ANALYZED));
return doc;
}
/**
*
* parseDocumentToMessageBean:parse document to message
*
* @param @param doc
* @param @return 设定文件
* @return MessageBean DOM对象
* @throws
* @since search1.0
*/
public static MessageBean parseDocumentToMessageBean(Document doc){
MessageBean messageBean = new MessageBean();
messageBean.setId(doc.get("id"));
messageBean.setTitle(doc.get("title"));
messageBean.setAuthor(doc.get("author"));
messageBean.setKeywords(doc.get("keywords"));
messageBean.setContent(doc.get("content"));
return messageBean;
}
/**
*
* unLock:unlock
*
* @param 设定文件
* @return void DOM对象
* @throws
* @since search1.0
*/
public static void unLock(){
try {
if (IndexWriter.isLocked(directory)) {
IndexWriter.unlock(directory);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
分享到:
相关推荐
**Lucene 全文搜索引擎实例:Java Lucene 实例** Lucene 是 Apache 软件基金会的一个开源项目,它提供了一个高性能、可扩展的信息检索库。这个实例将深入讲解如何在 Java 中使用 Lucene 来创建索引并执行各种搜索...
Java搜索工具——Lucene实例总结(一) 在Java开发中,搜索引擎已经成为不可或缺的一部分,而Apache Lucene正是一个强大的全文搜索引擎库。这篇博文将带你深入理解Lucene的基本概念和使用方式,帮助你快速入门并掌握...
lucene实例是一个比较详细的例子,包括lucene的入门到高级实例,代码里有比较详细的实例,所有的实例都是通过junit来测试的。实例包括各种搜索:如通配符查询、模糊查询、查询结果的分页、中文分词器、自定义分词器...
经典的Lucene实例代码及详细解析以及Lucene结构流程介绍 Lucene是一个功能强大且灵活的开源搜索引擎库,它提供了一个简单易用的API,允许开发者快速构建搜索应用程序。下面将对Lucene的实例代码和结构流程进行详细...
**Lucene实例项目及其打包文件详解** Lucene是一款强大的全文搜索引擎库,由Apache软件基金会开发,广泛应用于各种信息检索系统。这个实例项目是基于Lucene官网提供的,旨在帮助开发者更好地理解和使用Lucene进行...
在这个"一个关于lucene实例"的压缩包中,很可能是为了帮助初学者理解并掌握Lucene的基本用法和核心概念。 Lucene的主要功能包括文档的索引和搜索。在索引过程中,它能够分析文本,将文本分词,然后将这些词语转换为...
CreateLucene.java 增量生成索引 CreateLuceneAll.java 全量生成索引 CreateLuceneInter.java 按照时间区间生成索引 里面为参考代码,使用lucene-core-2.9.0.jar
**Lucene实例详解** Lucene,作为Apache软件基金会的一个开源项目,是一款强大的全文搜索引擎库,广泛应用于各种信息检索系统。最新版的Lucene提供了一系列优化和改进,使其在处理大量数据和提高搜索效率方面表现...
**Lucene 实例使用步骤** 1. **创建索引**:首先,你需要创建一个索引 writer,指定索引目录,然后遍历要索引的文件或数据,使用 Document 对象添加字段,并通过 writer 将其写入索引。 2. **配置分析器**:根据...
在这个"自己写的lucene实例 java搜索引擎"中,我们将会探讨Lucene如何与Java结合,以实现在文件内容中的高效搜索。 首先,我们需要理解Lucene的基本工作流程。这个过程主要包括以下几个步骤: 1. **创建索引**:这...
**Lucene 搜索实例** Apache Lucene 是一个高性能、全文本搜索引擎库,它为开发者提供了在各种应用程序中实现全文检索的工具集。Lucene 并不是一个完整的应用,而是一个 Java 类库,可以被其他 Java 应用程序所使用...
在搜索应用中,Spring可以帮助管理Lucene实例,以及与数据库交互的iBatis配置。 7. **Struts2**:作为MVC框架,Struts2处理HTTP请求,并与后端服务(如Spring和Lucene)交互。用户在前端输入查询后,Struts2会接收...
**Lucene索引器实例详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个高级的、灵活的、可扩展的接口,使得开发者能够轻松地在应用程序中实现全文...