学习lucene应用简单实例

1.搭建开发环境
Lucene-analyzers-3.0.1.jar
Lucene-core-3.0.1.jar
Lucene-highlighter-3.0.1.jar
Lucene-memory-3.0.1.jar
IKAnalyzer3.2.0Stable.jar //修补包
说明: 本IK分词器只把支持当前Lucene3.0版本,不支持以前的版本.

2.最简单的HelloWorld演示程序
public class HelloWorld {
static Directory dir = null;// 全局索引库存放位置变量
static Analyzer analyzer = null;// 全局分词器变量
// 静态实例化全局变量
static {
try {
dir = FSDirectory.open(new File("./indexDir"));
analyzer = new StandardAnalyzer(Version.LUCENE_30);// 使用最简单的内置分词器
} catch (IOException e) {
throw new RuntimeException(e);
}
}

3.创建索引
@Test
public void creatIndex() {
// 模拟数据库搜索出的一条记录
Article article = new Article();
article.setId(1l);
article.setTitle("现在主要是考查搜索");
article.setContent("现在正在考查搜索,包括BBS,BLOG等.");
// article--->Document对象的转换
Document doc = LuceneUtils.article2Document(article);
try {
RAMDirectory ramDir = new RAMDirectory(dir);// 索引库目录读入内存中生成一份虚拟目录(注:前提是磁盘中必须已经存在一份真实的文件目录)
IndexWriter indexWriter = new IndexWriter(ramDir, analyzer,
MaxFieldLength.LIMITED);// 使用内存索引库目录对象来实例化索引库输出流对象
// IndexWriter indexWriter=new IndexWriter(dir,analyzer,false,MaxFieldLength.LIMITED);//使用文件目录对象实例化索引输出流对象,若目录不存在也会报错
// IndexWriter indexWriter=new
// IndexWriter(dir,analyzer,true,MaxFieldLength.LIMITED);//与上面的区别是每次执行都会重新覆写索引库
indexWriter.addDocument(doc); // 索引库中添加一份文档
indexWriter.close(); // 本语句应当放在finally块中
indexWriter = new IndexWriter(dir, analyzer, /*true,*/
MaxFieldLength.LIMITED);
System.out.println(indexWriter.getMaxMergeDocs());
System.out.println(indexWriter.getMergeFactor());
System.out.println();
indexWriter.addIndexesNoOptimize(ramDir); // Merges all segments from an array of indexes into this index.but not optimize.
indexWriter.optimize(); // Merges all segments together into a single segment, optimizing an index for search.
indexWriter.close();
} catch (Exception e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
4.在索引库中搜索文档
@Test
public void searchIndex() {
String queryString = "搜索";//要搜索的关键词
int count = 0;//总匹配的记录数
String[] fields = { "title", "content" };//要添加到文档中的字段集合
try {
QueryParser queryParser = new MultiFieldQueryParser(
Version.LUCENE_30, fields, analyzer);//多字段查询解析器
Query query = queryParser.parse(queryString);//查询解析器生成查询实例

IndexSearcher indexSearcher = new IndexSearcher(dir);//生成索引库搜索器实例对象
TopDocs topDocs = indexSearcher.search(query, 100);//包含关键词的所有内部编号的对象
count = topDocs.totalHits;
ScoreDoc[] scoreDocs = topDocs.scoreDocs;//获取文档内部编号的索引集合
List<Article> articles = new ArrayList<Article>();
for (int i = 0; i < scoreDocs.length; i++) {
ScoreDoc sd = scoreDocs[i];//取得包含文档内部编号属性的每个对象
Document doc = indexSearcher.doc(sd.doc);//通过文档内部编号取出真正的文档

Article art = LuceneUtils.document2Article(doc);//article--->document转换
articles.add(art);//添加到list集合
}
indexSearcher.close();
System.out.println("匹配的总数量为" + count);
for (Article article : articles) {
System.out.println("id---->" + article.getId());
System.out.println("title--->" + article.getTitle());
System.out.println("content--->" + article.getContent());
}
} catch (Exception e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值