孔浩Lucene索引初步



package Lucene_01;

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

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.codecs.blocktree.FieldReader;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.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;

@SuppressWarnings("all")
public class HelloLucene {
	// 建立索引
	public void index() {
		// 1.创建Directory
		// Directory directory=new RAMDirectory(); //建立在内存中
		IndexWriter iwriter = null;
		try {
			Directory directory = FSDirectory.open(new File(
					"D:/Lucene/lucene01")); // 创建在硬盘上
			// 2.创建IndexWriter
			IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_4_9,
					new StandardAnalyzer(Version.LUCENE_4_9));

			iwriter = new IndexWriter(directory, iwc);

			// iwriter.commit();

			// 3.创建Document对象
			Document doc = null;
			// 4.为Document添加Field
			File f = new File("D:/Lucene/example");
			for (File file : f.listFiles()) {
				doc = new Document();
				doc.add(new Field("content", new FileReader(file)));
				doc.add(new Field("filename", file.getName(), Field.Store.YES,
						Field.Index.NOT_ANALYZED));
				doc.add(new Field("path", file.getAbsolutePath(),
						Field.Store.YES, Field.Index.NOT_ANALYZED));

				// 通过IndexWriter 添加文档到索引中
				iwriter.addDocument(doc);
			}

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {

			if (iwriter != null) {
        
				try {
					iwriter.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}// 关闭流
			}
		}

	}

	public void searcher() {
		// 1.创建directory
		try {
			Directory directory = FSDirectory.open(new File(
					"D:/Lucene/lucene01"));// 创建在硬盘上
			// //2.创建IndexReader
			// IndexReader reader=IndexReader.open(directory);
			// //3.genju IndexReader创建IndexSearcher
			// IndexSearcher searcher=new IndexSearcher(reader);

			DirectoryReader reader = DirectoryReader.open(directory);
			IndexSearcher searcher = new IndexSearcher(reader);

			// 4.创建索引Query
			// 创建parser来确定要搜索文件的内容,第二个参数表示搜索的域
			QueryParser parser = new QueryParser(Version.LUCENE_4_9, "content",
					new StandardAnalyzer(Version.LUCENE_4_9));
			// 创建query,表示搜索域为content中包含的java文档
			Query query = parser.parse("java");
			// 5.根据seacher搜索并且返回Topdocs
			TopDocs tds = searcher.search(query, 10);
			// 6.根据Topdocs获取ScoreDoc对象
			ScoreDoc[] sds = tds.scoreDocs;
			for (ScoreDoc sd : sds) {
				// 7.根据docment对象获取具体Document对象
				Document d = searcher.doc(sd.doc);

				// 8.根据Document对象获取需要的值
				System.out.println(d.get("filename") + "[" + d.get("path")
						+ "]");
			}

			// 9.关闭reader
			reader.close();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}


这个程序中最重要的是理解索引创建的步骤。

doc = new Document();
这个地方是特别容易错的,必须将它放在for循环体里面,不然会报错的,IndexWriter里面是包含多个Document对象的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值