搜索引擎技术之反向索引设计(inverted index):

来源:互联网 发布:三菱plc编程软件下载 编辑:程序博客网 时间:2024/05/29 04:37

        先解释一下什么叫反向索引:根据关键词反向得到该关键词的其它所有信息,比如该关键词所在的文件,在文件里出现的次数和行数等,这些信息就是用户查找该关键词时所要用的信息.^_^够通俗易懂吧,给点掌声先………….

        

        我设计这部分时采用关键字映射表的方式实现反相索引,建立一个以关键字为内容的索引表,该索引表只有一个字段叫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);

};

原创粉丝点击