`

初识lucene

阅读更多

Lucene 简介

Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。

目前已经有很多应用程序的搜索功能是基于 Lucene 的,比如 Eclipse 的帮助系统的搜索功能。Lucene 能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转化的文本的,Lucene 就能对你的文档进行索引和搜索。比如你要对一些 HTML 文档,PDF 文档进行索引的话你就首先需要把 HTML 文档和 PDF 文档转化成文本格式的,然后将转化后的内容交给 Lucene 进行索引,然后把创建好的索引文件保存到磁盘或者内存中,最后根据用户输入的查询条件在索引文件上进行查询。不指定要索引的文档的格式也使 Lucene 能够几乎适用于所有的搜索应用程序。

 

索引和搜索

索引是现代搜索引擎的核心,建立索引的过程就是把源数据处理成非常方便查询的索引文件的过程。为什么索引这么重要呢,试想你现在要在大量的文档中搜索含有某个关键词的文档,那么如果不建立索引的话你就需要把这些文档顺序的读入内存,然后检查这个文章中是不是含有要查找的关键词,这样的话就会耗费非常多的时间,想想搜索引擎可是在毫秒级的时间内查找出要搜索的结果的。这就是由于建立了索引的原因,你可以把索引想象成这样一种数据结构,他能够使你快速的随机访问存储在索引中的关键词,进而找到该关键词所关联的文档。Lucene 采用的是一种称为反向索引(inverted index)的机制。反向索引就是说我们维护了一个词/短语表,对于这个表中的每个词/短语,都有一个链表描述了有哪些文档包含了这个词/短语。这样在用户输入查询条件的时候,就能非常快的得到搜索结果。我们将在本系列文章的第二部分详细介绍 Lucene 的索引机制,由于 Lucene 提供了简单易用的 API,所以即使读者刚开始对全文本进行索引的机制并不太了解,也可以非常容易的使用 Lucene 对你的文档实现索引。

对文档建立好索引后,就可以在这些索引上面进行搜索了。搜索引擎首先会对搜索的关键词进行解析,然后再在建立好的索引上面进行查找,最终返回和用户输入的关键词相关联的文档。

 

创建索引:

 

package org.apache.lucene;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
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.IndexWriter;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

/**
 * 创建索引
 * 
 * @author zxf_noimp
 * 
 */

public class TxtFileIndexer {
	
	/**
	 * 创建索引文件
	 * @param dataFile  文本文件存放的目录
	 * @param indexFile  生成的索引文件存放的目录
	 * @throws Exception
	 */
	public void fileIndexer(String dataFile,String indexFile) throws Exception{
		 	File  indexDir = new File(indexFile);
	        File  dataDir  = new File(dataFile);
	        File[] dataFiles  = dataDir.listFiles();
	        IndexWriter indexWriter = new IndexWriter(FSDirectory.open(indexDir), new StandardAnalyzer(Version.LUCENE_CURRENT), true, IndexWriter.MaxFieldLength.LIMITED);
	        for(int i = 0; i < dataFiles.length; i++){
	        	if(dataFiles[i].isFile() && dataFiles[i].getName().endsWith(".txt")){
	        		System.out.println("Indexing file " + dataFiles[i].getCanonicalPath());
	        		Document document = new Document();
	        		document.add(new Field("path",dataFiles[i].getCanonicalPath(), Field.Store.YES, Field.Index.NOT_ANALYZED));
	        		document.add(new Field("filename",dataFiles[i].getName(), Field.Store.YES, Field.Index.NOT_ANALYZED));
	        		document.add(new Field("content",TxtFileIndexer.loadFileToString(dataFiles[i]),Field.Store.YES, Field.Index.ANALYZED)); //ANALYZED
	        		indexWriter.addDocument(document);
	        	}
	        }
	        indexWriter.optimize();
	        indexWriter.close();
		
	}
	
	/**
	 * 读取文件内容
	 * @param file  文件对象 
	 * @return
	 */
	private static String loadFileToString(File file) {
		BufferedReader br = null;
		try {
			// 字符缓冲流,是个装饰流,提高文件读取速度
			br = new BufferedReader(new FileReader(file));
			StringBuffer sb = new StringBuffer();
			String line = br.readLine();
			while (null != line) {
				sb.append(line);
				line = br.readLine();
				//System.out.println(line);
			}
			return sb.toString();
		} catch (FileNotFoundException e) {
			System.out.println("文件不存在!");
			return null;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		} finally {
			try {
				br.close();
			} catch (IOException e) {
				System.out.println("关闭流出现异常");
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) throws Exception {
		TxtFileIndexer indexer = new TxtFileIndexer();
		indexer.fileIndexer("G:\\luceneData", "G:\\luceneIndex");
	}
	
}

 对索引进行检索

package org.apache.lucene;

import java.io.File;
import java.io.IOException;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory;

/**
 * 对索引进行搜索
 * 
 * @author zxf_noimp
 * 
 */
public class TxtFileSearcher {

	public void fileSearcher(String queryStr,String indexPath) throws IOException {
		
		// 生成的索引文件存放的位置
		File indexDir = new File(indexPath);
		FSDirectory directory = FSDirectory.open(indexDir);
		// 对目录下的索引文件进行搜索
		IndexSearcher searcher = new IndexSearcher(directory);
		if (!indexDir.exists()) {
			System.out.println("The Lucene index is not exist");
			return;
		}
		// 构造了一个Term对象,通过这个Term对象,我们指定了要在文档的内容中搜索包含关键词"我"的文档
		Term term = new Term("content", queryStr.toLowerCase());
		// 利用这个Term对象构造出TermQuery对象并把这个TermQuery对象传入到IndexSearcher的search方法中进行查询
		TermQuery luceneQuery = new TermQuery(term);
		TopDocs ts = searcher.search(luceneQuery, 100); // 老版本中 Hits hits = searcher.search(luceneQuery);
		System.out.println("数量:" + ts.totalHits);
		ScoreDoc[] hits = ts.scoreDocs;
		for (int i = 0; i < hits.length; i++) {
			Document document = searcher.doc(hits[i].doc);
			System.out.println("FilePath: " + document.get("path"));
			System.out.println("FileContent:"+ document.getField("content").stringValue());
			System.out.println("FileName:"+ document.getField("filename").stringValue());
		}
	}

	public static void main(String[] args) throws Exception {
		TxtFileSearcher searcher = new TxtFileSearcher();
		searcher.fileSearcher("我", "G:\\luceneIndex");
	}
}

 

http://www.ibm.com/developerworks/cn/java/j-lo-lucene1/
http://www.ibm.com/developerworks/cn/web/wa-lucene2/
http://www.iteye.com/wiki/Lucene/1527-%E6%AD%A3%E5%9C%A8%E7%BF%BB%E8%AF%91%E4%B8%AD...
http://chinaxxren.iteye.com/blog/548505
http://www.chedong.com/tech/lucene.html
http://www.lucene.com.cn/about.htm#_Toc43005315

分享到:
评论

相关推荐

    lucene in action 电子版

    - **章节1:初识Lucene** - **信息组织与访问的发展**:介绍了从最早的纸质图书到数字化时代的信息检索方式的变化,强调了现代搜索引擎技术的重要性。 - **Lucene是什么**: - **定义**:Lucene是一个高性能、全...

    深入理解Luncen搜索引擎开发

    第1章 Lucene初识 Lucene4入门精通实战课程概述 Lucene系统架构 第2章 Lucene索引 Lucene索引里有什么 Lucene索引深入 Lucene索引深入优化 Lucene索引搜索 第3章 Lucene搜索实战 Lucene搜索实战 Lucene搜索深入...

    Lucene 相关

    1. 初识Lucene: - 了解Lucene的基本组件,如Analyzer、Document、Field、IndexReader、IndexWriter、Query等。 - 学习如何创建简单的索引和搜索示例。 - 掌握基本的查询语法,如TermQuery、BooleanQuery、...

    java搜索引擎的设计与实现英文文献外文翻译.doc

    初识Lucene的人可能会误认为它是一个可以直接使用的应用程序,比如文件搜索程序、网络爬虫或网站搜索引擎。实际上,Lucene并非如此,它是一个软件库,更确切地说,是一个工具包,而不是一个完整的功能丰富的搜索应用...

    lucene(HelloWord)

    《Lucene:初识搜索引擎库的“Hello World”》 Lucene,作为Apache软件基金会的顶级项目,是一款高性能、全文本检索引擎库,被广泛应用于各类搜索引擎和信息检索系统中。它提供了完整的搜索功能,包括索引、查询、...

    Elasticsearch初识与简单案例.pdf

    ### Elasticsearch 初识与简单案例 #### 一、Elasticsearch简介 Elasticsearch 是一款基于 Lucene 的分布式全文搜索引擎,具有高度可扩展性及灵活性。它不仅支持文本搜索,还能进行复杂的数据分析任务,因此在众多...

    初识Hadoop 2.x.pdf

    Hadoop 是一个能够处理海量数据的开源软件框架,它最初由Apache Lucene项目演化而来,旨在解决大规模数据处理的问题。Hadoop 2.x 版本相比早期版本有了显著的改进和增强,特别是在性能、稳定性和安全性方面。 - **...

    Hadoop阶段初识学习笔记

    Doug Cutting是著名的开源搜索技术倡导者和创造者,他之前还创立了Lucene和Nutch等项目。 - **命名由来**:Hadoop这个名字来源于Cutting的孩子给一头玩具大象起的名字,它是一个非正式的名称,简单易记,没有特殊...

    藏经阁-Elastic Stack 实战手册(早鸟版)-1182.pdf

    Elasticsearch是基于Apache Lucene构建的开源全文搜索引擎,因其易于使用和高性能的特点深受开发者喜爱。它不仅支持实时搜索,还具备分布式、可扩展的特性,可以处理大规模数据。Elasticsearch不仅适用于传统的搜索...

    Elasticsearch入门讲解

    1. ELASTICSEARCH 初识 Elasticsearch(简称ES)是一款基于Lucene的开源分布式搜索引擎,以其强大的全文检索、实时分析和高可扩展性而闻名。它不仅用于传统的搜索功能,还广泛应用于日志分析、监控、物联网(IoT)...

    ES入门文档

    Elasticsearch(简称ES)是一款基于Lucene的开源搜索引擎。它为开发者提供了高效、可靠的搜索和数据分析能力,支持多种数据类型的实时索引与搜索。 **1.2 入门指南** - **1.2.1 初识ES** - Elasticsearch是一个...

    大数据培训课程安排.pdf

    第五阶段: 初识⼤数据 1. 难易程度:三颗星 2. 课时量(技术知识点+阶段项⽬任务+综合能⼒):80课时 3. 主要技术包括:⼤数据前篇(什么是⼤数据,应⽤场景,如何学习⼤数据库,虚拟机概念和安装等)、Linux常见...

Global site tag (gtag.js) - Google Analytics