`
yingruochen
  • 浏览: 75120 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Lucene学习入门3

阅读更多

前面对索引库做的增删改查不能在同一个索引库里同时进行运行多个索引,下面对前面的代码进行一下修改,来解决这个问题。

首先、先写个工具类,初始化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对象,这样就不会出现死锁的问题了。

 

分享到:
评论
1 楼 zyj177484 2012-06-05  
能请问下,我用lucene3.6 为何用不了QueryResult。
是不是我少添加了包,还是3.6删掉了QueryResult这个功能。
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    lucene学习

    Lucene的基础知识 1、案例分析:什么是全文检索,如何实现全文检索 2、Lucene实现全文检索的流程 a) 创建索引 b) 查询索引 3、配置开发环境 4、创建索引库 5、查询索引库 6、分析器的分析过程 a) 测试分析器的分词...

    lucene学习入门程序

    **Lucene学习入门程序** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。它是Java编写,可以被集成到各种应用中,提供强大的文本检索功能。本程序是针对初学者设计的,旨在帮助开发者快速理解并...

    lucene学习资料收集

    【标题】:“Lucene学习资料收集” 【描述】:Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发。这个资料集可能包含了关于如何理解和使用Lucene的各种资源,特别是通过博主huanglz19871030在iteye上的...

    Lucene的的学习资料及案例

    **Lucene学习指南** Lucene是一个高性能、全文检索库,由Apache软件基金会开发并维护,是Java编程语言中广泛使用的搜索引擎库。它提供了一个简单的API,使得开发者能够方便地在应用中实现全文检索功能。本篇文章将...

    lucene学习pdf2

    "lucene学习pdf2" 提供的文档,无疑是对Lucene深入理解的一把钥匙,它涵盖了Lucene的核心概念、操作流程以及高级特性。 首先,Lucene的基础知识是必不可少的。Lucene的核心在于索引和搜索,它将非结构化的文本数据...

    Lucene学习源码.rar

    本文将主要围绕Java Lucene进行深入探讨,并基于提供的“Lucene学习源码.rar”文件中的“Lucene视频教程_讲解部分源码”展开讨论。 一、Lucene核心概念 1. 文档(Document):Lucene中的基本单位,用于存储待检索...

    lucene3.6的入门案例

    通过对这个案例的学习,你可以掌握 Lucene 的基本操作,为进一步深入学习和应用打下基础。 在实际项目中,你可能需要考虑更多细节,如错误处理、多线程索引、优化索引性能、处理大量数据等。此外,随着 Lucene 版本...

    Lucene入门学习文档

    **Lucene入门学习文档** **一、什么是Lucene** Lucene是Apache软件基金会下的一个开源全文检索库,它提供了一个高...通过阅读"Lucene学习文档",你可以一步步了解并掌握这些知识,逐步成为一个熟练的Lucene开发者。

    【大搜集:lucene学习资料】---<下载不扣分,回帖加1分,欢迎下载,童叟无欺>

    lucene学习笔记 3 .txt lucene入门实战.txt Lucene 的学习 .txt Lucene-2.0学习文档 .txt Lucene入门与使用 .txt lucene性能.txt 大富翁全文索引和查询的例子程序.txt 关于lucene2.0的创建、检索和删除功能...

    Lucene-2.0学习文档

    本篇文章将围绕"Lucene-2.0学习文档"的主题,结合Indexer.java、MyScoreDocComparator.java和MySortComparatorSource.java这三个关键文件,深入探讨Lucene的核心概念和实际应用。 首先,我们来看`Indexer.java`。这...

    lucene 入门

    以上就是Lucene的基础知识和使用方法,通过这个入门资料,你可以快速上手并构建自己的全文搜索引擎。在实际应用中,还可以深入学习更高级的主题,如多字段搜索、评分策略、倒排索引优化等,以满足更复杂的需求。

    Lucene3.3.0学习Demo

    **Lucene 3.3.0 学习Demo** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发。在3.3.0版本中,Lucene提供了强大的文本搜索功能,包括分词、索引创建、查询解析和结果排序等。这个"Lucene3.3.0学习Demo...

    lucene学习资料

    10. **lucene学习笔记 3 .txt** 这是作者的学习笔记,可能包含了个人理解和使用Lucene过程中遇到的问题及解决方案,提供了不同角度的见解和实践经验。 通过这些文档,你可以系统地学习和掌握Lucene的各个方面,从...

    Lucene5.2.1 入门学习例子

    Lucene5.2.1 入门学习例子. 这是别人的例子源码。可以参考。内有使用说明。

    Lucene-入门

    **标题:“Lucene-入门”** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发并维护。它是Java编写的一个开源项目,被广泛应用于构建搜索引擎或者在大型数据集上进行全文检索。Lucene提供了丰富的搜索...

    Lucene.net学习帮助文档

    **一、Lucene.net基础** Lucene.net提供了对文本数据的索引和搜索功能,它通过分词、建立倒排索引等技术,使得文本数据可以被快速检索。在.NET环境中,开发者可以通过Lucene.net API创建索引,添加、删除和更新文档...

    Lucene 3.6 学习笔记

    以上就是Lucene 3.6的学习笔记,涵盖了从基础到高级的各种搜索和索引操作,以及相关的分词和扩展功能。通过学习这些内容,可以深入理解Lucene的工作机制,并利用其强大的搜索能力构建高效的应用。

    lucene4.8学习资料和案例

    1. 官方文档:Apache Lucene的官方文档详细介绍了API和使用示例,是学习的基础。 2. 代码示例:通过分析提供的"lucene4.8学习资料和案例"压缩包,可以深入了解Lucene的实践操作,如创建索引、执行查询、处理结果等。...

    搜索引擎lucene学习资料

    通过这些学习资料,读者可以系统地学习搜索引擎的理论基础,掌握Lucene的核心功能,同时也能了解到如何在实际项目中应用这些技术,提升搜索系统的性能和用户体验。这些知识对于从事信息检索、网站开发、大数据分析等...

    Lucene学习笔记(一)Lucene入门实例

    NULL 博文链接:https://kylinsoong.iteye.com/blog/719415

Global site tag (gtag.js) - Google Analytics