先解释一下什么叫反向索引:根据关键词反向得到该关键词的其它所有信息,比如该关键词所在的文件,在文件里出现的次数和行数等,这些信息就是用户查找该关键词时所要用的信息.^_^够通俗易懂吧,给点掌声先………….
我设计这部分时采用关键字映射表的方式实现反相索引,建立一个以关键字为内容的索引表,该索引表只有一个字段叫indexword用来存储关键字,一般常用的单词也就3000个吧,不是说美国农民一生200个单词就够了么,我熟记单词3000个,还是不如一个美国种地的,跑题了,这3000个单词基本上也就是这个表的容量了,下面的流程,每当有新的term插入时,先去该表查找是否有该字段,如果有打开该表,录入相关信息,否则向关键字表插入该关键字,并以该关键字为表名创建表,录入信息.
信息字段可以分为,文件名,term出现次数,出现行数.
For instance:
Keyword为”be”,我们先在_keyword表内插入”be”,然后创建以”be”为表名的表,然后对应如下字段:
be | |||
ID | FileName | keycount | mlines |
1 | c:/vs/sybdir/wm.log | 3 | 1 5 6 |
2 | c:/vs/sybdir/_error_.txt | 1 | 21 |
3 | c:/vs/wm.log | 3 | 1 5 6 |
4 | c:/vs/_error_.txt | 1 | 21 |
FileName:单词所在的文件名
Keycount:出现次数
Mlines:都是在哪些行里出现的,这一部分对于以后开发HighLight keyword的基础
这里我和lucene的设计做一下对比,lucene采用了词典文件(Term Dictionary)、频率文件(Frequencies)、位置文件(Positions)保存上述信息,都是以stream方式进行存储的,对这些文件操作要做Open的动作,我认为对stream操作,优化的可能实在小了,所以你只能在索引方式来考虑,比如增量索引等,但作为企业级开发我还是推荐性能优良的数据库作为持久化的基础,让一些查询工作由Database去替你做优化.
这里我使用的是Access+ADO的方式来实现持久化的,相信MySql或者SQLsever性能更会好一些,我设计了一个类来完成上述所有的持久化操作,如下:
//微出版 www.epube.biz 相信梦想无界
#pragma once
#import "C://Program Files//Common Files//System//ado//msado15.dll" rename("EOF","adoEOF")
using namespace ADODB;
const CString strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=index.mdb";
#include "Log.h"
class DBOperator
{
protected:
DBOperator(void);
~DBOperator(void);
public:
static DBOperator * getInstance();
int CreateTable(CString tablename);
int OpenTable(CString tablename);
int InsertTable(CString FileName,int keycount,CString mlines);
private:
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
_CommandPtr m_pCommand;
_variant_t RecordsAffected;
Log DBLog;
static DBOperator * _instance;
public:
int InitConnection(void);
int Close(void);
int existKeyword(CString keyword);
int InsertKeyword(CString keyword);
};