科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道在Linux环境用Python下开发全文索引 (1)

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

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

作者:yiaring 来源:赛迪网技术社区 2007年10月20日

关键字: 操作系统 索引 python Linux

  • 评论
  • 分享微博
  • 分享邮件
 

随着信息量的增长,高效地定位特定信息变得越来越重要。本专栏将探讨全文索引领域,并集中讨论作者的公共域 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" 是两种方法的结合,但功能非常局限 -- 非全文搜索。其他操作系统也提供类似的实用工具。

有许多不同方法来指定要搜索的内容。以下为一些示例:

词语出现频率指出一系列搜索词语在文档中的出现频度。此处假设对于给定的搜索,文档中被搜索到的条件出现的比较频繁,就属于“更好”的匹配。

布尔搜索允许出现的文字与短语之间有复杂的关系。例如 "(spam AND eggs) OR (ham AND cheese)" 中,任何括号中的组合都将符合条件,而不必包括另一头分离的词汇。

规则表达式搜索满足(尽可能复杂)的模式。这种方法更有利于查找高度结构化的数据,而不适合识别概念化的内容。

短语搜索只是允许多词条件的搜索。规则表达式搜索虽然能完成相同的搜索,但更简单的系统也能做到。

近似搜索查找一系列相互“接近”的词语或短语。有多接近通常是一项查找选项。

词干搜索,有时候搜索词干而不是整个单词。将 "run"、"runner"、"running" 和 "runs" 当作相关词汇来考虑而将他们全部找到,而不是试图单独搜索符合条件的每个词语,这种做法有时非常有效。

概念搜索通过辨别具有类似涵义的词语来查询具有类似主题的文档。此类搜索需要在搜索引擎中集成某些词典。

探测法搜索可以查询不规则拼写,特别是针对英语。搜索并不使用单词在文中的拼写,而是根据发音将其转换为规则拼写。然后将转换后的文字与转换后的搜索条件做比较。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章