Lucene 简单案例

一 DirectoryProvider 提供索引的存储方式

package com;

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.RAMDirectory;

public class DirectoryProvider {

	public static Directory createRAMDirectory(){
		return new RAMDirectory();// 使用内存存储索引
	}

	public static Directory createFSDirectory(String filePath){
		Path path = Paths.get(filePath);
		try {
			return FSDirectory.open(path);// 使用磁盘使用索引
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}
}

二 DocumentLoader创建文档

package com;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;

public class DocumentLoader {
	private static DocumentLoader documentLoader = new DocumentLoader();

	private DocumentLoader(){}

	public static DocumentLoader getInstance(){
		return documentLoader;
	}

	public List<Document> loadDefaultDocuments(){
		String filePath = "D:\\";

		File dir = new File(filePath);

		File[] files = dir.listFiles();

		List<Document> documents = new ArrayList<Document>();

		for(File file : files){
			String filename = file.getName();
			String content = readFileContent(file);
			Document document = new Document();
			document.add(new TextField("filename",filename, Field.Store.YES));
			document.add(new TextField("content",content, Field.Store.YES));

			documents.add(document);
		}
		return documents;
	}

	public String readFileContent(File file) {
		StringBuilder sb = new StringBuilder();
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader(file));
			String line = null;
			while((line=br.readLine())!=null){
				sb.append(line).append("\r\n");
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}finally{
			if(br!=null){
				try {
					br.close();
				} catch (IOException e) {}
			}
		}
		return sb.toString();
	}
}

三 IndexCreator 创建索引

package com;

import java.util.List;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;

public class IndexCreator {
	public static Directory createIndex(Analyzer analyzer,Directory indexDirectory,List<Document> documents) throws Exception {
		IndexWriterConfig config = new IndexWriterConfig(analyzer);
//		config.setOpenMode(OpenMode.CREATE);

		IndexWriter indexWriter = new IndexWriter(indexDirectory, config);

		for(Document document:documents){
			indexWriter.addDocument(document);
		}

		indexWriter.close();

		return indexDirectory;
	}
}

四 Searcher 查询器,查询指定文档

package com;

import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
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.store.Directory;

public class Searcher {

	private StandardAnalyzer analyzer;
	private Directory indexDirectory;

	public Searcher(StandardAnalyzer analyzer, Directory indexDirectory) {
		this.analyzer = analyzer;
		this.indexDirectory = indexDirectory;
	}

	public List<Document> query(String queryKey,String queryValue) throws Exception {

		// do search
		DirectoryReader directoryReader = DirectoryReader.open(indexDirectory);
		IndexSearcher isearcher = new IndexSearcher(directoryReader);

		QueryParser parser = new QueryParser(queryKey, analyzer);
		Query query = parser.parse(queryValue);

		ScoreDoc[] hits = isearcher.search(query, 1000).scoreDocs;

		List<Document> docs = new ArrayList<Document>();

		for (int i = 0; i < hits.length; ++i) {
			int docId = hits[i].doc;
			Document doc = isearcher.doc(docId);
			docs.add(doc);
		}
		directoryReader.close();
	    return docs;
	}
}

五 Main 测试

package com;

import java.io.IOException;
import java.util.List;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.store.Directory;

public class Main {

