对于全文检索引擎,如何能够令其在极短的时间内查找到用户所需要的数据,对应付大量的并发访问极具意义。海量数据检索的核心在于索引的合理设计,以及对查询结果的整合和排序上。以本人所测试出来的经验,一个普通的二分查找算法,即使在一个高达数十G的索引文件里进行全索引检索,它所消耗的性能相对于结果集的整合和 排序几乎可以忽略不计。
本人于去年秋天,编写了一个单域、单词条的索引系统,用作开发搜索引擎的第一步,在此把源代码公布出来与诸位切磋。此组件支持单索引列、多列储存,目前只支持索引列的单条件(不支持AND、OR之类的组合关系)检索,不支持多列检索。
该组件可用作网站的TAG系统,就是一个TAG对应若个文章或资源ID,通过对该TAG的筛选,把与之对应的资源ID列出。
话不多说请看以下调用API。
首先请 下载源程序GeToolbox.IDXDB.rar到你本机,用Visual Studio 2005打开,编译成功后,就可以添加引用到你的项目中了。
1、引用命名空间:
1
using
GeToolbox.IDXDB;
2 using GeToolbox.IDXDB.Index;
2 using 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搜索引擎的开发,本人会在后续的文章中总结。敬请关注。