Lucene生成的索引文件
由上文中提到的代码生成的索引文件如下所示:
格式都相当怪异,那些这些文件里面都存放了些什么东西?我们先来了解如下名词
a) 段信息(SegmentInfo):它包含段的元数据;
b) 字段名(Field name):它包含了用来构建索引的字段名;
c) 存储的字段值(Stored Field values):它包含每一个文档的属性-值(attribute-value)对的列表,其中属性名为字段的名称,用来存储和文档相关的辅助信息。比如标题,网址或者是一个用来访问数据库的标识符,在进行搜索时用来作为key来取得返回值;
d) 词典(Term Dictionary):包含所有文档的所有索引字段中使用的词,也包含一个词在文档中的数量,和词的频率数据、接近度数据的指针;
e) 词的频率数据(Term Frequency Data):对词典里面的每个词而言,都有其在所有文档中包含数量以及在某一个文档中的数量,如果频率这个属性被省略掉就不会出现;
f) 词的接近度数据(Term Proximity Data):在词典中的每个词在每一个文档中的位置数据,如果位置属性被省略了就不会出现;
g) 标准化系数(Normalization Factors):对文档中的每个字段,存储了一个值为该字段的命中值Lucene在计算每个词的权重的时候都会乘上该标准化系数;
h) 词向量(Term Vectors):对文档中的每一个字段,词向量都可能被存储,一个词向量由词文本以及词的频率组成;
i) 每个文档的值(Per-Document Values):但一般都被加载到内存中用于快速访问,虽然存储的值通常用于作为搜索结果的摘要,但每一个文档的值都是非常有用的,比如在计算评分的时候作为评分系数;
j) 删除的文档(Deleted Documents):用来指示哪些文档被删除的文件
名称 |
文件后缀 |
描述 |
段文件(Segments File) |
segments.gen segments_N |
存储提交点信息 |
锁文件(Lock File) |
write.lock |
用来阻止多个indexWriter向同一个文件写数据 |
段信息(Segments Info) |
.si |
存储段的元数据信息 |
复合文件(Compound File) |
.cfs , .cfe |
一个可选的虚拟文件,包括所有其他索引文件系统频繁用完的文件句柄 |
字段信息(Fields) |
.fnm |
存储字段的信息 |
字段索引(Fields Index) |
.fdx |
包含指向字段值的指针 |
字段数据(Field Data) |
.fdt |
存储文档里面的字段信息 |
词典(Term Dictionary) |
.tim |
存储词信息 |
词索引(Term Index) |
.tip |
指向词典的索引 |
频率信息(Frequencies) |
.doc |
包含那些含有每一个词的频率的文档列表 |
位置信息(Positions) |
.pos |
存储词在索引中出现的位置信息 |
Payloads |
.pay |
额外存储每个位置的元数据信息,如字符偏移和用户负载 |
Norms |
.nvd , .nvm |
文档和字段的length和boost系数的编码 |
每个文档的值(Per-Document Values) |
.dvd , .dvm |
额外的得分系数或者每个文档的值信息编码 |
词向量索引(Term Vector Index) |
.tvx |
存储文档的偏移数据文件 |
词向量文件(Term Vector Documents) |
.tvd |
包含有词向量的文档信息 |
词向量字段(Term Vector Fields) |
.tvf |
关于词向量的字段级信息 |
删除文档(Deleted Documents) |
.del |
关于什么文件被删除的信息 |
数据存储基本类型
类型名称 |
说明 |
Byte |
8 bit |
UInt16 |
16 bit 二字节无符号整型,高位优先(short) |
UInt32 |
32 bit四字节无符号整型,高位优先(int) |
UInt64 |
64 bit八字节无符号整型,高位优先(long) |
VInt |
可变长度整型。0-127单字节,128-16383两字节,类推 |
VLong |
可变长度Long型 |
Chars |
UNICODE字符串 |
String |
写入格式为:VInt,Chars,字符串长度加字符串值 |
前面4种类型我们可以将其称为简单类型,因为它们的存储单元均为字节Byte,并遵守高位字节先输出,低位字节后输出的原则。下面以Int32类型为例,看一下它在lucene4中的读写情况:
public void writeInt(int i) throws IOException { writeByte((byte)(i >> 24));//先写入高八位 writeByte((byte)(i >> 16)); writeByte((byte)(i >> 8)); writeByte((byte) i);//最后写入低八位 } public int readInt() throws IOException { //先输出高位;后输出低位 return ((readByte() & 0xFF) << 24) | ((readByte() & 0xFF) << 16) | ((readByte() & 0xFF) << 8) | (readByte() & 0xFF); }
|
VInt类型可能比较难理解,我们来深入看一下:
· 变长的整数类型,它可能包含多个Byte,对于每个Byte的8位,其中后7位表示数值,最高1位表示是否还有另一个Byte,0表示没有,1表示有。
· 越前面的Byte表示数值的低位,越后面的Byte表示数值的高位。
· 例如130化为二进制为 1000, 0010,总共需要8位,一个Byte表示不了,因而需要两个Byte来表示,第一个Byte表示后7位,并且在最高位置1来表示后面还有一个Byte,所以为(1) 0000010,第二个Byte表示第8位,并且最高位置0来表示后面没有其他的Byte了,所以为(0) 0000001
值 |
第一个Byte |
第二个Byte |
第三个Byte |
0 |
00000000 |
|
|
2 |
00000010 |
|
|
… |
|
|
|
127 |
01111111 |
|
|
128 |
10000000 |
00000001 |
|
129 |
10000001 |
00000001 |
|
… |
|
|
|
16383 |
11111111 |
01111111 |
|
16384 |
10000000 |
10000000 |
00000001 |
16385 |
10000001 |
10000000 |
00000001 |
… |
|
|
|
我们看一下它具体的读写代码:
public final void writeVInt(int i) throws IOException { //后七位之前还有为1的位存在 while ((i & ~0x7F) != 0) { //先取出低七位 ,并在第八位补1,指示后面还存在byte writeByte((byte)((i & 0x7F) | 0x80)); i >>>= 7; } //写入余下的八位 writeByte((byte)i); } public int readVInt() throws IOException { //读取第一个byte byte b = readByte(); //大于0即最高位为0,没有下一个byte,直接返回 if (b >= 0) return b; //获取低七位的值 int i = b & 0x7F; //读下一个byte b = readByte(); //获取低七位的值并左移七位与之前的七位数据相加 i |= (b & 0x7F) << 7; if (b >= 0) return i; b = readByte(); i |= (b & 0x7F) << 14; if (b >= 0) return i; b = readByte(); i |= (b & 0x7F) << 21; if (b >= 0) return i; b = readByte(); // i |= (b & 0x0F) << 28; if ((b & 0xF0) == 0) return i; throw new IOException("Invalid vInt detected (too many bits)"); }
|
VLong的相关读写实现与之类似,只是字节数不一样,这里不再重复介绍。最后看一下String相关:
public void writeString(String s) throws IOException { final BytesRef utf8Result = new BytesRef(10); //转码 UnicodeUtil.UTF16toUTF8(s, 0, s.length(), utf8Result); //写入字符串长度 writeVInt(utf8Result.length); //写入字符串值 writeBytes(utf8Result.bytes, 0, utf8Result.length); } public String readString() throws IOException { //读取字符串长度 int length = readVInt(); final byte[] bytes = new byte[length]; //读取一个字符串长度的byte readBytes(bytes, 0, length); return new String(bytes, 0, length, IOUtils.CHARSET_UTF_8); }
|
相关推荐
- `Directory`: 用于存储索引数据的抽象接口,例如FSDirectory(文件系统目录)和RAMDirectory(内存目录)。 - `IndexWriter`: 负责创建、修改和删除索引的主要类,可以添加、删除和更新文档。 - `Document`: 代表...
### Lucene 3.5 学习笔记 #### 一、Lucene 3.5 基本概念 ##### 1.1 Lucene 概述 **1.1.1 IndexWriter** `IndexWriter` 是 Lucene 中的核心类之一,用于创建或更新索引。它提供了添加文档、删除文档、优化索引等...
3. store模块:负责索引的存储,提供不同类型的目录类,如FSDirectory(文件系统存储)和RAMDirectory(内存存储)。 4. document模块:封装了索引文件的基本结构,如Document和Field类。 5. search模块:处理索引的...
**Lucene 基础学习笔记与源码分析** **一、Lucene 概述** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发并维护。它是一个 Java 开发的开源项目,被广泛应用于各种搜索引擎的构建,支持多种编程...
本篇学习笔记将深入探讨 Lucene 的核心概念、工作流程以及如何通过 Indexer 和 Searcher 类进行索引与查询。 ### Lucene 的核心概念 1. **索引(Index)**: 在 Lucene 中,索引是文档内容经过分析、分词后的结构化...
### Lucene.NET 2.3.1 学习笔记 #### 一、Lucene.NET 简介 Lucene.NET 是一个高性能、全功能的文本搜索引擎库,它为.NET平台提供了一个灵活且强大的全文检索解决方案。该库允许开发者将搜索功能集成到应用程序中,...
这个学习笔记主要涵盖了Lucene的基本概念,包括索引、文档、域和项,以及安装配置和索引的基本过程。 1. **基本概念** - **索引(Index)**:索引是Lucene的核心,它是由一系列文档组成的。每个索引包含了对文档...
### Lucene 课堂笔记知识点详解 #### 一、信息检索概览 **1.1 信息检索的概念** 信息检索指的是从海量信息集中筛选出与用户需求相关联的信息。本课程主要探讨文本信息的检索,虽然实际应用中还可能涉及图像、音频...
《Lucene 2.4与Nutch学习笔记:在多文档中搜索关键词》 Lucene是一个高性能、全文检索库,而Nutch则是一个开源的网络爬虫项目,两者结合使用,能够实现对大量文本文档的高效搜索和索引。这篇学习笔记主要探讨如何...
1. **索引(Index)**:Lucene的核心功能之一是构建索引,将文本数据转化为可搜索的结构。索引是一个倒排索引,其中每个词项都有一个指向包含该词项的文档列表的指针,这种设计极大地提高了搜索速度。 2. **分析器...
Lucene学习笔记(一)可能涵盖了Lucene的安装与环境配置,以及如何创建第一个Lucene应用。这通常包括导入必要的库,设置索引目录,以及创建和添加文档到索引。 Lucene学习笔记(二)可能涉及索引构建过程,讲解了如何...
而`org`目录可能代表了源代码或编译后的类文件组织结构,按照Java的包命名规范,`org`下可能包含了一系列与Lucene相关的子包,如`org.apache.lucene`,这是Lucene的主要包名,里面包含了Lucene的各种类和接口,如...
通过索引文本数据,Lucene能快速找到与查询语句匹配的文档。 二、核心概念 1. 文档(Document):在Lucene中,每个文档是信息的基本单位,可以包含多个字段(Field),如标题、正文等。 2. 字段(Field):文档中的...
Lucene 学习笔记是指如何学习和使用 Lucene。我们可以通过学习 Lucene 的使用和实现来掌握 Lucene。 Solr 学习笔记 Solr 学习笔记是指如何学习和使用 Solr。我们可以通过学习 Solr 的使用和实现来掌握 Solr。 ...
Lucene是一个高性能、全功能的文本搜索库,它被广泛应用于各种规模的应用程序之中。作为一款开源工具,Lucene提供了强大的搜索功能,使得开发者能够轻松地为自己的应用添加搜索功能。 #### 官方网站 - **网址**:...
由于提供的压缩包文件名称没有明显的主题关联,可能是包含各种关于Lucene的文档和笔记,如"新建 Microsoft Word 文档.doc"和".txt"文件可能包含了Lucene的教程、案例分析或开发者笔记。阅读这些文档可以深入理解...
- **索引映射(Mapping)**:定义索引中字段的数据类型和分析器,影响搜索和分析行为。 - **更新映射**:在不破坏现有数据的情况下,可以动态更新映射。 - **删除索引**:使用`DELETE`请求删除索引,如`DELETE /my_...
9. **映射(Mapping)**:映射定义了字段的数据类型和索引方式,如是否分析、存储等,对搜索性能和结果质量有很大影响。 10. **性能优化**:优化ES性能涉及多个方面,如合理设置分片数量、调整内存分配、使用合适的...