Lucene整理--索引的建立

看lucene主页(http://lucene.apache.org/)上眼下lucene已经到4.9.0版本号了, 參考学习的书是依照2.1版本号解说的,写的代码样例是用的3.0.2版本号的,版本号

的不同导致有些方法的使用差异,可是大体还是同样的。

源码用到的jar包(3.0.2版本号)下载地址

參考资料:

1、公司内部培训资料

2、《Lucene搜索引擎开发权威经典》于天恩著.

Lucene使用挺简单的,耐心看完都能学会,还有源码。

一、创建索引的基本方式

全部开源搜索引擎的基本架构和原理都是类似的,Lucene也不例外,用它来建立搜索引擎也是要解决的四个基本问题:抓取数据、解析数据、创建索引和运行搜索。

1、理解创建索引的过程

參考书中对索引的创建有一个非常形象的比喻:

创建索引的过程能够类比为写文集。以下以文集的写作为例进行解说,文集里面有很多文章,每一篇文章包含标题、内容、作品名称、写作时间等信息。

我们採用下面的方式来写这本文集:先写文章,再将文章整合起来。

首先为每一篇文章加入标题、内容、写作时间等信息,从而写好一篇文章。

然后把每一篇文章加入到书里面去,这样文集就写好了。

文集的结构例如以下图所看到的:按从左到右的方向,是读文集,即打开一本书,然后翻阅里面的文章。按从右到左的方向是写文集。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2FvaGFpY2hlbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

创建索引的步骤例如以下:

(1)、建立索引器IndexWriter。这相当于一本书的框架

(2)、建立文档对象Document,这相当于一篇文章

(3)、建立信息字段对象Field,这相当于一篇文章中的不同信息(标题、正文等)。

(4)、将Field加入到Document里面。

(5)、将Document加入到IndexWriter里面。

(6)、关闭索引器IndexWriter。

例如以下图所看到的是一个索引的结构,按从左到右是读索引(即搜索)。按从右到左是创建索引:

依照上图所看到的的结构,创建索引有三个主要的步骤:

(1)、创建Field,将文章的不同信息包装起来

(2)、将多个Field组织到一个Document里面。这样完毕了对一篇文章的包装。

(3)、将多个Document组织到一个IndexWriter里面,也就是将多个文章组装起来,终于形成索引

以下的三个小节就依照创建索引的基本步骤来解说创建索引的详细方法。

2、创建Field

创建Field的方法有很多。以下是最经常使用的方法。

Field field=new Field(Field名称,Field内容,存储方式,索引方式);

这四个參数的含义例如以下:

(1)、Field名称就是为Field起的名字。类似于数据表的字段名称。

(2)、Field内容就是该Field的内容,类似数据库表的字段内容。

(3)、存储方式包含三种:不存储(Field.Store.NO)、全然存储(Field.Store.YES)和压缩存储(Field.Store.COMPRESS)。

通常。假设不操心索引太大的话。能够都使用全然存储的方式。

可是。出于对性能的考虑。索引文件的内容是越小越好。因此。假设Field的内容非常少就採用全然存储(如标

题),假设Field的内容非常多就採用不存储或压缩存储的方式,如正文。

(4)、索引的方式包含四种:

不索引(Field.Index.NO)、索引但不分析(Field.Index.NO_NORMS)、索引但不分词(Field.Index.UN_TOKENIZED)、分词并索引(Field.Index.TOKENIZED)。

3、创建Document

创建Document方法例如以下:

Document doc=new Document();

这种方法用来创建一个不含有不论什么Field的空Document。

假设想把Field加入到Document里面,仅仅须要add方法。比如doc.add(field);

反复的使用就能够将多个Field增加到一个Document里面。

4、创建IndexWriter

创建IndexWriter方式也不少,拿出一个经常使用的:

<span style="font-family:SimSun;font-size:12px;"><span style="font-family:SimSun;font-size:12px;">			File indexDir = new File("E:\\Index");
			Directory dir = new SimpleFSDirectory(indexDir);
			Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
			IndexWriter indexWriter = new IndexWriter(dir, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);</span></span>

关于几个參数的介绍:

(1)、Directory (文件夹类型) 该类是抽象类

它的直接子类在不同版本号中还是有差别的,我们直说3.0.2版本号,它的子类包含FSDirectory、RAMDirectory、FileSwitchDirectory、CompoundFileReader,两个子类代表着不同的两种文件夹类型

FSDirectory:文件系统中的一个路径,会直接将索引写入到磁盘上

RAMDirectory:内存中的一个区域,虚拟机退出后内容会随之消失,所以须要将RAMDirectory中的内容转到FSDirectory

FileSwitchDirectory:一个是用于能够同一时候在两个不同的文件夹中读取文件的FileSwitchDirectory,这是个代理类。

CompoundFileReader:是用户读取复合文件的CompoundFileReader。仅仅能读取扩展名为cfs的文件。(写扩展名为cfs的文件用CompoundFileWriter)CompoundFileReader仅在SegmentReader中被引用。

当中FSDirectory又分为3类:

A、windows下的SimpleFSDirectory

B、linux支持NIO的NIOFSDirectory

C、另一个是内存Map文件夹MMapDirectory

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2FvaGFpY2hlbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

(2)、Analyzer(分析器) 抽象类

负责对各种输入的数据源进行分析,包含过滤和分词等多种功能。

分析器是用来做词法分析的,包含英文分析器和中文分析器等。要依据所要建立的索引的文件情况选择合适的分析器。经常使用的有StandardAnalyzer(标准分析器)、CJKAnalyzer(二分法分词

器)、ChineseAnalyzer(中文分析器)等。

能够依据自己的须要去编辑分析器,从而处理不同 的语言文字(当然,我不会)。

IndexWriter创建完之后能够用addDocument()的方法将document对象放置到IndexWriter中:writer.addDocument(doc);

能够放置多个。

终于要调用close()方法关闭索引器,比如writer.close();

到此,创建索引的步骤就介绍完了,以下我们就该看实例了:

二、创建一个简单索引实例:

<span style="font-family:SimSun;font-size:12px;">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;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;

public class LuceneMainProcess {

	public static void main(String[] args) {
		createLuceneIndex();
	}

	public static void createLuceneIndex() {
		try {
			File indexDir = new File("E:\\Index");
			Directory dir = new SimpleFSDirectory(indexDir);
			Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
			//IndexWriter为某个Document建立索引时所取到的Field内的最大词条数目,该属性的初始值为10000
			IndexWriter indexWriter = new IndexWriter(dir, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);
			// 创建8个文档
			Document doc1 = new Document();
			Document doc2 = new Document();
			Document doc3 = new Document();
			Document doc4 = new Document();
			Document doc5 = new Document();
			Document doc6 = new Document();
			Document doc7 = new Document();
			Document doc8 = new Document();

			Field f1 = new Field("bookname", "钢铁是如何炼成的", Field.Store.YES,
					Field.Index.ANALYZED);
			Field f2 = new Field("bookname", "英雄儿女", Field.Store.YES,
					Field.Index.ANALYZED);
			Field f3 = new Field("bookname", "篱笆女人和狗", Field.Store.YES,
					Field.Index.ANALYZED);
			Field f4 = new Field("bookname", "女人是水做的", Field.Store.YES,
					Field.Index.ANALYZED);
			Field f5 = new Field("bookname", "我的兄弟和女儿", Field.Store.YES,
					Field.Index.ANALYZED);
			Field f6 = new Field("bookname", "白毛女", Field.Store.YES,
					Field.Index.ANALYZED);
			Field f7 = new Field("bookname", "钢的世界", Field.Store.YES,
					Field.Index.ANALYZED);
			Field f8 = new Field("bookname", "钢铁战士", Field.Store.YES,
					Field.Index.ANALYZED);

			doc1.add(f1);
			doc2.add(f2);
			doc3.add(f3);
			doc4.add(f4);
			doc5.add(f5);
			doc6.add(f6);
			doc7.add(f7);
			doc8.add(f8);

			indexWriter.addDocument(doc1);
			indexWriter.addDocument(doc2);
			indexWriter.addDocument(doc3);
			indexWriter.addDocument(doc4);
			indexWriter.addDocument(doc5);
			indexWriter.addDocument(doc6);
			indexWriter.addDocument(doc7);
			indexWriter.addDocument(doc8);

			indexWriter.optimize();//对索引进行优化,保证检索时的速度,可是须要消耗内存和磁盘空间,耗时耗力,须要的时候再优化(而非随意时刻)
			indexWriter.close();//关闭索引器,否则会导致索引的数据滞留在缓存中未写入磁盘,有可能连文件夹的锁也没有去除
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
</span>

运行之后我们发现E盘下出现了一个index文件夹,这就是我们创建的索引文件。

到此,索引文件也就是创建完成了。

明天接着往下整理索引的读取,到时候我们就能够更直观的推断上面创建的索引是否成功。

时间: 2024-09-30 19:09:43

Lucene整理--索引的建立的相关文章

用Lucene.net对数据库建立索引及搜索&lt;转&gt;

用Lucene.net对数据库建立索引及搜索 最近我一直在研究 Lucene.net ,发现Lucene.net对数据库方面建索引的文章在网上很少见,其实它是可以对数据库进行索引的,我闲着没事,写了个测试程序,竟然成功了, 可以实现对数据另类查询的一种方式(通过建索引查询),发表出来,和大家共享.   其实 Lucene.net 对数据库建索引很简单,只要把数据表里面的记录读出来,然后对每个字段索引就行了.本文中数据库的内容是某个博客表-userblog表.  1.表结构:字段名称       

Solr4.8.0源码分析(10)之Lucene的索引文件(3)

Solr4.8.0源码分析(10)之Lucene的索引文件(3) 1. .si文件 .si文件存储了段的元数据,主要涉及SegmentInfoFormat.java和Segmentinfo.java这两个文件.由于本文介绍的Solr4.8.0,所以对应的是SegmentInfoFormat的子类Lucene46SegmentInfoFormat. 首先来看下.si文件的格式 头部(header) 版本(SegVersion) doc个数(SegSize) 是否符合文档格式(IsCompoundF

lucene写索引出现锁文件的原因之一

lucene正常情况目录下的文件 有三个文件. segments.gen segments_a08, 还有一个类似 _uw.cfs名字的东西. 当然,不一定都一样, 但肯定是这三个. 如果出现了很多文件.不要着急, 看下面的 . 如果lucene的索引目录下出现了很多文件, 肯定是有问题的. 几个方面.首先lucene在执行写操作时, 会先在目录下写如一个write.lock的文件锁定这个目录,以避免别的索引再操作这个路径. 否则那样肯定会乱. 锁定之后, 开始写索引, 写索引时lucene建了

SCOM数据库整理索引计划出错

我们为了提高数据库的访问效率,我们需要对数据库做优化,那么在这里我是希望对我的SCOM的SQL进行索引的整理. 当我们在SQL的维护计划中创建了针对SCOM数据库进行重新组织索引的计划后,发现运行总是会失败,这是为什么呢? 发现报错是这样的: 执行查询"ALTER INDEX [PK__EventSta__95632343A552DFB0] ON [E..."失败,错误如下:"找不到索引 'PK__EventSta__95632343A552DFB0'.".失败的原

Lucene实现索引和查询

0引言 随着万维网的发展和大数据时代的到来,每天都有大量的数字化信息在生产.存储.传递和转化,如何从大量的信息中以一定的方式找到满足自己需求的信息,使之有序化并加以利用成为一大难题.全文检索技术是现如今最普遍的信息查询应用,生活中利用搜索引擎,在博客论坛中查找信息,这些搜索的核心原理就是本文要实现的全文检索技术.随着文档信息数字化的实现,将信息有效存储并及时准确的提取是每一个公司.企业和单位要做好的基础.针对英文的全文检索已经有很多成熟的理论和方法,开放源代码的全文检索引擎Lucene 是Apa

检测和整理索引碎片

索引碎片的检测和整理 存储数据是为了查找数据,存储结构影响数据查找的性能.对无序数据进行查找,最快的查找算法是哈希查找:对有序数据进行查找,最快的查找算法是平衡树查找.在传统的关系型数据库中,聚集索引和非聚集索引都是平衡树(B-Tree)类型的存储结构,用于顺序存储数据,便于实现数据的快速查找.除了提升数据查找的性能之外,索引还能减少硬盘IO和内存消耗.通常情况下,硬盘IO是查找性能的瓶颈,由于索引是数据表的列的子集,这意味着,索引只存储部分列的数据,占用的硬盘空间比全部列少了很多,因此,数据库

sql 索引 的建立

(From:http://54laobaixing.blog.163.com/blog/static/57843681200952411133121/) 假设你想找书中的某一个句子.你可以一页一页地逐页搜索,但这会花很多时间.而通过使用索引, 你可以很快地找到你要搜索的主题.      表的索引与附在一本书后面的索引非常相似.它可以极大地提高查询的速度.对一个较大的表来说, 通过加索引,一个通常要花费几个小时来完成的查询只要几分钟就可以完成.因此没有理由对需要频繁查 询的表增加索引.   注意:

Solr4.8.0源码分析(12)之Lucene的索引文件(5)

Solr4.8.0源码分析(12)之Lucene的索引文件(5) 1. 存储域数据文件(.fdt和.fdx) Solr4.8.0里面使用的fdt和fdx的格式是lucene4.1的.为了提升压缩比,StoredFieldsFormat以16KB为单位对文档进行压缩,使用的压缩算法是LZ4,由于它更着眼于速度而不是压缩比,所以它能快速压缩以及解压. 1.1 存储域数据文件(.fdt) 真正保存存储域(stored field)信息的是fdt文件,该文件存放了压缩后的文档,按16kb或者更大的模块大

Solr4.8.0源码分析(11)之Lucene的索引文件(4)

Solr4.8.0源码分析(11)之Lucene的索引文件(4) 1. .dvd和.dvm文件 .dvm是存放了DocValue域的元数据,比如DocValue偏移量. .dvd则存放了DocValue的数据. 在Solr4.8.0中,dvd以及dvm用到的Lucene编码格式是Lucene45DocValuesFormat.跟之前的文件格式类似,它分别包含Lucene45DocValuesProducer 和Lucene45DocValuesConsumer来实现该文件的读和写. 1 @Ove