	/**
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws Exception {
		StandardAnalyzer analyzer = new StandardAnalyzer();
		Directory indexDirectory = DirectoryProvider.createRAMDirectory();
//		Directory indexDirectory = DirectoryProvider.createFSDirectory("E:\\mine\\j2ee\\Lucene\\src\\indexes");

		List<Document> loadedDocuments = DocumentLoader.getInstance().loadDefaultDocuments();

		IndexCreator.createIndex(analyzer,indexDirectory,loadedDocuments);

		Searcher searcher = new Searcher(analyzer,indexDirectory);

		List<Document> res = searcher.query("filename", "artist");

		printResult(res);

	}

	private static void printResult(List<Document> documents){
		System.out.println("found "+documents.size());
		for(Document document : documents){
			String filename = document.get("filename");
			String content = document.get("content");
			System.out.println("filename:"+filename);
			System.out.println("content:\n"+content);
		}
	}

}
时间: 2024-10-03 13:38:48

Lucene 简单案例的相关文章

基于lucene的案例开发:ParseUtil &amp; ParseRequest

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/43195045 这篇博客主要介绍ParseUtil类和ParseRequest类,因为这两个类都比较简单,所以这里就不会给出事例程序. ParseUtil ParseUtil类主要实现将字符串(数字)转化为数值,这个在读取配置文件或数据转化过程中有很大的作用.源程序如下: /** *@Description: 转换类 */ package com.lulei.util; publ

基于lucene的案例开发:实时索引的检索

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44279753 http://www.llwjy.com/blogdetail/31bb705106379feaf6d31b58dd777be6.html 个人博客小站搭建成功,网址 www.llwjy.com,欢迎大家来吐槽~ 在前面的博客中,我们已经介绍了IndexSearcher中的检索方法,也介绍了如何基于lucene中的NRT*类去创建实时索引,在这篇博客中我们就重点介

基于lucene的案例开发:实时索引的修改

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44280311 http://www.llwjy.com/blogdetail/e42fa5c3097f4964fca0fdfe7cd7a9a2.html 个人的博客小站已经上线了,网址 www.llwjy.com,欢迎大家来吐槽~ 上一篇博客已经介绍了实时索引的检索功能,这个就相当于数据的的查询功能,我们都知道数据库的增删改查是最常用的四个功能,实时索引也是一样,他也有增删改查

基于lucene的案例开发:数据库连接池

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/43272993 通过java程序去连接数据库时,使用的协议是TCP/IP协议,TCP/IP协议需要进行3次握手.如果每一次数据库操作都需要创建一个新的连接,都要进行3次握手,这是十分浪费资源的,程序的效率也不是很高.为了解决这个问题,我们想可不可以自己维护一些数据库连接,需要数据库操作的时候,直接使用这其中的一个连接,用完了,在还给它,这样的话就不需要每次数据库操作都创建一个新的

基于lucene的案例开发:案例初识

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/43192055 首先抱歉,这几天在准备案例的整体框架设计,所以更新就断了几天,还请原谅. 案例整体介绍 在我们开始正式的案例开发介绍之前,我们先看一下整体的案例demo介绍,明白案例是做什么的. 从上图中,我们可以看出,这个案例主要是通过爬虫程序去采集纵横小说上的资源,然后将资源存储到自己的数据库中,将数据库中的需要检索的数据通过lucene建立索引文件,最后通过web服务展示数

基于lucene的案例开发:查询语句创建PackQuery

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44656141 http://www.llwjy.com/blogdetail/162e5e70516d7ddfb6df8f77e6b13a2b.html 个人博客站已经上线了,网址 www.llwjy.com~欢迎各位吐槽 ------------------------------------------------------------------------------

基于lucene的案例开发:纵横小说阅读页采集

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44937073 http://www.llwjy.com/blogdetail/29bd8de30e8d17871c707b76ec3212b0.html 个人博客站已经上线了,网址 www.llwjy.com ~欢迎各位吐槽~ ----------------------------------------------------------------------------

基于lucene的案例开发:纵横小说简介页采集

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44851419 http://www.llwjy.com/blogdetail/1b5ae17c513d127838c2e02102b5bb87.html 个人博客站已经上线了,网址 www.llwjy.com ~欢迎各位吐槽~ ----------------------------------------------------------------------------

基于lucene的案例开发:实时索引管理类IndexManager

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44015983 http://www.llwjy.com/blogd.php?id=5757ce8c007754704b563dd6a47ca1ca 个人的博客小站也搭建成功,网址:www.llwjy.com/blog.php ,欢迎大家来吐槽~ 在前一篇博客中,对实时索引的实现原理做了一些简单的介绍,这里就介绍下,如何利用Lucene来实现索引的管理(Lucene中已经实现了大