5.2 Lucene索引器:
5.2.1 Lucene索引介绍
5.2.2 Lucene索引结构
5.2.3 多文件索引结构
5.2.4 复合索引结构
5.2.1 Lucene索引介绍:
文档索引 是 Lucene系统的核心功能。
有专门的API用来实现索引的建立和管理功能。可处理多种格式的文档,如磁盘文件、电子邮件地址、网页及数据库记录等。
Lucene的索引格式采用 独立索引模式 和 复合索引模式:
1、独立索引模式:
指每个Document独立索引成一个文件,这种方式检索速度比较快,但不是和大量文件的处理。
2、复合索引模式:
把等待索引的全部Document索引成一个文件,这个文件包含的文档内容各不相同,甚至包括域项目不同的异构型文档;
Lucene的索引,通常以单个或者一系列索引文件形式放在系统目录中,可以存在内存(RAMDirectory)或者硬盘(FSDirectory)中。
内存索引检索速度快,但关机后会丢失;硬盘索引可以长期保存,但是检索时需要进行IO操作,速度相对比较慢;实际多为两者结合。
Lucene其他特点:
1、索引结构以文件形式存储,不必依赖于数据库或者某种特定平台;
2、支持分块索引,对新加入的文件建立新的索引,缩短索引生效的时间,然后通过索引合并建立整体索引;
Lucene系统根据选用的索引生成形式不同可分为:复合索引格式和多文件索引格式。
系统默认为复合索引格式,减少索引文件的数量,便于管理和使用。
索引建立的过程会处理海量的数据,生成的索引段和索引文件会非常庞大。具体实现应根据任务特点来选择特定形式。
复合索引通常在静态索引中比较合适,而在动态索引中采用多文件索引更为方便。
5.2.2 Lucene索引结构:
索引结构可以分为索引、索引段、索引文档、索引域和索引项几个不同层次。
Lucene每个索引结构由一个或者多个段组成,每个段包含一个或多个文档,每个文档管理了一个或多个域,
每个域由一个或多个索引项组成,每个索引项是一个索引数据。
1、索引(Index):
Lucene的索引结构最终体现到特定格式的磁盘文件来存储。索引在内存和磁盘中,都使用相同的逻辑结构。
在磁盘上Lucene索引以格式化的文本形式存储,每个索引结构由一个或多个段来组成。
磁盘文件包括当前活跃索引段 和 新建的索引文件, 通过工具可以把分段合并为统一的索引段。
2、索引段(Segment):
在每次创建的过程,文档都是添加到了特定的段里,然后索引段会根据参数合并。
一个索引中只有一个没有后缀的Segment_* 文件,它记录当前索引中所有的segment情况。它的后缀根据包含段的不同而变化。
索引段相当于子索引,新建的索引通常以一个新段形式出现,在合并操作后,每个索引体系只包含一个段。
3、索引文档(Document):
Document是索引器可以直接添加的对象,每个索引可以包含多个不同的文档,每个文档又管理了数目不等的域集合。
这里的文档是一个逻辑概念,不同于我们通常意义所说的电子文本文件、Word文件等。
它是Lucene索引对的真正可以检索索引项的一级管理框架。
4、索引域(Field):
域Field 是Document对象的基本组成单位。
每个域内存储了时间的索引文本数据,这些文本数据在内部调用了分析器Analyzer的索引项结果。
域内数据的检索查询最终是以索引项为单位的,比索引项更小的单位无法检索到。
英文的索引项以单词为检索单位,中文以中文分词结果作为检索单位。
Field有5种生成函数:
- Field(String name, byte[] value, Field.Store store);
- Field(String name, Reader reader);
- Field(String name, Reader reader, Field.TermVector termVector);
- Field(String name, String value, Field.Store store, Field.Index index);
- Field(String name, String value, Field.Store store, Field.Index index, Field.TermVector termVector);
– 其中第一个生成函数用于二进制数据索引,第2、3个生成函数用于文件内容的索引,第4、5个函数用于直接索引给定字符串。
– 参数:域的名字和存储的值是两个最基本的属性。
a. 域的名字:
是相对固定的一个参数,用来指定添加域的标识,在检索时可以用来限定检索范围或提取属性值;
b. 域存储的值:
是一个必须的参数,使用形式包括 二进制(byte)串、Reader数据流 和 直接字符串 三种形式。
更多时候,搜索引擎把一系列网页或文档的内容添加到索引中,使用Reader数据流的形式。
Reader方式以流模式传送文件内容,便于使用和管理。
c. 域的Store属性:
表示数据本身是否需要存储,也就是说索引中是否要加一个原始数据项。
支持三种类型的值:
Store.NO(只存储索引,节省空间)
Store.YES(同时保存索引和原始信息)
Store.COMPRESS(压缩存储原始信息)
d. 域的Index属性:
表示数据是否需要索引,也就是当前域是否用来检索。
Index支持四种属性:
Index.NO(生成的域不需要索引,只是作为存储数据的单元提供辅助信息)
Index.TOKENIZED(使用分析器分词来建立索引)
Index.UN_TOKENIZED(如果某些内容系统整体作一个索引,避免分词带来的麻烦)
Index.NO_NORMS(禁用分析器进行处理)
e. Field.TermVector
用来表示域内的信息是否需要分词,在中文信息搜索应用中,往往需要分词作为索引的基础。
- lucene常见Field:
IntField 主要对int类型的字段进行存储,需要注意的是如果需要对InfField进行排序使用SortField.Type.INT来比较,如果进范围查询或过滤,需要采用NumericRangeQuery.newIntRange()
LongField 主要处理Long类型的字段的存储,排序使用SortField.Type.Long,如果进行范围查询或过滤利用NumericRangeQuery.newLongRange(),LongField常用来进行时间戳的排序,保存System.currentTimeMillions()
FloatField 对Float类型的字段进行存储,排序采用SortField.Type.Float,范围查询采用NumericRangeQuery.newFloatRange()
BinaryDocVluesField 只存储不共享值,如果需要共享值可以用SortedDocValuesField
NumericDocValuesField 用于数值类型的Field的排序(预排序),需要在要排序的field后添加一个同名的NumericDocValuesField
SortedDocValuesField 用于String类型的Field的排序,需要在StringField后添加同名的SortedDocValuesField
StringField 用户String类型的字段的存储,StringField是只索引不分词
TextField 对String类型的字段进行存储,TextField和StringField的不同是TextField既索引又分词
StoredField 存储Field的值,可以用IndexSearcher.doc和IndexReader.document来获取此Field和存储的值
5、索引项(Term):
索引项是索引管理的最小的单位。
在程序中没有显示的调用,是利用分析器,在后台自动把一个域的值进行分割。得到的每个独立元素作为一个索引项,用来建立索引。
5.2.3 多文件索引结构:
使用一系列索引文件分别存储索引,分散管理数据的索引存储格式。
多文件索引在打开时需要读取大量的文件,会大大占用系统的文件句柄等资源,造成系统响应速度慢,甚至系统崩溃。
在创建索引的过程中,使用IndexWriter的useCompoundfile属性来控制索引文件的类型。默认为true,保存成只包括3个文件的复合索引。
如果希望采用多文件索引,必须调用SetUseCompoundFile(boolean)方法来指定,语法格式如下:
- IndexWriter textIndex = new IndexWriter(Dest_Index_Path, TextAnalyzer, true);
- textIndex.useCompoundFile(true);
多文件格式包含了一系列的文件:
- segments_* 文件:
描述一组索引的参数,使用文件头固定格式描述后面的内容,包括每个独立新建索引的大小和属性等。
- fnm 文件:
是索引域描述文件。一个独立的索引(PerIndex)叫做一个Segment(索引段)。
一个fnm文件描述了本索引的File数、各个Field的属性编号。
- fdx文件:
文档域值索引文件,采用定长方式存储,根据docId排序可以直接定位。
用来记录每个文档的stord fields值的存储位置(文件偏移)
- fdt文件:
文档域值存储文件,存储stored field值的文件。
通过fdx文件中记录的偏移来访问
- tis文件:
是存储每个term在文档中的分布信息,如文档频率、每个含term文档出现次数记录的偏移和位置记录的偏移排列顺序。
先按Field名字字典排序,在每个Field按Term字典排序。
- tii文件:
是tis文件的索引和精简,排列格式是一致的,但是不包含每个term属性的信息,这个文件完全可以读入内存。
- frq文件:
是tis文件的扩展。记录每个term在每个文档中出现的频率。
- prx文件:
也是tis文件的延伸,记录每个term在每个文档偏移信息。这个文件忽略了docId,必须配合frq文件使用。
- tvx、tvd、tvf文件:
用来索引和保持每个文档的向量化字段的信息。
5.2.4 复合索引结构:
复合索引结构是把索引相关的一系列数据结构组织到少数几个文件中进行管理的索引存储模式。
复合索引把所有的索引数据被组合成简单的3个文件,大大减少了打开大量文件的压力。
但是使用统一文件存储大量数据会造成数据更新的问题,每次更改需要操作一个大的数据文件,读取和存储都会比较慢。
复合索引文件格式:
- segments_* 文件:
描述一组索引的参数,使用文件头固定格式描述后面的内容,包括每个独立新建索引的大小和属性等。
- segments_gen文件:
存储索引创建参数。
- cfs文件:
存储实际的索引数据段,不同子索引在内部按照一定格式存储,仍然可以区分,知道索引优化压缩操作发生时。