Ivan's world

search engine, distributed system, asp.net, c#

置顶随笔 #

[置顶]继续我的代码,分享我的快乐 - WEBUS2.0 资源汇总

     摘要:

WEBUS2.0 In Action(WEBUS使用指南)
1. 创建索引
2. 开始搜索
3. 解析索引文件结构(1)
4. 解析索引文件结构(2)
5. 索引操作指南(1)
...  阅读全文

posted @ 2008-01-02 16:51 Ivan Zou 阅读(1523) | 评论 (5)编辑

2008年3月6日 #

WEBUS2.0 In Action - 索引操作指南(1)

     摘要: 1. 索引类
WEBUS中用于索引的类(接口)主要有以下几个:
IIndexWriter(接口)
IIndexReader(接口)
IndexManager(实现IIndexWriter接口和IIndexReader接口)...  阅读全文

posted @ 2008-03-06 13:08 Ivan Zou 阅读(1203) | 评论 (1)编辑

2008年1月21日 #

WEBUS2.0 In Action - 解析索引文件结构(2)

     摘要: 通过前一篇文章,我们知道了WEBUS的索引数据都在一个虚拟的目录(IDirectory)中得以保存。本篇将继续前文,详细解析索引中的数据类型。
为了同时实现关键词搜索和范围搜索,WEBUS的索引采取了“主索引(Master Index)+序列(Sequence)”的方式进行组织...  阅读全文

posted @ 2008-01-21 16:56 Ivan Zou 阅读(1253) | 评论 (3)编辑

2008年1月15日 #

WEBUS2.0 In Action - 解析索引文件结构(1)

     摘要: WEBUS的索引数据全部保存在一种抽象的目录结构中,它既支持实际物理目录,也支持以流(System.IO.Stream)作为数据载体的逻辑目录...物理目录, 逻辑目录, 逻辑流...  阅读全文

posted @ 2008-01-15 15:06 Ivan Zou 阅读(1286) | 评论 (1)编辑

2008年1月5日 #

WEBUS2.0 In Action - 开始搜索

     摘要: 当索引建好之后,要利用WEBUS2.0实现基本搜索功能,至少需要用到如下几个类和接口:
Webus.Index.IIndexReader (接口)
Webus.Index.IndexManager (类,实现IIndexReader)...  阅读全文

posted @ 2008-01-05 10:35 Ivan Zou 阅读(1932) | 评论 (9)编辑

2008年1月3日 #

WEBUS2.0 In Action - 创建索引

     摘要: WEBUS2.0只能够将一种Document数据类型(Webus.Index.Document类)添加到索引中,所有其他类型的数据(如txt、html、word、pdf等等)都需要预先转换成Document才能够对其编制索引...  阅读全文

posted @ 2008-01-03 10:47 Ivan Zou 阅读(1449) | 评论 (1)编辑

2008年1月2日 #

推荐《Lucene In Action》一书

Lucene In Action, 一本极好的搜索引擎开发指南(当然是基于Lucene的开发,如今WEBUS也基本适用)。



全书两大部分,Part 1阐述Lucene的结构和应用方法,也涉及到一些原理的介绍;Part 2阐述Lucene的应用、扩展和相关信息。


如果对搜索引擎和相关应用技术感兴趣,强烈建议研读一下这本书,一定会有收获的!

英文版:下载地址

中文版:电子工业出版社,¥49

posted @ 2008-01-02 17:27 Ivan Zou 阅读(103) | 评论 (0)编辑

继续我的代码,分享我的快乐 - WEBUS2.0 资源汇总

     摘要:

WEBUS2.0 In Action(WEBUS使用指南)
1. 创建索引
2. 开始搜索
3. 解析索引文件结构(1)
4. 解析索引文件结构(2)
5. 索引操作指南(1)
...  阅读全文

posted @ 2008-01-02 16:51 Ivan Zou 阅读(1523) | 评论 (5)编辑

2007年7月10日 #

关于 try..catch..finally

