基于lucene的案例开发:创建索引

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/42872711

从这篇博客开始,不论是API介绍还是后面的案例开发,都是基于 lucene4.3.1 这个版本,Lucene4.3.1 下载请点击这里, Lucene其他版本下载请点击这里,Lucene4.3.1官方API文档请点击这里

创建索引demo

在开始介绍之前,先看一个简单的索引创建demo程序:

 /**
 *@Description:   索引创建demo
 */
package com.lulei.lucene.study;  

import java.io.File;

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.Store;
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.FSDirectory;
import org.apache.lucene.util.Version;

public class IndexCreate {

	public static void main(String[] args) {
		//指定索引分词技术,这里使用的是标准分词
		Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);
		//indexwriter 配置信息
		IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_43, analyzer);
		//索引的打开方式,没有索引文件就新建,有就打开
		indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
		Directory directory = null;
		IndexWriter indexWrite = null;
		try {
			//指定索引硬盘存储路径
			directory = FSDirectory.open(new File("D://study/index/testindex"));
			//如果索引处于锁定状态,则解锁
			if (IndexWriter.isLocked(directory)){
				IndexWriter.unlock(directory);
			}
			//指定所以操作对象indexWrite
			indexWrite = new IndexWriter(directory, indexWriterConfig);
		} catch (Exception e) {
			e.printStackTrace();
		}

		//创建文档一
		Document doc1 = new Document();
		//对name域赋值“测试标题”,存储域值信息
		doc1.add(new TextField("name", "测试标题", Store.YES));
		//对content域赋值“测试标题”,存储域值信息
		doc1.add(new TextField("content", "测试内容", Store.YES));
		try {
			//将文档写入到索引中
			indexWrite.addDocument(doc1);
		} catch (Exception e) {
			e.printStackTrace();
		}

		//创建文档二
		Document doc2 = new Document();
		doc2.add(new TextField("name", "基于lucene的案例开发:索引数学模型", Store.YES));
		doc2.add(new TextField("content", "lucene将一篇文档分成若干个域,每个域又分成若干个词元,通过词元在文档中的重要程度,将文档转化为N维的空间向量,通过计算两个向量之间的夹角余弦值来计算两个文档的相似程度", Store.YES));
		try {
			//将文档写入到索引中
			indexWrite.addDocument(doc2);
		} catch (Exception e) {
			e.printStackTrace();
		}

		//将indexWrite操作提交,如果不提交,之前的操作将不会保存到硬盘
		try {
			//这一步很消耗系统资源,所以commit操作需要有一定的策略
			indexWrite.commit();
			//关闭资源
			indexWrite.close();
			directory.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

在上述的程序中,已做了详细的注释,对每一条语句的作用就不再介绍,下面就看一下执行这个main函数之后创建的索引文件,如下图:

通过索引查看工具 luke 可以简单的看下索引中的内容,如下图:

从上面两张图,我们可以看出索引中一共有两个文档,content域有50个词,name域有18个词,索引中存储了文档的详细信息。

创建索引核心类

在上述创建索引过程中,用到了几个核心类:IndexWriterDirectoryAnalyzerDocumentField

IndexWriter

IndexWriter(写索引)是索引过程中的核心组件,这个类负责创建新的索引或打开已有的索引以及向索引中添加、删除、更新被索引的文档信息;IndexWriter需要开辟一定空间来存储索引,该功能可以由Directory完成。

Directory

Directory类描述了Lucene索引的存放位置。它是一个抽象类,它的子类负责指定索引的存储路径,在前面的例子中,我们用的是FSDirectory.open方法来获取真实文件在文件系统中的存储路径,然后将他们依次传递给IndexWriter类构造方法。

Analyzer

文档信息在被索引之前需要经过Analyzer(分析器)处理,上述例子中使用的是标准分词,在以后的博客中会单独介绍各种分词器以及使用场景。

Document

Document对象的结构比较简单,为一个包含多个Field对象的容器,上述事例中的文档就包含两个域 name、 content。

Filed

索引中的每一个文档都包含一个或多个域不同命名的域,每个域都有一个域名和对应的域值以及一组选项来精确控制Lucene索引操作各个域值。在搜索时,所有域的文本就好像连接在一起,作为一个文本域来处理。

上述几个核心类在Lucene的操作中非常重要而且常用,如需要详细了解,还请参照官方API文档

时间: 2024-09-30 10:05:16

基于lucene的案例开发:创建索引的相关文章

基于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中已经实现了大

基于lucene的案例开发:索引文件结构

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/42836309 前面我们已经介绍了非结构数据的检索过程以及lucene的数学模型,这篇博客就主要介绍一下lucene索引的文件结构,下图是lucene生成的索引实例: lucene索引结构是层次结构,主要有以下几个层次: 索引(Index) 在lucene中,一个索引是放在一个文件夹中的,上述实例中的所有文件就组成了lucene索引 段(Segment) 一个索引中可以有很多段,

基于lucene的案例开发:索引数学模型

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/42818185 通过前一篇博客,对所以也许有了一个大致的了解,知道检索是一个怎样的过程,这篇博客就简单的介绍一下lucene实现的数学模型. 前面我们已经提到lucene实现的索引是一种反向索引,有词典和倒排表组成(实际的结构要比这个复杂很多),那索引的数学模型又是怎样的呢?在开始这个之前,还是先熟悉下几个名词.       文档(Document):上篇博客中的索引创建过程中列

基于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的案例开发:查询语句创建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/43982653 http://www.llwjy.com/blogd.php?id=63d4c488a2cccb5851c0498d374951c9 个人的博客小站也搭建成功,网址:www.llwjy.com/blog.php ,欢迎大家来吐槽~ 基本原理 在前面的博客中也说过,程序初始话索引文件是十分消耗系统资源的,因此要想实现实时索引就不能实时的去修改索引文件.重新加载索引文

基于lucene的案例开发:Query查询

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/42969443 在Lucene索引的搜索过程中,构建Query对象是一个十分重要的过程.对于Query的理解,可以把它想象成数据库SQL查询语句中的where条件(当然Query的功能要比sql强大很多),在这篇博客中,我们将重点介绍几种常用的Query子类:QueryParser. MultiFieldQueryParser.TermQuery .PrefixQuery. Ph

基于lucene的案例开发:IndexSearcher中检索方法

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/43052829 前面我们介绍了Analyzer和Query,这篇我们就开始该系列最后一个类IndexSearcher的搜索API介绍,Lucene中重点API不止这里介绍的这一点,还有IndexWriter.Field.Highlighter等,这些就不在这一部分做介绍了,如若案例中用到的话,再做简单介绍. 查看Lucene4.3.1中IndexSearcher的API请点击这里