快捷搜索:

在Linux环境用Python下开发全文索引

跟着信息量的增长,高效地定位特定信息变得越来越紧张。本专栏将探究全文索引领域,并集中评论争论作者的公共域 indexer 模块。

本专栏将探究我的 Python 项目:indexer 模块,并且还有一项特殊目的:我和你们一样也不停尽力进修更多常识,为此,本专栏迎接读者提出自己的意见和设法主见。您的投稿将会在项目中或在未来的专栏里呈现。平日,我盼望本专栏能反应出读者的兴趣和常识而不仅仅是我一小我的。这就让我们开始吧。

我盼望 indexer 模块,纵然是早期的版本也能证实给读者是有用的。此全文 indexer 可作为零丁的实用对象或大年夜型项目的一个模块。其设计阐清楚明了可重复应用的面向工具编码的准则和文本索引(极其精妙而富厚的主题)的基滥觞基本理。只管 Knuth曾经箴规针砭我们:“不成熟的优化是问题的根源”,但索引的目的在于快速地找到信息,是以本专栏同时也将评论争论机能问题。

indexer 模块大年夜约是滥觞于某大年夜学盼望寻求一种好的措施来查找大年夜量文本和 HTML 赞助文档。也是我想使用多年积累下来的信件、新闻和写作档案的一个小念头。很简单, indexer 让用户定位文档时,很难以致无法以规则表达式来指定搜索前提,并且快速的履行。虽然有些商业软件或免费对象能完成类似的事情,但大年夜多都是针对 Web 索引。他们(纵然是经由过程 LOGALHOST 也)必要 CGI 接口,安装和应用都相称艰苦,此中只有独逐一个为 Python 设计的软件(有不合的偏重点)。另一方面,indexer 必须设计成易于应用。当然,有些更早期并且更繁杂的软件功能更强大年夜,但 indexer 设计目的是在不掉其简单易用特点的条件下拓展功能。

关于搜索引擎

本专栏的名称“全文 indexer”附属于另一个更宽泛的种别 -- “搜索引擎”。对大年夜多半用户,搜索引擎平日是用来定位 URL 和 WWW 的。切实着实,WWW 肯定是人类有史以来最大年夜的公共文档库,它的非正规组织布局使其异常必要有好的搜索引擎。而且,其他文档集 -- 分外是包括本地硬盘上赓续增添的文件 -- 也将获益于搜索引擎。分级文件系统和文件命名规范是好措施,但他们的成长还远远不敷;有些时刻您只需找到 包孕某条信息的文档。

互联网搜索引擎有一半的问题在于定位其内容要被索引的文档。虽然有很多措施可以找到许多相关的 URL,但却没有列举每个有效 URL 的算法。幸运的是,当索引本地文档(正如今朝版本的 indexer 这样)时,找到所有文档异常简单;这些文档都位于明确而可定位的地方。而当用户进一步盼望索引某些目录的子目录树而非其它时,文档列表就能变得正确而无漏掉。

在设计本地搜索引擎时有两种不合的策略。可以在搜索时不雅察文件的实际内容以判断是否和搜索前提切合,也可以筹备一个包孕每个文件内容的数据库,然后搜索数据库而不搜索文件本身。第一种措施的优点在于始终维持正确,始终能准确的定位在哪里有您想要的哪些内容。这种分外措施的 最大年夜毛病在于速率分外慢,而且假如进行许多次搜索的话,资源很高。

第二种措施的优点在于假如实施适合,它将快得多。一次搜索通报能天生文档可搜索特点的择要,后继搜索就不必再次涉猎这些文档。这使得搜索资源 更低。毛病在于,数据库可能与文件内容不合步,必要周期性从新索引,而且这种做法会占用额外的空间(被索引文本的大年夜小的 1% 到 100%,由搜索特点和设计选择而定)。

这种特殊措施的示例有 Windows 下的 "File Find"、类 Unix 操作系统的 find 和 grep 对象(与 KDE 中的 kfind)、OS/2 中的 PMSeek.exe 对象和 "Find Object" 还有 MacOS 7 中的 "Finder"。数据库措施包括 Microsoft Office 中的 "Fast Find",Corel Office 中的 "QuickFinder"、 MacOS 8+ 中的 "Sherlock" 还有很有局限性的 Linux 的 locate 实用对象。BeOS 的 "Find" 是两种措施的结合,但功能异常局限 -- 非全文搜索。其他操作系统也供给类似的实用对象。

布尔能力很简单而且也已经在按计划实施。因为 indexer 跟踪哪些文档中包孕哪些单词(和呈现次数),是以假如要在规则中加入逻辑或者根据搜索词语呈现或不呈现来包括文件是很轻易实现的。实际上,今朝的功能本色上默觉得在每个查找词语中心加 AND。(我的直觉是大年夜多半现行的搜索都是这种 "x AND y AND z" 要领的搜索。)

规则表达式险些无法加入到 indexer 中,据我所知没有一个数据库搜索系统具有哪些文件包孕相符哪些规则表达的内容的列表。实用起见,规则表达式必要以特殊要领处置惩罚 -- 为此我们应用 grep。

短语和近似搜索现在并未推行,但实施并不艰苦。基础上,除了每个文件中的每个词语的呈现频率,还必须网络每个文件中词语呈现的偏移列表。根据该列表,我们能推论短语和近似度。然而,我觉得这样做会大年夜幅增添数据库的大年夜小和搜索光阴。

观点上,词干和探测法搜索可能已在现有的基础框架之中,但其必要花费很大年夜的事情量。这种措施切实着实能减小数据库大年夜小,由于只需存储正则形式而不必存储变更形式,但词语转换必要耗损外部类属词典和变更规则形态。

indexer 编程

建议读者下载 indexer 源代码 (请参阅本文后的参考资料)。它只有一个文件,而且有详尽的评释,相称于一本编程册本。

以下是有关法度榜样布局的备注。请留意文档是编号的,每个文档都关联一个整数 "fileid"。 indexer 有一个 Python 词典,其关键字为词语,其值本身又是词典,这个词典的关键字为 "fileid",其值为 "fileid" 指定的词语在文件中的呈现次数。Python 词典的查找效率很高,而且贯穿毗连 "fileid" 和实际文件名的附加事情相对很少。

您可能还会对下面的文章感兴趣: