文档章节

lucene4.7 索引文件(九)

一枚Sir
 一枚Sir
发布于 2014/04/11 11:08
字数 1082
阅读 3032
收藏 1

下图是一个典型的Lucene4.x的索引结构图: 


Lucene4.x之后的所有索引格式如下所示: 

文件名 后缀 描述
Segments File segments.gen, segments_N 存储段文件的提交点信息
Lock File write.lock 文件锁,保证任何时刻只有一个线程可以写入索引
Segment Info .si 存储每个段文件的元数据信息
Compound File .cfs, .cfe 复合索引的文件,在系统上虚拟的一个文件,用于频繁的文件句柄
Fields .fnm 存储域文件的信息
Field Index .fdx 存储域数据的指针
Field Data .fdt 存储所有文档的字段信息
Term Dictionary .tim term字典,存储term信息
Term Index .tip term字典的索引文件
Frequencies .frq 词频文件,包含文档列表以及每一个term和其词频
Positions .prx 位置信息,存储每个term,在索引中的准确位置
Norms .nrm.cfs, .nrm.cfe 存储文档和域的编码长度以及加权因子
Per-Document Values .dv.cfs, .dv.cfe 编码除外的额外的打分因素,
Term Vector Index .tvx term向量索引,存储term在文档中的偏移距离
Term Vector Documents .tvd 包含每个文档向量的信息
Term Vector Fields .tvf 存储filed级别的向量信息
Deleted Documents .del 存储索引删除文件的信息


复合索引文件是指,除了段信息文件,锁文件,以及删除的文件外,其他的一系列索引文件压缩一个后缀名为cfs的文件,意思,就是所有的索引文件会被存储成一个单例的Directory,而非复合索引是灵活的,可以单独的访问某几个索引文件,而复合索引文件则不可以,因为其压缩成了一个文件,所以在某些场景下能够获取更高的效率,比如说,查询频繁,而不经常更新的需求,就很适合这种索引格式。  

lucene索引的基本概念组成由,索引,文档,域和项组成,一个索引,通常包含一些序列的文档,一个文档包含一些序列的域,而一些域又包含一些序列的项,而一些项则包含一些列序列的最低层的字节,注意这里的序列指的是在索引结构中有序,通常有序的这种方式,某些情况可以优化索引结构。 


lucene使用了倒排索引(Inverted Indexing),来存储索引信息,大大提高了检索效率, 
倒排索引,举一个通俗的例子,原来基于人们的正常思维,我们会存储的是一个文章中出现了那几个单词,而倒排索引,却恰恰相反,它存储的是这个单词,包含在几个文档中,当然这个关系是由倒排链表(存储一系列docid)构成的索引,我们在检索时,通过这个单词可以快速的定位,它出现在几篇文章中,从而大大提升了检索性能。 

当然lucene中不仅仅有倒排索引,也有正向的存储,而倒排之所以是lucene的核心,是因为它提升了检索性能,在检索到一个个具体的文档时,就需要我们正向的拿出这些信息,反映在实际的代码中就是我们通过检索获取一个个docid,然后通过一个个docid获取整个文档,然后我们在正向的获取各个域,以及各个项存储的具体信息,当然前提是你存储了这个字段,如果你只是索引了,而并没有存储,那么你只能检索到此条信息,但无法获取具体term的值,这个需要在建索引之前就要设计好,索引的存储结构,那些字段是检索的,那些字段是存储的等等,如果你还需要高亮一些内容,则还需要存储这个域的偏移的位置,通过这样就能准确的在文中标记检索命中的关键词,如果你打算在前台来完成这个高亮,就不要存储这些信息了。


© 著作权归作者所有

一枚Sir
粉丝 119
博文 209
码字总数 350904
作品 0
朝阳
架构师
私信 提问
加载中

评论(1)

felayman
felayman
翻译质量不咋的,An optional "virtual" file consisting of all the other index files for systems that frequently run out of file handles.
lucene4下用MultiFieldQueryParser同时搜索多个field时

因为工作中突然要用到lucene,就到官网上下了lucene4.7的jar包和文档,回头开始学习的时候才发现,网上lucene相关的资料大部分都停留在3.*阶段,于是结合前辈的代码,自己写了下面一个例子,...

一枚Sir
2014/04/10
7.1K
1
Lucene4.7 Directory (一)

散仙今天就从源码的角度来分析下Lucene的根基Directory的实现,在此之前,我们先来看下Directory家族的层级分布图。 从上图中,我们可以看出Directory共有11个直接或者间接的子类,不同的子类...

一枚Sir
2014/04/11
552
0
lucene4.7删除索引失败

我使用的是lucene4.7 两个问题: 1 更新索引时不会在原基础上更新,会新增一条。 2 删除索引时删除不掉。 创建IndexWriter的方法 把数据库对象生成索引的方法: 其中LuceneAppUtils是一个工具...

小Y_
2014/06/05
1K
6
Lucene4.7如何遍历索引获得每个词的docFreq,IndexReader没有terms()方法了

Lucene4.7如何遍历索引获得每个词的docFreq,IndexReader没有terms()方法了

_Roger_
2014/03/14
273
0
lucene4.7 锁机制(十)

Lucene的索引体系是一个写独占,读共享的结构,这意味着,我们在使用多线程进行添加索引时,性能并不会得到明显的提升,所以任何时刻只能有一个线程对索引进行写入操作,而保障这个操作的安全...

一枚Sir
2014/04/11
255
0

没有更多内容

加载失败,请刷新页面

加载更多

c++ 虚基类

c++ 虚基类 p556

天王盖地虎626
21分钟前
21
0
Java中的面向对象

一、面向对象 面向对象和面向过程的区别 过程就是函数,就是写方法,就是方法的一种实现。 对象就是将函数,属性的一种封装。用人们思考习惯的方式思考问题。 如何自定义类 修饰符 类名{ //成...

zhiruochujian
29分钟前
3
0
k8s删除Terminating状态的命名空间

背景: 我们都知道在k8s中namespace有两种常见的状态,即Active和Terminating状态,其中后者一般会比较少见,只有当对应的命名空间下还存在运行的资源,但是该命名空间被删除时才会出现所谓的...

Andy-xu
32分钟前
23
0
seata源码阅读笔记

seata源码阅读笔记 本文没有seata的使用方法,怎么使用seata可以参考官方示例,详细的很。 本文基于v0.8.0版本,本文没贴代码。 seata中的三个重要部分: TC:事务协调器,维护全局事务和分支...

东都大狼狗
45分钟前
14
0
Rust:最小化窗口后 CPU占用率高 (winit,glutin,imgui-rust)

最近试着用 imgui-rust 绘制界面,发现窗口最小化后CPU占用会增大。 查询的资料如下: https://github.com/rust-windowing/winit/issues/783 https://github.com/ocornut/imgui/issues/1151 ...

reter
49分钟前
27
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部