[搜索引擎研究和开发]纯手工编写操作I/O文件流的TAG网站标签系统(索引原理)
本人喜欢钻研技术,两年前就已经对搜索引擎的海量数据检索兴趣甚浓,而.NET中的类库功能强大,非常方便于快速编写代码以实现自己的想法。
对于全文检索引擎,如何能够令其在极短的时间内查找到用户所需要的数据,对应付大量的并发访问极具意义。海量数据检索的核心在于索引的合理设计,以及对查询结果的整合和排序上。以本人所测试出来的经验,一个普通的二分查找算法,即使在一个高达数十G的索引文件里进行全索引检索,它所消耗的性能相对于结果集的整合和 排序几乎可以忽略不计。
本人于去年秋天,编写了一个单域、单词条的索引系统,用作开发搜索引擎的第一步,在此把源代码公布出来与诸位切磋。此组件支持单索引列、多列储存,目前只支持索引列的单条件(不支持AND、OR之类的组合关系)检索,不支持多列检索。
该组件可用作网站的TAG系统,就是一个TAG对应若个文章或资源ID,通过对该TAG的筛选,把与之对应的资源ID列出。
话不多说请看以下调用API。
首先请下载源程序GeToolbox.IDXDB.rar到你本机,用Visual Studio 2005打开,编译成功后,就可以添加引用到你的项目中了。
1、引用命名空间:
2、创建索引文件:
3、写入索引文件
4、索引检索:
基本测试代码就是上面的了,可能还存不少BUG,欢迎同行指正!
关于.NET搜索引擎的开发,本人会在后续的文章中总结。敬请关注。
对于全文检索引擎,如何能够令其在极短的时间内查找到用户所需要的数据,对应付大量的并发访问极具意义。海量数据检索的核心在于索引的合理设计,以及对查询结果的整合和排序上。以本人所测试出来的经验,一个普通的二分查找算法,即使在一个高达数十G的索引文件里进行全索引检索,它所消耗的性能相对于结果集的整合和 排序几乎可以忽略不计。
本人于去年秋天,编写了一个单域、单词条的索引系统,用作开发搜索引擎的第一步,在此把源代码公布出来与诸位切磋。此组件支持单索引列、多列储存,目前只支持索引列的单条件(不支持AND、OR之类的组合关系)检索,不支持多列检索。
该组件可用作网站的TAG系统,就是一个TAG对应若个文章或资源ID,通过对该TAG的筛选,把与之对应的资源ID列出。
话不多说请看以下调用API。
首先请下载源程序GeToolbox.IDXDB.rar到你本机,用Visual Studio 2005打开,编译成功后,就可以添加引用到你的项目中了。
1、引用命名空间:
1using GeToolbox.IDXDB;
2using GeToolbox.IDXDB.Index;
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();
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();
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();
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搜索引擎的开发,本人会在后续的文章中总结。敬请关注。