`

Lucene入门示例

阅读更多
主要参考了Lucene的官方示例
环境:Win7 + JDK1.6 + Eclipse37
Lucene版本:3.5
官方:http://www.apache.org/dyn/closer.cgi
检索的基本概念
一 信息检索:从信息集合中打找出与用户相关的信息.
1  信息检索的分类
全文检索:把用户的查询请求和全文中的每一个词进行比较不考虑查询请求与文本语义的匹配。
数据检索:查询要求和信息系统中的数据都有一定的结构,语义匹配能力差.
知识检索:强调基于知识语义上的匹配
说明以下介绍来自于百科名片,http://baike.baidu.com/view/371811.htm
二 Lucene介绍
Lucene是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎.Lucene的原作者是Doug Cutting,他是一位资深全文索引/检索专家.
优点如下:
1 索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。、
2 在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。
3 设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。
4 Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search[11])、分组查询等.
三 工程图片如下,所用jar文件包含:lucene-core-3.5.0.jar,lucene-analyzers-3.5.0.jar.

四 想要搜索任何内容,必须先收集数据,建立索引库,之后才能进行搜索。
具体实现类如下:
package net.liuzd.lucene.test;

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

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.Filter;
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.junit.Test;

public class IndeSearchFiles {
		
	/**
	 * 创建索引
	 * @throws IOException 
	 * @throws CorruptIndexException 
	 * */
	@Test
	public void createIndex() throws Exception{
	
		//操作增,删,改索引库的
		IndexWriter writer = LuceneUtils.createIndexWriter(OpenMode.CREATE);		
		//数据源的位置
		File sourceFile = LuceneUtils.createSourceFile();
		System.out.println("文件路径:" + sourceFile.getAbsolutePath());
		//进行写入文档		
		Document doc = new Document();
		 doc.add(new Field("name",sourceFile.getName(),Field.Store.YES, Field.Index.ANALYZED_NO_NORMS));
		//文件路径
        Field pathField = new Field("path", sourceFile.getPath(), Field.Store.YES, Field.Index.NO);
        pathField.setIndexOptions(org.apache.lucene.index.FieldInfo.IndexOptions.DOCS_ONLY);
        doc.add(pathField);
        //文件最后修改时间
        doc.add(new Field("modified",String.valueOf(sourceFile.lastModified()),Field.Store.YES, Field.Index.NO));
        //添加文件内容
        String content = LuceneUtils.readFileContext(sourceFile);
        System.out.println("content: " + content);
        doc.add(new Field("contents",content,Field.Store.YES, Field.Index.ANALYZED));
        //以下是官网的实现
       /* FileInputStream fis = new FileInputStream(sourceFile);
        doc.add(new Field("contents", new BufferedReader(new InputStreamReader(fis, "UTF-8"))));*/
        
        if (writer.getConfig().getOpenMode() == IndexWriterConfig.OpenMode.CREATE)
        {
           writer.addDocument(doc);
        }
        else
        {
          writer.updateDocument(new Term("path", sourceFile.getPath()), doc);
        }		
		//释放资源
        writer.close();
       // fis.close();
		
	}
	
	/***
	 * 搜索
	 * */
	@Test
	public void search() throws Exception{
		
		//查询的字符串:输入不存在的字符串是查询不到的,如:中国
		String queryString = "Lucene";
		//查询字段集合
		String [] queryFileds = {"contents"};		
		IndexSearcher searcher = LuceneUtils.createIndexSearcher();		
		Query query = LuceneUtils.createQuery(queryFileds, queryString);
		//在搜索器中进行查询
		//对查询内容进行过滤
		Filter filter = null;
		//一次在索引器查询多少条数据
		int queryCount = 100;
		TopDocs results = searcher.search(query,filter,queryCount);
		System.out.println("总符合: " + results.totalHits + "条数!");
		
		//显示记录
		for(ScoreDoc sr : results.scoreDocs){
			//文档编号
			int docID = sr.doc;
			//真正的内容
			Document doc = searcher.doc(docID);
			System.out.println("name = " + doc.get("name"));
			System.out.println("path = " + doc.get("path"));
			System.out.println("modified = " + doc.get("modified"));
			System.out.println("contents = " + doc.get("contents"));			
		}		
	}
}

工具类代码如下:
package net.liuzd.lucene.test;

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

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

public class LuceneUtils {

	//当前目录位置
	public static final String USERDIR = System.getProperty("user.dir");
	//存放索引的目录
	private static final String INDEXPATH = USERDIR + File.separator + "index";
	//数据源
	private static final String INDEXSOURCE = USERDIR + File.separator
			+ "source" + File.separator + "lucene.txt";
	//使用版本
	public static final Version version = Version.LUCENE_35;
	
	/**
	 * 获取分词器
	 * */
	public static Analyzer getAnalyzer(){
		// 分词器
		Analyzer analyzer = new StandardAnalyzer(version);
		return analyzer;
	}

	/**
	 * 创建一个索引器的操作类
	 * 
	 * @param openMode
	 * @return
	 * @throws Exception
	 */
	public static IndexWriter createIndexWriter(OpenMode openMode)
			throws Exception {
		// 索引存放位置设置
		Directory dir = FSDirectory.open(new File(INDEXPATH));		
		// 索引配置类设置
		IndexWriterConfig iwc = new IndexWriterConfig(version,
				getAnalyzer());
		iwc.setOpenMode(openMode);
		IndexWriter writer = new IndexWriter(dir, iwc);
		return writer;
	}

	/***
	 * 创建一个搜索的索引器
	 * @throws IOException 
	 * @throws CorruptIndexException 
	 * */
	public static IndexSearcher createIndexSearcher() throws CorruptIndexException, IOException {
		IndexReader reader = IndexReader.open(FSDirectory.open(new File(INDEXPATH)));
		IndexSearcher searcher = new IndexSearcher(reader);
		return searcher;
	}

	/**
	 * 创建一个查询器
	 * @param queryFileds  在哪些字段上进行查询
	 * @param queryString  查询内容
	 * @return
	 * @throws ParseException
	 */
	public static Query createQuery(String [] queryFileds,String queryString) throws ParseException{
		 QueryParser parser = new MultiFieldQueryParser(version, queryFileds, getAnalyzer());
		 Query query = parser.parse(queryString);
		 return query;
	}
	
	/***
	 * 读取文件内容
	 * */
	public static String readFileContext(File file){
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
			StringBuilder content = new StringBuilder();
			for(String line = null; (line = br.readLine())!= null;){
				content.append(line).append("\n");
			}
			return content.toString();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	
	}
	
	
	public static void main(String[] args) {

		System.out.println(Thread.currentThread().getContextClassLoader()
				.getResource(""));
		System.out.println(LuceneUtils.class.getClassLoader().getResource(""));
		System.out.println(ClassLoader.getSystemResource(""));
		System.out.println(LuceneUtils.class.getResource(""));
		System.out.println(LuceneUtils.class.getResource("/")); // Class文件所在路径
		System.out.println(new File("/").getAbsolutePath());
		System.out.println(System.getProperty("user.dir"));
	}

	/**
	 * 创建索引的数据源
	 * 
	 * @return
	 */
	public static File createSourceFile() {
		File file = new File(INDEXSOURCE);
		return file;
	}
}

附件有工程源码与jar文件




  • 大小: 31.4 KB
分享到:
评论
7 楼 qq375805303 2015-01-18  
写得不错,thx楼主!
6 楼 ly_ltw 2013-10-25  
但是符合的条数不对啊,为什么每次都是 总符合: 1条数!???
5 楼 freedom_sunshine 2013-05-09  
4 楼 wangchm168 2012-07-24  
写的不错,学习学习~
3 楼 maolin 2012-04-11  
写的很详细,楼主的文章对我学习lucene有很大的帮助。
2 楼 liuzidong 2012-03-19  
互相学习了!
1 楼 SwordShadow 2012-03-19  
楼主写的很好,很受益

相关推荐

    lucene入门代码示例

    最受欢迎的java开源全文搜索引擎开发工具包。 提供了完整的查询引擎和... Lucene的目的是为软件开发人员提供一个简单易用的工具包, 以方便在目标系统中实现全文检索功能, 或者是以此为基础建立起完整的全文检索引擎。

    lucene 入门

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

    lucene入门小例子

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

    Lucene5学习之创建索引入门示例

    **Lucene5学习之创建索引入门示例** 在IT领域,搜索引擎的开发与优化是一项关键技术,而Apache Lucene作为一款高性能、全文本搜索库,是许多开发者进行文本检索的首选工具。本文将深入探讨如何使用Lucene5来创建一...

    全文检索系统(Lucene)

    `LuceneDemoSrc`可能是包含一个Lucene入门示例项目的压缩文件,它可能包括以下部分: 1. **源码**:展示了如何创建和使用Lucene索引,以及如何执行搜索。 2. **配置文件**:可能包含Analyzer的配置,用于定制化分词...

    Lucene 4.8全文检索引擎入门示例文档

    《Lucene 4.8 全文检索引擎入门详解》 Lucene 是一款开源的全文检索库,由 Apache 软件基金会维护。在版本 4.8 中,Lucene 提供了强大的文本分析、索引构建和搜索功能,使得开发者能够轻松地在应用程序中集成高效的...

    lucene 入门资料包

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

    lucene入门

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

    lucene入门到项目开发.docx

    《Lucene入门到项目开发》 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个简单但功能强大的API,可以帮助开发者快速实现对文本数据的检索和分析。 一...

    lucene入门基础教程

    ### Lucene 入门基础教程知识点详解 #### 一、Lucene简介 - **定义**:Lucene是一款高性能、全功能的文本搜索引擎库,由Java编写而成,属于Apache项目的一部分。 - **适用场景**:适合于任何需要进行全文检索的应用...

    lucene入门体会

    完成以上步骤,你就成功运行了Lucene的示例,可以输入关键词进行搜索,如果测试文件中包含相关关键字,就会显示出匹配的文档。 另外,如果你想体验Web界面的Lucene搜索,可以将 `luceneweb.war` 文件复制到Tomcat的...

    Lucene 简单入门程序实例

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

    一个经典Lucene入门模块及例子解析

    在这个经典Lucene入门模块中,我们将深入理解如何使用Lucene进行索引创建和搜索操作。 首先,我们来看Lucene如何建立数据的索引。这通常涉及以下几个步骤: 1. **索引创建**:使用 `IndexWriter` 对象来创建或更新...

    Lucene入门指南

    ### Lucene入门指南 #### 一、Lucene简介 **Lucene** 是一款高性能的全文检索引擎工具包,由 **Apache 软件基金会** 的 **Jakarta 项目组** 开发并维护。作为一款完全开放源代码的工具,Lucene 提供了一系列的功能...

Global site tag (gtag.js) - Google Analytics