lucene4.2.1 入门

Lucene 是一个基于Java的全文信息检索工具包,是Apache软件基金会jakarta项目组的一个子项目,为应用程序提供索引和搜索功能,其它介绍网上多的是……

在全文索引工具中都是由这样的三部分组成:
1.索引部分
2.分词部分(如何分词)
3.搜索部分

觉得学习一个新知识还是直接从一个简单的例子学习来的快,就如刚开始学习c时,先从”hello world!”,然后慢慢分析其中的细节,那下面来就来看一个简单的例子吧,这个例子实现功能:在一些文档中查找某个关键词
所需要的jar包,都在lucene下载包里,只不过在不同的文件夹下:
lucene-core-4.2.1.jar
lucene-queryparser-4.2.1.jar
lucene-analyzers-common-4.2.1.jar

下面的代码有详细的解释:

public class HelloLucene {
	/*
	 * 建立索引
	 */
	public void index() {

		IndexWriter writer = null;
		try {
			// 1.创建Directory,确定索引建立在硬盘或者是内存中
			// Directory directory=new RAMDirectory(); //建立在内存中
			Directory directory = FSDirectory
			  .open(new File("f:\\lucene\\index"));// 把索引存在这个位置
			// 2.创建IndexWriter,通过它来写索引到上述位置 参1:lucene的版本,参2:用的分词器
			IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_42,
					new StandardAnalyzer(Version.LUCENE_42));
			writer = new IndexWriter(directory, iwc);
			// 3.创建Document对象,相当于数据库中的表 处理要建立索引的文档
			Document doc = null;
			// 4.为Document添加Field,Field相当于数据库中的字段
			File file = new File("F:\\lucene\\documents");// 要建立索引的文档所在文件夹
			// 为每篇文档添加field,索引文档的 内容/名称/路径
			for (File f : file.listFiles()) {
				doc = new Document();

				doc.add(new TextField("content", new FileReader(f)));// 分词,不存储
				doc.add(new StringField("filename", f.getName(),
						Field.Store.YES));// 不分词,存储
				doc.add(new StringField("path", f.getAbsolutePath(),
						Field.Store.YES));// 在api中看看TextField和StringField的不同
				// 5.通过IndexWriter添加文档到索引中
				writer.addDocument(doc);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (writer != null)
				try {
					writer.close();
				} catch (IOException e) {
				}
		}

	}

	/*** 搜索 */
	public void seracher() {
		// 1.创建Directory
		Directory directory;
		try {
			directory = FSDirectory.open(new File("f:\\lucene\\index"));
			// 2.创建IndexReader 读取索引
			IndexReader reader = DirectoryReader.open(directory);
			// 3.根据IndexReader创建IndexSearcher
			IndexSearcher searcher = new IndexSearcher(reader);
			// 4.创建搜索的Query
			// 创建parser来确定要搜索文件的内容,第二个参数表示搜索的域
			QueryParser parser = new QueryParser(Version.LUCENE_42, "content",
					new StandardAnalyzer(Version.LUCENE_42));
			// 创建query,表示搜索域为content中包含java的文档
			Query query = parser.parse("target");
			// 5.根据Searcher 搜索并且返回TopDocs,第二个参数表示要显示的条数
			TopDocs tds = searcher.search(query, 10);
			// 6.根据TopDocs获取ScoreDoc对象
			ScoreDoc[] sds = tds.scoreDocs; // score就是相关度最高的评分
			for (ScoreDoc sd : sds) {
				// 7.根据Searcher和ScoreDoc对象获取具体的Document对象
				Document d = searcher.doc(sd.doc);// 根据id获取文档
				// 8.根据Document对象获取需要的值 content没有保存会输出null
				System.out.println(d.get("filename") + "[" + d.get("path")
						+ "]" + d.get("content"));
			}
			// 9.关闭reader
			reader.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

下图是运行index()后产生的文件:



你可能感兴趣的:(lucene4.2.1 入门)