对于目标文件系统统目录结构和索引方式实验报告

:转载时请以超链接形式标明文章原始出处和作者信息及本声明
Lucene是一个优秀的开源全文搜索项目,很多项目的搜索模块都是使用Lucene。例如大名鼎鼎的eclipse的帮助系统就是使用的Luence作为起做索引的内核。Lucene良好的体系结构使得其API接口非常方便易用,使得非自然语言处理的专业人员可以不用关心内部的索引结构,也可以很快的搭建起一个搜索引擎。但是对于高级用户和专业人员,了解其背后使用的索引结构也是必不可少的。 在研究生阶段,我自己也弄了一个索引结构,好奇心促使我将Luence的索引结构和自己的索引结构进行了一番比较。要比较,首先就要了解;在Lucene的官方主页上有其文档结构的详细文档,下面是我翻译的一部分: 定义: Lucene中最基本的概念有:index, document, term. Index包含一个document序列(document的有序集合)。 1 一个document是一个field序列(field的有序集合) 2 一个field是一个term的命名序列。 3
一个term是一个字符串。
在两个不同field中的同一个字符串被认为是不同的term。因此terms是用一个字符串对来表示,第一个字符串的名字是field,第二个字符串的名字是text. 倒排索引
索引存储关于terms的统计信息以便于基于term的搜索更加有效。Lucene的索引属于被称为倒排索引的索引家族。这是由于针对每个term,他可以列出包含该term的所有文档。这是对自然文档关系的一种倒置,在自然文档关系中,文档包含term。 Fields的类型
在Lucene中,Field分为两种。一种Field是可以被存储的域,在这种情况下,Field中的所有文字都被逐字保存在索引文件中,而不是以倒排的方式保存。另一种是以倒排的方式把文字存储在索引文件中,这种域被称为是倒排的域(Field)。一个域既可以是存储的又是倒排的。
域中的文字可以先被序列化(tokenized)成Terms,然后再索引。域中的文字也可以直接被当成一个Term而被索引。大多数域都被tokenized过,但是有些时候针对某些域直接索引也是很有用的。 Segments(段)
Lucene索引可以由多个子索引构成,这个子索引便叫做段。每个段都是一个完全独立的索引,可以被独立查询。索引是从以下两个方面进化而来: 1 通过增加新的文档创建新的段。 2 合并现存的段。 查询可以包含多个段,也可以包含多个索引,每个索引也可以由多个段构成。Document Numbers(文档号码) 在内部,Lucene通过整数文档号码来引用文档。第一篇加入索引的文档被称为文档0,接下来的每个文档得到比前一个文档增一的号码。注意文档的号码可以改变,因此当把这些号码存储到Lucene以外的系统时必须格外小心。特别的,号码可能在以下情况下发生变化: 1 存储在每个段中的号码只是在该段中唯一,在更大的环境下使用时必须转换。标准的技术是对每个段分配一个值段。当把来自段中的文档号码转换成外部值时,段的基文档号必须被加上。当把外部值转换成段相关的值时,通过文档号所在的范围来确定段,然后减去断的基文档号。例如两个包含五篇文档的段被合并时,第一个段拥有基号码0,第二个拥有基号码5。第二个段的文档三具有外部值八。 2 当文档被删除时,号码中会产成缝隙。这些缝隙最终会被删除当索引通过合并演化时。被当段合并的时候,删除的文档会被丢弃。因此一个刚合并的段在文档号码上是不会有缝隙的。 概述 每个段索引维护以下内容: 域名(Field Name): 包含在该段中使用的所有域的名字的集合。 存储的域值:
对于每个文档,他包含一个属性-值对,属性是域的名字。这些被用来存储关于文档的附加信息,例如文档的标题,URL,存取数据库的标记等等。每次查询的结果都将返回存取域的集合,存储域有文档号码所标记。 Term字典:字典包含了所有文档中所有索引域中使用的Term。字典还记录了包含该Term的文档的号码,以及指向该Term频率和proximity数据的指针。 Term Frequency 数据: 对于字典中的每个Term,包含该Term的文档的号码以及在该文档中出现的频率。 Term Proximity 数据: 对于字典中的每个Term, Term在每个文档中出现的位置。 Normalization factors: 对于每个文档中的每个域,存储着一个值,该值用来标志该域的重要性(在计算score的时候)。 Term Vectors: 对于每篇文档中的每个域,Term向量被存储。Term向量包括Term的文本以及Term频率。 Deleted document: 一个可选的文件用来指示那篇文档被删除了。文件命名: 属于同一个段的所有文件具有相同的名字,不同的后缀。不同的后缀对应于下面描述的不同的文件格式。通常情况下,一个索引的所有段都位于同一个目录下,尽管这不是必须的。 基本类型: Byte
最基本的初等数据类型是八位字节。文件是以字节序列的方式存取。所有其他的数据类型都被定义成字节序列,因此文件格式是字节顺序无关的。
32位无符号整型被写成四个字节,高位先存储。
UInt64 64位无符号整型被写成八个字节,高位先存储。 VInt 正整数的边长格式,每个字节的最高位表示是否还有更多的字节需要读取。后七位被当作高位追加到结果整数值中。因此,从0到127的值可以保存在一个字节中,从128到16383被存储在两个字节中。 Chars Lucen使用Java的”modified UTF-8 encoding来存储Unicode字符串。 String Lucene用长度,字符数据来表示String String->VInt,Chars.在lucene中按照所属关系可以将文件分成两大类,第一类是每个索引相关,也就是说文件是属于某一个索引的。另一类是段相关的,也就是说文件是属于一个段的。 索引相关的文件主要是记录给索引包含多少个段,每个段的名字是什么,有多大等等统计信息。索引相关文件还包括一个锁文件(lock file)用来控制对索引的并发存取。索引文件还包括一个可删除文档列表文件用来记录所有没有被索引使用的文件名。在Lucene1.4中还引入了一个复合文件。复合文件为属于该索引的所有段相关文件提供一个容器,所有段相关的文件都可以放在给复合文件中。众所周知,全文索引的瓶颈在于文件IO的次数,我推测在Lucene1.4中之所以把所有的段相关文件放到一个作为容器的复合文件中就是为了减少文件IO次数,提高查询速度。 在段相关文件中,按照用途有可以分成三类,第一类文件是用来记录域(Field)相关信息的文件。第二类是用来记录”词典(Term Dictionary)"的相关文件;他们记录了索引中所有的单词,单词在那些文档中出现,出现了多少次,具体在文档中的什么位置等等信息。第三类是用来记录单词权重和统计信息的文件,主要是为计算文档向量服务。 例如针对某一具体的查询对所有匹配的文档进行排序的时候,我们可以对某些关键词赋予较高的权重,从而将最相关的文档排在最前面。用户使用Google感觉其查询结果较其他搜索引擎更准确一些,就是由于它在对匹配项进行排序的时候有他的独特算法PageRank. PageRank根据每张网页的入度以及指向该网页的网页的“权威度”计算一个PageRank值,(以前的Google工具条上有这个值,不知道为什么现在没有了) 然后根据PageRank值来排序。这方面也是现在Lucene研究最热的地方。扯远了,就全文检索本身而言,最核心的结构是第二类文件,下图是对这类文件的图解。(我费了一个小时画这幅图啊) 下面是对上图的一些说明,从图中可以看到三个红线筐,每个筐代表一个文件。左边筐的文件后缀是.tis,其中各个字段的名字都能够很清楚的说明其具体意义,需要对IndexInternal和SkipInternal解释一下,由于索引中的词一般都比较多,对图中最左边的矩形筐中的TermInfo有进行的索引,索引存储在另外一个后缀为.tii的文件中。.tii和.tis中的结构和基本相同,只是在.tis中的TermInfo在.tii中换成TermIndex,(TermIndx->),其中IndexDelta指向tis中相应的termInfo项。在tii中不是每个Term都有对应的TermIndex,而是每隔IndexInternal个Term项后才在该文件中存储一项TermIndx。这样可以加速对Term的查找速度。同样的技术也运用在对Document的查找上。从图中可以看出,对每一个Term,在 .frq文件中有一项(TermFreqs 和SkipData)对应于出现该Term所有文档(一个TermFreq对于一偏文档),用来记录文档号码和在该文档(DocDelta)中出现的频率(Freq)(在lucene中记录DocDelta时不是真的记录的文档号码,而是和前一个文档号码的差值,采用这种技术可以减小索引文件大小,另外在记录频率时也不是直接记录频率,也是采用了一个小技巧用来压缩索引大小)。SkipData是用来加速对文档的定位,其中每一项SkipDatum记录了每隔SkipInternal篇文档出现该Term的文档号(DocSkip),还保存了到其他结构的指针。同样在.prx文件中也有一项TermPositions对应一个Term。每个Positions记录了一篇文档中出现该词的位置。PositionDelta是具体的位置偏移。前面罗里罗嗦的解释了一番,总结一下,一共有四个文件(.tii, .tis,.frq,.prx)用来记录Term相关的信息.在.tis文件中,对每个Term都有一项TermInfo,而且TermInfo是根据字典顺序排序。TermInfo中记录的了Term本身,以及一些以在.frq和.prx中和该Term相关详细的指针。.tii是对.tis的一个索引,用来加速对Term的查找。.frq文件记录了每个Term出现的文档号以及其频率,.prx文件记录了每个Term在每篇文档中出现的位置信息。
历史上的今天:
引用地址:
范家晟:佳雪囡:梦の森林:佳雪囡:佳雪囡:佳雪囡:梦の森林:水墨:白粥咸带鱼:佳雪囡: 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
基于序列化方法的RDF图索引与查询
下载积分:2498
内容提示:基于序列化方法的RDF图索引与查询,基于,查询,索引,序列的RDF,索引与查询,RDF,序列化方法, RDF图,RDF查询,RDF图,索引方法,索引查询方法,查询方法,索引和, RDF,序列化,方法查找,RDF序列化,照片,php 序列化,对象序列化,xml序列化,反序列化
文档格式:PDF|
浏览次数:1|
上传日期: 19:35:51|
文档星级:
该用户还上传了这些文档
官方公共微信
下载文档:基于序列化方法的RDF图索引与查询.PDFLinux系统架构与目录解析(邱世华)【电子书籍下载 epub txt pdf doc 】
当前位置 &
Linux系统架构与目录解析
作者:邱世华
出版:电子工业出版社
Linux系统架构与目录解析《Linux系统架构与目录解析》提供了完整的系统启动流程图,为读者说明各个目录与文件位于开机流程中的重点。这是一本剖析Linux经典与常用之目录及文件的专著,打破以往只依赖命令语句的惯性思维,依据系统目录架构为主体,并设计查询功能,以协助读者建立Linux操作系统的整体感观,而不再仅限于对某些服务或设置的片面了解。针对Linux kernel为基础,列出基础且必要的目录结构,可通用于以Linux kernel为核心的各类操作系统。对于修改系统、设定服务,或是设定X Window等必须熟悉的配置文件,以专章篇幅做详细的介绍。依各类应用程序在执行时所须加载的函数库文件,以简明易懂的方式说明其规则或标准。完全解析“主目录”的功能,延伸用户登录的流程及X Windows的操作功能。充分掌握日志文件与暂存信息,引导读者做好“系统管理”的核心工作。以功能分类的方式,详列《Linux系统架构与目录解析》中的各项目录及文件为索引,方便读者查询与使用。《Linux系统架构与目录解析》剖析Linux常用目录及文件的专著,内容全面,通俗易懂。  这是一本剖析Linux经典与常用目录及文件的专著,打破了以往只依赖命令语句的惯性思维,以系统目录架构为主体,并设计查询功能,协助读者建立对Linux操作系统的整体认识,而不再仅限于对某些服务或设置的片面了解。  经典特色:提供完整的系统启动流程图,为读者说明开机流程中各个目录与文件的重点。以Linux kernel为基础,列出基础且必要的目录结构,可适用于以Linux kerrlel为核心的各类操作系统。对于修改系统、设置服务或设置X Wirldew等必须熟悉的设置文件,以专章篇幅作详细的介绍。  根据各类应用程序在执行时所需载入的函数库文件,以简明易懂的方式说明其规则或标准。完全解析“家目录”的功能,扩展用户登录的流程,以及X Wiridow的操作功能。充分掌握日志文件与暂存信息,引导读者做好“系统管理”的核心工作。以功能分类的方式。将《Linux系统架构与目录解析》中的各项目录及文件制作成索引,方便读者查询与使用。
进入下载:
下载一: 下载二:
订阅微信二维码
站长工具:
实用工具:
Copyright &
all rights reserved

我要回帖

更多关于 raw文件系统 的文章

 

随机推荐