那天中午和同事讨论起c#中的try..catch..finally. 据说有人分析IL发现这块的运行逻辑和原来C++中是不同的( 注1 ). 于是这个原本很清晰的问题在我头脑中又模糊起来. 本着实践出真知的原则, 我特意写了一小段代码调查了一下, 现将结果拿出来与大家分享.

 1     class Program {
 2         static void Main(string[] args) {
 3             try {
 4                 int i = new Program().Test();
 5                 Console.WriteLine(i);
 6             }
 7             catch { }
 8         }
 9 
10         public int Test() {
11             int i = 0;
12             try {
13                 i = int.Parse("2");
14                 return i;
15             }
16             catch {
17                 i = -1;
18                 throw new Exception(i.ToString());
19             }
20             finally {
21                 i = 1;
22             }
23             return i;
24         }
25     }

运行代码,  发现Test函数中是这样运行的:

1. 行号: 11 -> 12 -> 13 -> 14 -> 20 -> 21 -> 22 -> 24.
最终返回结果为2. 也就是说当try块中的代码全部运行完之后, 又跳转到finally块中运行, 完成后直接返回try块中的值.

2. 将上述代码中第14行的 " return i; " 注释掉, 运行顺序变成: 11 -> 12 -> 13 -> 20 -> 21 -> 22 -> 23 -> 24.
最终返回结果为1. 也是先运行完整个try块, 再运行finally块, 最后return.

3. 最后将上述代码第13行改成 " i = int.Parse("2a"); " 制造一个异常. 发现运行顺序变成: 11 -> 12 ->13 -> 16 -> 17 -> 18 -> 20 -> 21 -> 22.
最终抛出异常. 这说明程序是先运行try块, 发现异常后运行catch块, 在离开catch块之前先运行finally块. 然后直接抛出18行的异常.

综合上述三种情况, 我发现其实finally块就是一段独立的代码. 无论是try块还是catch块, 在离开前都会跳转去执行finally中的代码. 但是此时try和catch中的所有代码都已经执行完毕, 因此在运行finally时是不会对前面的结果造成任何影响的. 如此说来编译器不许我们将return之类的代码放到finally中就是很好理解的事情了. ^_^

注1: 在标准C++中是没有finally的, 只有try和catch. 但是在VC中有宏 _try.._except.._finally 可以实现相同的效果. 呵呵, 感谢江南同志!

posted @ 2007-07-10 15:00 Ivan Zou 阅读(609) | 评论 (2)编辑

2007年4月4日 #

小谈Buddy System

Buddy System是一种经典的内存管理算法. 在Unix和Linux操作系统中都有用到. 其作用是减少存储空间中的空洞, 减少碎片, 增加利用率.

在Webus空间管理组件(WSM)中, 我也提供了Buddy System的实现, 关于这种算法的详细描述, 建议大家看经典教材 " 数据结构" 一书第8章第4节.
 呵呵, 蓝色经典!

我在此仅谈谈如下三个问题:
1. Buddy System的基本原理?
2. 如何分配空间?
3. 如何回收空间?


对以上三个问题的说明:
Buddy System把系统中的可用存储空间划分为存储块(Block)来进行管理, 每个存储块的大小必须是2的n次幂(Pow(2, n)), 即1, 2, 4, 8, 16, 32, 64, 128...
假设系统全部可用空间为Pow(2, k), 那么在Buddy System初始化时将生成一个长度为k + 1的可用空间表List, 并将全部可用空间作为一个大小为Pow(2, k)的块挂接在List的最后一个节点上, 如下图:

当用户申请size个字的存储空间时, Buddy System分配的Block大小为Pow(2, m)个字大小(Pow(2, m-1) < size < Pow(2,  m)).
此时Buddy System将在List中的m位置寻找可用的Block. 显然List中这个位置为空, 于是Buddy System就开始寻找向上查找m+1, m+2, 直到达到k为止. 找到k后, 便得到可用Block(k), 此时Block(k)将分裂成两个大小为Pow(k-1)的块, 并将其中一个插入到List中k-1的位置, 同时对另外一个继续进行分裂. 如此以往直到得到两个大小为Pow(2, m)的块为止, 如下图所示:
 
