Lucene 入门之创建索引和搜索


本例使用Lucene3.5.0版本


Lucene由3部分组成,索引部分,分词部分,搜索部分,本文简单介绍索引部分和搜索部分。


创建索引可分为5步:

1、创建Directory来存储索引

2、创建Indexwriter来写索引

3、创建Document来存储信息

4、为Document创建Field

5、通过IndexWriter添加文档


创建搜索可分为8部分:

1、创建Directory来获取索引

2、创建IndexReader来读取索引

3、根据IndexReader来创建IndexSearcher

4、创建搜索的Query

5、根据Searcher搜索并返回TopDocs

6、根据topDocs返回scoreDocs

7、根据Searcher和scoreDocs获取Document

8、根据Document获取文档信息


代码如下:

package com.lkt.lucene;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
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.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

public class HelloLucene2 {

	/**
	 * 建立索引
	 */
	public void index(){
		IndexWriter writer=null;
		try {
			//1.创建Directory,用来存储索引(FSDirectory,存储在硬盘中)
			Directory dir = FSDirectory.open(new File("F:"+File.separator+"workspace"+File.separator+"lucene"));
			//2.创建IndexWriter,用来写索引
				//版本和分词器,此例用标准分词器
			IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35));
			writer = new IndexWriter(dir, iwc);
			//3.创建Document对象
			Document doc =null;
			//4.为Document添加Field
			File file =new File("F:\\学习资料\\javascript\\workspace");
			for (File f : file.listFiles()) {
				doc = new Document();
				doc.add(new Field("content", new FileReader(f)));
				//存储文件名,是否将文件名存储到硬盘,是否分词
				doc.add(new Field("filename", f.getName(),Field.Store.YES ,Field.Index.NOT_ANALYZED));
				doc.add(new Field("filepath", f.getAbsolutePath(),Field.Store.YES ,Field.Index.NOT_ANALYZED));
				//5.将文档添加到索引中
				writer.addDocument(doc);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(writer!=null){
				try {
					writer.close();
				} catch (Exception e) {
					e.printStackTrace();
				} 
			}
		}
	}
	/**
	 * 搜索
	 */
	public void searcher(){
		IndexReader reader=null;
		try {
			//1.创建Directory
			Directory dir = FSDirectory.open(new File("F:"+File.separator+"workspace"+File.separator+"lucene"));
			//2.创建IndexReader,读取索引
		    reader = IndexReader.open(dir);
			//3.根据IndexReader创建Indexsearcher
			IndexSearcher searcher = new IndexSearcher(reader);
			//4.创建搜索的Query
				//创建QueryParser 来确认要搜索的内容,第二个参数要搜索的域
			QueryParser queryParser = new QueryParser(Version.LUCENE_35, "content",new StandardAnalyzer(Version.LUCENE_35));
				//创建Query,表示搜索域中包含Java的文件
			Query query = queryParser.parse("javascript");
			//5.根据Searcher搜索并且返回TopDocs
				//搜索10条
			TopDocs topDocs = searcher.search(query, 10);
			//6.根据TopDocs获取ScoreDoc对象
			ScoreDoc[] scoreDocs= topDocs.scoreDocs;
			for (int i = 0; i < scoreDocs.length; i++) {
				//7.根据searcher和ScoreDoc得到Document对象
				Document d = searcher.doc(scoreDocs[i].doc);
				//8.根据Document得到需要的值
				System.out.println(d.get("filename")+"["+d.get("filepath")+"]");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(reader!=null){
				reader.clone();
			}
		}
		
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值