从零开始学习搜索引擎(1)---Searcharoo.net 版本 1
搜索引擎有两个主要步骤:
- 建立。即处理文件,导航内容并且建立目录。
- 查找。利用建立的目录进行查找,针对关键字进行查找。
要建立这样一个目录,有两种手段,一是二叉查找树,二是哈希表,searcharoo第一版为了保持简单,选择了哈希表。建议最好熟悉哈希表的建立过程,我也需要补补。
按原文,searcharoo的对象模型如下:
一个目录对象包含许多 单词 对象,一个 单词 对象又包含许多 文件 对象。在学习的过程中,我发现,这个单词跟我们中文的单词是不一样的,searcharoo第一版是针对英文搜索,所以分词只需通过空格。如果想要对中文分词,也有不少工具。
注:ctor是构造函数。
File:成员就不解释了,简单易懂。
Word:
- text:存放单词
- InFiles():返回单词所在的所有文件。
- add():向word对象中的哈希表添加File对象。
Catalog:成员就不解释了,简单易懂。
查找文件的方式有两种:
1、蜘蛛。通过在html的网页的网络链接,去查找整个网站。
2、爬虫。利用文件系统,爬一系列的文件和文件夹,找到所有的文件。但这种方式只限于locally accessible。
像google,yahoo这样的大型搜索引擎,是通过蜘蛛的方式,去建立他们的目录。通过一个链接去查找文件,要求我们去写一个html转换器,这个转换器可以找到链接并且解释它。这对于一篇文章工作量太大,所以使用爬虫的方式。
用爬虫方式查找文件,只需通过下面的递归算法可找出所有文件。
View Code
private void CrawlPath (string root, string path) {
System.IO.DirectoryInfo m_dir = new System.IO.DirectoryInfo (path);
// ### Look for matching files to summarise what will be catalogued ###
foreach (System.IO.FileInfo f in m_dir.GetFiles(m_filter)) {
Response.Write (path.Substring(root.Length) + @"\" + f.Name + "<br>");
} // foreach
foreach (System.IO.DirectoryInfo d in m_dir.GetDirectories()) {
CrawlPath (root, path + @"\" + d.Name);
} // foreach
}
System.IO.DirectoryInfo m_dir = new System.IO.DirectoryInfo (path);
// ### Look for matching files to summarise what will be catalogued ###
foreach (System.IO.FileInfo f in m_dir.GetFiles(m_filter)) {
Response.Write (path.Substring(root.Length) + @"\" + f.Name + "<br>");
} // foreach
foreach (System.IO.DirectoryInfo d in m_dir.GetDirectories()) {
CrawlPath (root, path + @"\" + d.Name);
} // foreach
}
未完待续。