`
xiaodongdong
  • 浏览: 81272 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Lucene4学习笔记之索引文件介绍与数据类型

 
阅读更多

 

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

文档和字段的lengthboost系数的编码

每个文档的值(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

写入格式为:VIntChars,字符串长度加字符串值

前面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,对于每个Byte8位,其中后7位表示数值,最高1位表示是否还有另一个Byte0表示没有,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);
  }

 

  • 大小: 58.3 KB
3
1
分享到:
评论

相关推荐

    Lucene 3.6 学习笔记

    - `Directory`: 用于存储索引数据的抽象接口,例如FSDirectory(文件系统目录)和RAMDirectory(内存目录)。 - `IndexWriter`: 负责创建、修改和删除索引的主要类,可以添加、删除和更新文档。 - `Document`: 代表...

    lucene3.5学习笔记

    ### Lucene 3.5 学习笔记 #### 一、Lucene 3.5 基本概念 ##### 1.1 Lucene 概述 **1.1.1 IndexWriter** `IndexWriter` 是 Lucene 中的核心类之一,用于创建或更新索引。它提供了添加文档、删除文档、优化索引等...

    本人的Lucene2.9学习笔记

    3. store模块:负责索引的存储,提供不同类型的目录类,如FSDirectory(文件系统存储)和RAMDirectory(内存存储)。 4. document模块:封装了索引文件的基本结构,如Document和Field类。 5. search模块:处理索引的...

    lucene基础学习笔记&源码

    **Lucene 基础学习笔记与源码分析** **一、Lucene 概述** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发并维护。它是一个 Java 开发的开源项目,被广泛应用于各种搜索引擎的构建,支持多种编程...

    Lucene 学习笔记 1

    本篇学习笔记将深入探讨 Lucene 的核心概念、工作流程以及如何通过 Indexer 和 Searcher 类进行索引与查询。 ### Lucene 的核心概念 1. **索引(Index)**: 在 Lucene 中,索引是文档内容经过分析、分词后的结构化...

    lucene学习笔记

    ### Lucene.NET 2.3.1 学习笔记 #### 一、Lucene.NET 简介 Lucene.NET 是一个高性能、全功能的文本搜索引擎库,它为.NET平台提供了一个灵活且强大的全文检索解决方案。该库允许开发者将搜索功能集成到应用程序中,...

    Lucene学习笔记

    这个学习笔记主要涵盖了Lucene的基本概念,包括索引、文档、域和项,以及安装配置和索引的基本过程。 1. **基本概念** - **索引(Index)**:索引是Lucene的核心,它是由一系列文档组成的。每个索引包含了对文档...

    Lucene 课堂笔记

    ### Lucene 课堂笔记知识点详解 #### 一、信息检索概览 **1.1 信息检索的概念** 信息检索指的是从海量信息集中筛选出与用户需求相关联的信息。本课程主要探讨文本信息的检索,虽然实际应用中还可能涉及图像、音频...

    lucene2.4+nutch学习笔记三:lucene 在多个文本文档里找出包含一些关键字的文档

    《Lucene 2.4与Nutch学习笔记:在多文档中搜索关键词》 Lucene是一个高性能、全文检索库,而Nutch则是一个开源的网络爬虫项目,两者结合使用,能够实现对大量文本文档的高效搜索和索引。这篇学习笔记主要探讨如何...

    Lucene.net学习书记整理

    1. **索引(Index)**:Lucene的核心功能之一是构建索引,将文本数据转化为可搜索的结构。索引是一个倒排索引,其中每个词项都有一个指向包含该词项的文档列表的指针,这种设计极大地提高了搜索速度。 2. **分析器...

    Lucene开发指南

    Lucene学习笔记(一)可能涵盖了Lucene的安装与环境配置,以及如何创建第一个Lucene应用。这通常包括导入必要的库,设置索引目录,以及创建和添加文档到索引。 Lucene学习笔记(二)可能涉及索引构建过程,讲解了如何...

    lucene 小资源

    而`org`目录可能代表了源代码或编译后的类文件组织结构,按照Java的包命名规范,`org`下可能包含了一系列与Lucene相关的子包,如`org.apache.lucene`,这是Lucene的主要包名,里面包含了Lucene的各种类和接口,如...

    lucene笔记共38页.pdf.zip

    通过索引文本数据,Lucene能快速找到与查询语句匹配的文档。 二、核心概念 1. 文档(Document):在Lucene中,每个文档是信息的基本单位,可以包含多个字段(Field),如标题、正文等。 2. 字段(Field):文档中的...

    lunece 学习笔记实用知识库分享知识分享

    Lucene 学习笔记是指如何学习和使用 Lucene。我们可以通过学习 Lucene 的使用和实现来掌握 Lucene。 Solr 学习笔记 Solr 学习笔记是指如何学习和使用 Solr。我们可以通过学习 Solr 的使用和实现来掌握 Solr。 ...

    Lucene笔记

    Lucene是一个高性能、全功能的文本搜索库,它被广泛应用于各种规模的应用程序之中。作为一款开源工具,Lucene提供了强大的搜索功能,使得开发者能够轻松地为自己的应用添加搜索功能。 #### 官方网站 - **网址**:...

    lucene资料改集

    由于提供的压缩包文件名称没有明显的主题关联,可能是包含各种关于Lucene的文档和笔记,如"新建 Microsoft Word 文档.doc"和".txt"文件可能包含了Lucene的教程、案例分析或开发者笔记。阅读这些文档可以深入理解...

    学习笔记(ElasticSearch)(实战)

    - **索引映射(Mapping)**:定义索引中字段的数据类型和分析器,影响搜索和分析行为。 - **更新映射**:在不破坏现有数据的情况下,可以动态更新映射。 - **删除索引**:使用`DELETE`请求删除索引,如`DELETE /my_...

    elasticsearch学习笔记.rar

    9. **映射(Mapping)**:映射定义了字段的数据类型和索引方式,如是否分析、存储等,对搜索性能和结果质量有很大影响。 10. **性能优化**:优化ES性能涉及多个方面,如合理设置分片数量、调整内存分配、使用合适的...

Global site tag (gtag.js) - Google Analytics