[搜索引擎研究和开发]纯手工编写操作I/O文件流的TAG网站标签系统(索引原理)...

        本人喜欢钻研技术,两年前就已经对搜索引擎的海量数据检索兴趣甚浓,而.NET中的类库功能强大,非常方便于快速编写代码以实现自己的想法。
        对于全文检索引擎,如何能够令其在极短的时间内查找到用户所需要的数据,对应付大量的并发访问极具意义。海量数据检索的核心在于索引的合理设计,以及对查询结果的整合和排序上。以本人所测试出来的经验,一个普通的二分查找算法,即使在一个高达数十G的索引文件里进行全索引检索,它所消耗的性能相对于结果集的整合和 排序几乎可以忽略不计。      
        本人于去年秋天,编写了一个单域、单词条的索引系统,用作开发搜索引擎的第一步,在此把源代码公布出来与诸位切磋。此组件支持单索引列、多列储存,目前只支持索引列的单条件(不支持AND、OR之类的组合关系)检索,不支持多列检索。

        该组件可用作网站的TAG系统,就是一个TAG对应若个文章或资源ID,通过对该TAG的筛选,把与之对应的资源ID列出。

        话不多说请看以下调用API。
        
        首先请 下载源程序GeToolbox.IDXDB.rar到你本机,用Visual Studio 2005打开,编译成功后,就可以添加引用到你的项目中了。

        1、引用命名空间:
1 None.gif using  GeToolbox.IDXDB;
2 None.gif using  GeToolbox.IDXDB.Index;
          
         2、创建索引文件:
None.gif              // 索引文件的保存路径
None.gif
             string  path  =   @" F:\WebAspx\GeToolbox\tags.db " ;
None.gif            IDXDB.Index.CreateIndex db 
=   new  IDXDB.Index.CreateIndex(path, IDXDB.Index.EnumIndexType.Tree);
None.gif            
// 创建一个数据列ArticleId用于存储索文章的ID号
None.gif
            db.Field.Add( " ArticleId " , EnumDataType.Int32);
None.gif            
// 执行创建命令
None.gif
            db.Create();
None.gif            
// 关闭索引文件流
None.gif
            db.Close();
 
       3、写入索引文件
 1 None.gif              // 加载索引架构
 2 None.gif             IDXDB.Index.IndexSchema schema  =   IDXDB.Index.IndexSchema.LoadIndex(path);
 3 None.gif             // 创建索引写入类的类例
 4 None.gif             IDXDB.Index.WriteIndex wi  =   new  IDXDB.Index.WriteIndex(schema);
 5 None.gif             // 测试,把10000个记录写入索引文件中
 6 None.gif              for  ( int  i  =   0 ; i  <   10000 ; i ++ )
 7 ExpandedBlockStart.gifContractedBlock.gif             dot.gif {
 8InBlock.gif                //从索引中创建一个新的文档实例
 9InBlock.gif                Document doc = wi.NewDocument();
10InBlock.gif                //给索引列赋值
11InBlock.gif                doc.IndexKey.value = "" + i.ToString() + "个标签";
12InBlock.gif                //记录文章号,只存储,不能检索
13InBlock.gif                doc["ArticleId"= i.ToString();
14InBlock.gif                //添加到索引中
15InBlock.gif                wi.AddDocument(doc);
16ExpandedBlockEnd.gif            }

17 None.gif             // 关闭索引文件流
18                  wi..Close();

        4、索引检索:
None.gif              // 加载索引架构
None.gif
            IDXDB.Index.IndexSchema schema  =   IDXDB.Index.IndexSchema.LoadIndex(path);
None.gif            
// 索引检索
None.gif
            ReaderIndex ri  =   new  ReaderIndex(schema);
None.gif            Hits hits 
=  ri.IndexSearch( " 第567个检签 " );
None.gif            
// 遍历结果集合并打印
None.gif
             for  ( int  i  =   0 ; i  <  hits.Count; i ++ )
ExpandedBlockStart.gifContractedBlock.gif            
dot.gif {
InBlock.gif                Console.WriteLine(
"索引号:" + hits.GetResult(i).Index);
InBlock.gif                Console.WriteLine(
"标签名称:" + hits.GetResult(i).IndexKey.value);
InBlock.gif                Console.WriteLine(
"文章号:" + hits.GetResult(i)["ArticleId"]);
ExpandedBlockEnd.gif            }

None.gif            
// 关闭索引
None.gif
            schema.Close();

         基本测试代码就是上面的了,可能还存不少BUG,欢迎同行指正!

         关于.NET搜索引擎的开发,本人会在后续的文章中总结。敬请关注。

转载于:https://www.cnblogs.com/ieasp/archive/2007/08/15/856059.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值