`

lucene入门小结

 
阅读更多

 好久好久,终于又写了这么一篇博客。时隔一年啊,这一年经历了一些有关编码没关编码的事,哈哈,在这儿就不多说了。这篇博客主要介绍lucene的入门小姐。

为什么要入手lucene呢,是网上看到网络爬虫,爬着各种东西,瞬间觉得这东西碉堡了,于是跑去图书馆,找来了一本关于搜索引擎的书,于是照着抄代码,wokao,lucene更新换代的速度还是蛮快而且变化蛮大的。所以书上的代码还是要查阅很多资料才可以明白并实现。下面就是创建索引还有搜索的小实例。

首先是先建立几个txt文件,来创建索引。文件里面也就几个英文单词而已

其次简历索引,代码如下

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;

public class IndexProcessor {
	public static String index_store_path = "F:\\2013summer搜索引擎\\index\\prac2013_07_26";
	private IndexWriter writer;
	private Analyzer analyzer=new StandardAnalyzer(Version.LUCENE_43);
	public void createIndex(String filePath,String openDir) throws IOException {
		try {
			//使用工厂函数创建directory实例
			Directory d = SimpleFSDirectory.open(new File(filePath));
			IndexWriterConfig config=new IndexWriterConfig(Version.LUCENE_43, analyzer);
			writer = new IndexWriter(d, config);
			config.setOpenMode(OpenMode.CREATE);
			writeIndex(openDir);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public Document getDocument(File f){
		if(!f.getName().endsWith(".txt")){
			return null;
		}
		try {
			Document doc=new Document();
			InputStream is=new FileInputStream(f);
			BufferedReader reader=new BufferedReader(new InputStreamReader(is));
			//两个field,然后加到document里面。document其实也就是管理field的。
                        Field pathField = new StringField("path", f.getAbsolutePath(),Field.Store.YES);
			Field contenField = new TextField("contents", reader);
			doc.add(pathField);
			doc.add(contenField);
			return doc;
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		return null;
	}
	
	public void writeIndex(String openDir) throws IOException{
		File f=new File(openDir);
		//如果是文件夹
		if(f.isDirectory()){
			String[] temp=f.list();
			for(int i=0;i<temp.length;i++){
				File file=new File(f,temp[i]);
				Document doc=getDocument(file);
				System.out.println("正在建立索引 : " + file + "");
				if(null!=doc){
					writer.addDocument(doc);	
				}
			}
		}
		
	}
	
	public void close() throws Exception {
		writer.close();
	}

	public static void main(String[] args) {
		IndexProcessor index=new IndexProcessor();
		try {
			index.createIndex(index_store_path, "F:\\2013summer搜索引擎\\test");                      
			//注意:一定要close,不close的话,那么在内存中出不来,索引是建立不好的
                        index.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 analyzer我选择standardanalyzer,对于以上一些细节部分,会在今后说明。说明一点的是,如果没有close的话,那么索引没有建立好是会上锁的,在文件夹里会有一个write.lock文件。

接下来是搜索实例:

import java.io.File;
import java.util.Date;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
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.SimpleFSDirectory;
import org.apache.lucene.util.Version;

public class SearchTool {
	// 声明一个IndexSearcher对象
	private IndexSearcher searcher = null;
	// 声明一个Query对象
	private Query query = null;
	private String field = "contents";
	
	public SearchTool() {
		try {
			IndexReader reader = DirectoryReader.open(SimpleFSDirectory.open(new File("F:\\2013summer搜索引擎\\index\\prac2013_07_26")));
			searcher = new IndexSearcher(reader);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
    //返回查询结果 
	public final TopDocs search(String keyword) {
		System.out.println("正在检索关键字 : " + keyword);
		try {
			Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);
			QueryParser parser = new QueryParser(Version.LUCENE_43, field,analyzer);
			// 将关键字包装成Query对象
			query = parser.parse(keyword);
			Date start = new Date();
			TopDocs results = searcher.search(query, 5 * 2);
			Date end = new Date();
			System.out.println("检索完成,用时" + (end.getTime() - start.getTime())
					+ "毫秒");
			return results;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
      //打印结果
	public void printResult(TopDocs results) {
		ScoreDoc[] h = results.scoreDocs;
		if (h.length == 0) {
			System.out.println("对不起,没有找到您要的结果。");
		} else {
			for (int i = 0; i < h.length; i++) {
				try {
					Document doc = searcher.doc(h[i].doc);
					System.out.print("这是第" + i + "个检索到的结果,文件名为:");
					System.out.println(doc.get("path"));
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		System.out.println("--------------------------");
	}
	public static void main(String[] args) throws Exception {
		SearchTool test = new SearchTool();
		TopDocs h = null;
		h = test.search("haha");
		test.printResult(h);
	}
}

 最后的结果是:

正在检索关键字 : haha

检索完成,用时855毫秒

这是第0个检索到的结果,文件名为:F:\2013summer搜索引擎\test\2.txt

这是第1个检索到的结果,文件名为:F:\2013summer搜索引擎\test\lu.txt

--------------------------

正解,接下来关于lucene的搜索还会有篇幅来介绍。

 

分享到:
评论

相关推荐

    Lucene入门与使用

    Lucene入门与使用,非常简单,适合入门

    lucene入门小例子

    这个“lucene入门小例子”很可能是为了帮助初学者理解并掌握Lucene的基本用法而设计的一系列示例代码。 Lucene的核心概念包括索引、文档、字段和查询。首先,你需要理解索引的概念,它类似于传统数据库中的索引,但...

    lucene 入门

    `lucene入门小实例.txt` 文件中可能包含了一个简单的Lucene使用示例,例如: 1. 创建 `Directory` 对象,比如使用 `FSDirectory.open()` 打开一个文件系统的目录来存储索引。 2. 实例化 `Analyzer`,如使用 `...

    lucene3.6的入门案例

    **Lucene 3.6 入门案例** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它提供了完整的搜索功能,包括索引、查询、评分等,广泛应用于各种项目和产品中。在这个入门案例中,我们将深入理解如何...

    lucene 入门资料包

    以上是Lucene入门的基本知识和关键概念,通过深入学习和实践,你可以掌握如何利用Lucene构建强大的全文搜索引擎。记住,实践中遇到的问题往往是最好的学习资源,不断尝试和解决,你将逐渐成为Lucene的专家。

    Lucene入门学习文档

    **Lucene入门学习文档** **一、什么是Lucene** Lucene是Apache软件基金会下的一个开源全文检索库,它提供了一个高性能、可扩展的信息检索服务。Lucene最初由Doug Cutting开发,现在已经成为Java社区中事实上的标准...

    Lucene入门demo

    这个“Lucene入门demo”将帮助我们理解如何使用 Lucene 进行基本的索引和搜索操作。 **一、Lucene 的核心概念** 1. **索引(Indexing)**: 在 Lucene 中,索引是文档内容的预处理结果,类似于数据库中的索引。通过...

    [Lucene] Lucene入门心得

    【Lucene】Lucene入门心得 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个简单的API,使得开发者可以方便地在自己的应用程序中集成全文检索功能。...

    全文搜索引擎lucene入门

    **全文搜索引擎Lucene入门** 全文搜索引擎Lucene是Apache软件基金会的一个开放源代码项目,它为Java开发者提供了一个高性能、可扩展的信息检索库。Lucene以其强大的文本搜索功能和高效的索引能力,在各种需要全文...

    Lucene-入门

    **标题:“Lucene-入门”** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发并维护。它是Java编写的一个开源项目,被广泛应用于构建搜索引擎或者在大型数据集上进行全文检索。Lucene提供了丰富的搜索...

    lucene.net+完全入门教程

    通过学习这个“lucene.net+完全入门教程”,开发者可以了解如何在.NET环境中设置Lucene.Net项目,创建和管理索引,编写查询,优化搜索性能,并掌握如何处理搜索结果。教程可能涵盖从安装步骤、基本概念介绍,到实战...

    lucene入门指南

    **Lucene 入门指南** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发并维护。它是 Java 开发人员用来构建搜索引擎应用程序的基础工具。本指南将帮助初学者理解 Lucene 的核心概念,以及如何利用它来...

    lucene入门

    lucene入门相关知识,包括基本介绍、简单示例、核心API介绍。

    Lucene 简单入门程序实例

    标题与描述:“Lucene简单入门程序实例”这一标题与描述明确指出文章将引导读者通过一个实际的示例来了解和掌握Lucene的基本操作。Lucene是一个高性能、全功能的文本搜索引擎库,它允许用户对文档进行索引和搜索。本...

    lucene.net 完全入门教程

    lucene.net 完全入门教程,包括 lucene.net 介绍, lucene.net工作模式, lucene.net分词方法和中文分词方法, lucene.net索引的建立详解, lucene.net搜索详解, lucene.net的下载方法, lucene.net搜索结果实现...

    Lucene使用lucene入门[归类].pdf

    【Lucene 概述】 Lucene 是一个开源的全文搜索引擎框架,主要负责处理文本数据的检索和搜索。作为一款开发工具,它不直接提供类似百度或Google Desktop的现成产品,而是为开发者提供了构建自定义搜索应用的基础。...

Global site tag (gtag.js) - Google Analytics