lucene总结(一):lucene基础

在一般的结构化数据库中,一般去找一个字段的匹配,使用最多的就是like语句。这种情况下,就像在小时候妈妈给我买的新华字典里去一页页翻出自己的名字一样,效率相对的底下,较为快速的的方式是什么呢?就是通过新华字典的前面的索引来取找,而全文索引就是做的这样的一个工作。为你需要查找的"数据源"做各种的分析索引文件。这里的数据源可以是txt文件,图片文件等结构化的文件。而lucene是全文索引中比较优秀的第三方工具。

下载地址:

http://apache.fayea.com/lucene/java/5.1.0/

现在最新的版本是5.1. 项目需要,本文操作的是3.5版本。

几乎所有的全文索引框架都会有这样几个组成

1.索引部分

2.分词部分

3.搜索部分

初步了解lucene后,首先来直接入手一个demo。

所需jar

操作环境

MyEclipse 10.0

jdk1.7

创建索引

	package com.cfl.lucene;

	import java.io.File;
	import java.io.FileReader;
	import java.io.IOException;
	import java.io.Reader;

	import org.apache.lucene.analysis.standard.StandardAnalyzer;
	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.store.Directory;
	import org.apache.lucene.store.FSDirectory;
	import org.apache.lucene.store.LockObtainFailedException;
	import org.apache.lucene.util.Version;

	public class LuceneHello {
		public  static void  main(String[] args){
			new LuceneHello().createIndex();
		}
		public void createIndex(){

			//1.创建Directory
			Directory directory=null;
			IndexWriter writer=null;
			Reader reader=null;

			try {

				//存放索引的硬盘位置
				directory=FSDirectory.open(new File("E:\\Java\\lucene\\WP\\test02"));

			} catch (IOException e) {

				e.printStackTrace();

			}
			//2.创建indexWrite
			try {

				//配置指定的lucene版本及对应的分词器
				IndexWriterConfig writerConfig=new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35));

				writer=new IndexWriter(directory,writerConfig);

				//需要被lucene创建索引的文件目录
				File fs=new File("E:\\Java\\lucene\\WP\\testIndex");

				Document doc=null;

				//遍历文件目录下所有文件创建指定字段
				for(File f:fs.listFiles()){

					doc=new Document();
					reader=new FileReader(f);
					doc.add(new Field("name",f.getName(),Field.Store.YES,Field.Index.NOT_ANALYZED));
					doc.add(new Field("content",reader));

					//3.写入索引字段到文件
					writer.addDocument(doc);

				}

				System.out.println("索引创建成功");

			} catch (CorruptIndexException e) {
				System.out.println("索引创建失败!");
				e.printStackTrace();
			} catch (LockObtainFailedException e) {
				System.out.println("索引创建失败!");
				e.printStackTrace();
			} catch (IOException e) {
				System.out.println("索引创建失败!");
				e.printStackTrace();
			}finally{

				//关闭writer对象
				if(writer!=null){
					try {
						writer.close();
					} catch (CorruptIndexException e) {
						e.printStackTrace();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
				//关闭reader对象
				if(reader!=null){
					try {
						reader.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}

创建索引的基本步骤:

1.创建用于存放索引文件的Directory

2.创建用于写入索引文件夹IndexWrite

3.将创建索引写入document文件中

基本为以上三个步骤,能够按照三个步骤去将代码实现即可。当然会涉及到一些具体的细节,比如分词器的选择、是否存储、存储在硬盘还是内存等。在后面的文章中会一一分享。

搜索索引

	public void searcher(){

			//1.创建directory
			try {

				Directory dir=FSDirectory.open(new File("E:\\Java\\lucene\\WP\\testIndex\\index"));

				//2.创建indexReader
				IndexReader ireader=IndexReader.open(dir);

				//3.根据indexReader创建searcher
			    IndexSearcher searcher=new IndexSearcher(ireader);

				//4.创建query
			    QueryParser parser=new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));

			   	//传入搜索的关键词 hello
				Query query=parser.parse("BEGIN");

				//5.根据search搜索返回topdocs
			    TopDocs topDoc=searcher.search(query, 10);

				//6.根据topdocs获取scoredoc对象
			    ScoreDoc[] sds=topDoc.scoreDocs;

				//7.根据searcher和scoredoc对象获取具体的document对象
			    for(ScoreDoc sd:sds){

			    	Document document=searcher.doc(sd.doc);

			    	//8.根据document对象获取具体的值
				    System.out.println(document.get("filename")+document.get("path"));

			    }

			} catch (IOException e) {			

				e.printStackTrace();

			}
			catch (ParseException e) {

				e.printStackTrace();

			}

		}

针对搜索,相对简单。类似在jdbc的查询过程,创建query,为query指定关键词。

调试日志

java.io.FileNotFoundException:E:\upload\construct\2014-07-16\7\index (拒绝访问。)

answer:

那是因为我的文件夹里套有文件夹导致的缘故。不能递归查找。所以对于文档和索引分开存放即可。

时间: 2024-10-23 11:13:17

lucene总结(一):lucene基础的相关文章

Lucene全文检索之-Lucene基础

Lucene是全文检索引擎 一.在学习Lucene之前我们先思考下,Lucene存在的意义. 1.在之前我们的应用场景中,基于数据库的检索,我们使用like语法进行.但是基于like语法效率低下.达不到我们对应用的使用要求. 而使用Lucene对我们的数据建立索引效率高速度快,满足企业要求. 我们使用Lucene先对整个结构建立索引库,然后根据索引去查找我们需要匹配的内容,效率高速度快,方便我们快速检索信息-这也是Lucene存在的目的. 2.有些查找数据库做不了,比如我们想查找附件中内容的匹配

【Lucene】Apache Lucene全文检索引擎架构之中文分词和高亮显示

前面总结的都是使用Lucene的标准分词器,这是针对英文的,但是中文的话就不顶用了,因为中文的语汇与英文是不同的,所以一般我们开发的时候,有中文的话肯定要使用中文分词了,这一篇博文主要介绍一下如何使用smartcn中文分词器以及对结果的高亮显示. 1. 中文分词 使用中文分词的话,首先到添加中文分词的jar包. <!-- lucene中文分词器 --> <dependency> <groupId>org.apache.lucene</groupId> <

【Lucene】Apache Lucene全文检索引擎架构之入门实战

Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供.Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻.在Java开发环境里Lucene是一个成熟的免费开源工具.就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库.--<百度百科> 这篇博文主要从两个方面出发,首先介绍一下Lucene中的全文搜索原理,其次通过程序示例来展现如何使用Lucene.关于全文搜索原理部分我上网搜索了一下,也看了好几篇文章,最后在写这篇文

【Lucene】Apache Lucene全文检索引擎架构之构建索引

上一篇博文中已经对全文检索有了一定的了解,这篇文章主要来总结一下全文检索的第一步:构建索引.其实上一篇博文中的示例程序已经对构建索引写了一段程序了,而且那个程序还是挺完善的.不过从知识点的完整性来考虑,我想从Lucene的添加文档.删除文档.修改文档以及文档域加权四个部分来展开对构建索引的总结,也便于我后期的查看.会重点分析一下删除文档(因为有两中方式)和文档域加权这(实际中会用到比较多)两个部分. 1. 准备阶段 新建一个maven工程,pom.xml如下: <project xmlns=&quo

【Lucene】Apache Lucene全文检索引擎架构之入门实战1

Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供.Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻.在Java开发环境里Lucene是一个成熟的免费开源工具.就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库.——<百度百科> 这篇博文主要从两个方面出发,首先介绍一下Lucene中的全文搜索原理,其次通过程序示例来展现如何使用Lucene.关于全文搜索原理部分我上网搜索了一下,也看了好几篇文章,最后在写这篇文

【Lucene】Apache Lucene全文检索引擎架构之搜索功能

上一节主要总结了一下Lucene是如何构建索引的,这一节简单总结一下Lucene中的搜索功能.主要分为几个部分,对特定项的搜索:查询表达式QueryParser的使用:指定数字范围内搜索:指定字符串开头搜索以及多条件查询. 1. 对特定项的搜索 要使用Lucene的搜索功能,首先得有索引,也就是说Lucene首先得针对特定的文件生成特定的索引,然后我们才能搜索,这在第一节里描述的很清楚,那么构建索引的例子也是使用第一节中的例子,在这就不再赘述了,然后生成了索引后,如何来搜索呢?先看第一种搜索方式

lucene 例子,lucene demo, lucene 教程

查了很多lucene资料,就纳闷为啥不能分享个简单的例子,我在这里自己写了一个 lucene实现其实很简单,先建立索引,在进行搜索,easy! 下载jar包,链接在这里:http://download.csdn.net/detail/dannor2010/8183641   项目中导入lib即可,不多说了. 前期:创建两个txt文件, C:\\source C:\\index source 中建立txt文件,输入你想要测试搜索的String类型内容. 1.建立索引,代码如下 package co

Lucene学习:Lucene测试工具Luke

1. 测试工具Luke Luke是一个用于Lucene/Solr/Elasticsearch 搜索引擎的,方便开发和诊断的 GUI(可视化)工具. github地址:https://github.com/DmitryKey/luke 下载地址:https://github.com/DmitryKey/luke/releases 1.1. Luke下载安装 下载完成后,解压:双击luke.bat Luke使用介绍 选择有索引的目录打开: 接下来便可以查看索引库的信息: 1.2. 版本问题 使用lu

Lucene学习:lucene查询

1.1. Lucene查询 在学习Lucene的查询方法前,先了解一下下面几个类: 1.1.1. Query 封装某种查询类型的具体子类,配置查询的查询条件.Query实例将被传递给IndexSearcher的search方法.下面是常用的Query子类: l 通过项进行搜索 TermQuery类 l 在指定的项范围内搜索 TermRangeQuery类 l 通过字符串搜索 PrefixQuery类 l 组合查询 BooleanQuery类 l 通过短语搜索 PhraseQuery类 l 通配符

Lucene 基础理论

1. 全文检索系统与Lucene简介 1.1 什么是全文检索与全文检索系统 全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式.这个过程类似于通过字典中的检索字表查字的过程. 全文检索的方法主要分为按字检索和按词检索两种.按字检索是指对于文章中的每一个字都建立索引,检索时将词分解为字的组合.对于各种不同的语言而言,字有不同的含义,比如英文中字与词实际上