代码的研究者

专心、专注、专精

导航

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

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

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

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

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

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

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

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

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

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

posted on 2007-08-15 01:24  李 飞  阅读(859)  评论(5编辑  收藏  举报