WEBUS2.0 In Action - 索引操作指南(1)
上一篇:WEBUS2.0 In Action - 解析索引文件结构(2) | 下一篇:WEBUS2.0 In Action - 索引操作指南(2)
1. 索引类
WEBUS中用于索引的类(接口)主要有以下几个:
IIndexable(接口)
IQueriable(接口)
IndexManager(实现IIndexable接口和IQueriable接口)
IndexOpenMode
这几个接口和类中,IndexManager是核心,它实现了IIndexable和IQueriable。通常情况下,我们使用IIndexable来对索引进行写操作;而使用IQueriable来对索引进行读操作。
利用IIndexable对象,我们可以新建一个索引或者打开现有索引:
IIndexable writer1 = new IndexManager();
writer1.New(@"F:\Index1");
//Open an index for writing
IIndexable writer2 = new IndexManager();
writer2.Open(@"F:\Index2", IndexOpenMode.Write);
IndexOpenMode是一个枚举型,有两个项:
IndexOpenMode.Read:以只读方式打开,一般用于构造一个IQueriable对象;
IndexOpenMode.Write:以读写方式打开,一般用于构造一个IIndexable对象。
2. 理解索引过程
在前面的章节中已经介绍过WEBUS索引的基本文件结构了,现在来讲讲数据的处理流程。
2.1 保存文档(Document,简称Doc)
早在“编制索引”一节中就已经介绍过,WEBUS中所有数据都是以Doc对象的形式添加到索引中的。在编制索引时,第一个操作步骤就是将Doc序列化之后写入到索引文件中。当然这个步骤是可以控制的,如果我们不想将Doc中某个字段写入到索引中,只需要将这个Field的FieldAttributes设置为UnStore就行了:
//对HTML字段编制索引,但是不保存内容
doc.Fields.Add(new Field("HTML", html, FieldAttributes.Index | FieldAttributes.UnStore));
2.2 分析
当Doc保存之后,WEBUS立即就对有需要的字段进行分析(由FieldAttributes.Analyse属性指定)。分析的过程就是将Field的原始Value切割或者转化成很多小块的语汇单元(Token),然后按照顺序将语汇单元输出到下个步骤之中;如果字段无需分析,则WEBUS会将整个Field.Value当做一个Token编制索引。
在分析的过程中,WEBUS会用到分析器(Analyzer)的进行处理。关于Analyzer我将在后面的章节中对其进行详细描述。
2.3 编制索引
随着分析的进行,WEBUS会及时的将得到的Token与Doc List对应起来,添加到倒排索引(以Hash表为存储结构)中。这个过程实际上分为两步:
a. 首先将Token-Doc List信息添加到内存中的索引中;
b. 然后将内存中的满足条件的索引项Dump到BHS索引(一种磁盘上的索引格式)中。
对于步骤b,我们可以通过DumpSize和DumpDocs来控制Dump过程。
DumpSize指DocList中文档的个数Count。如果Count大于等于DumpSize,就将索引项从内存Dump到BHS索引中;
DumpDocs指从上次Dump开始,添加到索引中的Document的个数Count。如果Count大于DumpDocs,就检查有没有需要Dump的索引项。
2.4 排序
如果WEBUS遇到被指定了FieldAttributes.Sort属性Field,就会按照这个字段的值对其进行排序,并且将排好顺序之后的DocId保存在一个序列文件中。以便在日后需要对范围进行搜索的时候利用二分查找法对其进行快速检索。
2.5 其他处理
除了序列化文档、编制倒排索引、排序之外,WEBUS还做了很多额外的工作。比如对关键词和被删除Doc的记录和检索等等。
相关信息及WEBUS2.0 SDK下载:继续我的代码,分享我的快乐 - WEBUS2.0