如果系统在运行一段时间之后, List中某个位置n可能会出现多个块, 则将其他块依次链接可用块链表的末尾:

当Buddy System要在n位置取可用块时, 直接从链表头取一个就行了.

当一个存储块不再使用时, 用户应该将该块归还给Buddy System. 此时系统将根据Block的大小计算出其在List中的位置, 然后插入到可用块链表的末尾. 在这一步完成后, 系统立即开始合并操作. 该操作是将"伙伴"合并到一起, 并放到List的下一个位置中, 并继续对更大的块进行合并, 直到无法合并为止.

何谓"伙伴"? 如前所述, 在分配存储块时经常会将一个大的存储块分裂成两个大小相等的小块, 那么这两个小块就称为"伙伴".在Buddy System进行合并时, 只会将互为伙伴的两个存储块合并成大块, 也就是说如果有两个存储块大小相同, 地址也相邻, 但是不是由同一个大块分裂出来的, 也不会被合并起来. 正常情况下, 起始地址为p, 大小为Pow(2, k)的存储块, 其伙伴块的起始地址为: p + Pow(2, k) 和 p - Pow(2, k).

下面把数据结构一书中Buddy算法分配存储块的C++伪码帖出来以供大家参考:
Space AllocBuddy(FreeList &avail, int n)
{
    
//avail[0..m]为可利用空间表, n为申请分配量, 若有不小于n的空闲块,
    
//则分配相应的存储块, 并返回其首地址, 否则返回NULL
    for(k=0; k<=&& (avail[k].nodesize < n+1 || !avail[k].first); ++k);//查找满足分配要求的子表
    if(k>m) return NULL;//分配失败, 返回NULL;
    else {//可进行分配
        pa = avail[k].first;//指向可分配子表的第一个节点
        pre = pa->llink; suc = pa->rlink;//分配指向前驱和后继
        if(pa == suc) avail[k].first = NULL;//分配后该子表变为空表
        else {//从子表删除*pa节点
            pre->rlink = suc; suc->llink = pre; avail[k].first = suc;
        }

    }

    
for(i = 1; avail[k-i].nodesize >= n+1++i) {
        pi 
= pa + pow(2, k-i); pi-> rlink = pi; pi ->llink = pi;
        pi 
-> tag = 0; pi -> kval = k-i; avail[k-i].first = pi;
    }
//将剩余块插入相应子表
    pa -> tag = 1; pa -> kval = k-(--i);
    
return pa;
}

关于存储块回收算法, 书上没有现成的, 日后笑侃一定提供给大家, 呵呵, 今日工作繁忙, 精力不济, 要挂起了. 感谢大家的关注!
, sleeping...

相关资料:
Buddy算法认识(草稿)
Linux存储管理
Linux内存管理算法源码

posted @ 2007-04-04 23:58 Ivan Zou 阅读(2290) | 评论 (0)编辑

2007年4月1日 #

用Lucene.Net轻松创建最简单的搜索引擎

呵呵, 本来应该发布为随笔的, 不过错发为文章了. 这里转一下, 顺便做个摘要:

用Lucene.Net轻松创建最简单的搜索引擎

Lucene是当下最受欢迎的Java开源搜索引擎开发包. 其实从本质上说, 它就是一个索引和检索的软件系统.
在Lucene中有一种特定的类型: Document, 它是一个Key-Value类型的集合. 我们只要将需要被索引的内容填入进去, Lucene就能够自动为其建立索引, 并且提供搜索. 因此, 通过Document, Lucene可以索引任何类型.

前几天一个做职位信息搜索的朋友让我给他的搜索引擎提提意见, 我试用后发现他其实需要一个很好的索引/检索系统来改善搜索效率. 于是就推荐Lucene.Net(Lucene.Net是Lucene的.Net版本)给他用.

用Lucene.Net创建搜索引擎其实十分简单, 为了让他更加容易上手, 我写了一个文件搜索引擎作为Demo...

阅读全文

posted @ 2007-04-01 12:27 Ivan Zou 阅读(231) | 评论 (0)编辑