哪种搜索技术/方法最快? (在文件搜索的上下文中)

时间:2009-09-12 13:10:37

标签: .net data-structures full-text-search filesystems search

我不知道他们在正常的Windows搜索中使用了什么。但是有一种技术可以让您一次使用文件索引,然后使用索引进行更快速的搜索。(例如Windows搜索4.0)

还有其他方法可以加快搜索速度吗?你能从实施的角度详细说明吗? (假设我可能需要实现它)

为了简化理解,让我这样说:

假设我想构建一个搜索应用程序,它执行类似于我们在windows中使用的搜索操作。

我的问题是,构建此类应用程序的可能选项/方法/方法有哪些? (它比现有的更快。)

(可以使用二叉搜索树的技术吗?)

8 个答案:

答案 0 :(得分:22)

基本上有两种技术用于对大型语料库进行全文搜索:发布列表和后缀数组。

发布列表是(term,document_id)对的列表,可选地在文档中具有位置。如果您按术语对其进行排序或散列,则可以使用可高效搜索的全文索引。

有各种技术可以使发布列表更小,访问更快,更新更快,更灵活,有些则以准确性为代价。 Lucene可能是目前最好的现成的基于发布列表的文本索引器,并且(与之前的评论相反)它可以索引PDF,Microsoft Word等文件中的文本。由Thomas Maierhofer链接的Lucene.net project看起来是一个非常合理的端口,当然,你总是会落后于Java版本的前沿。

对于比内存大得多的语料库,您几乎必须将发布列表存储在磁盘上。这有利于使用一个简单的二叉搜索树来访问它:如果你有十万个文件,每个万字,你有十亿个帖子,这意味着你的二叉搜索树的最小深度为30.这个问题是从树的根到叶子的路径上的30个节点通常位于磁盘的不同部分 - 因此磁盘必须寻找30次才能找到一个术语的发布!这大概是2½秒,这非常慢。

但是,有一个名为“B-tree”的二叉树数据结构的修改版本,可以工作。 Lucene使用的简单数据结构很像B树,但更容易支持大量更新。我在自己的dumbfts project中编写了一个非常简单的相同数据结构版本,它在几页Python中实现了我的电子邮件的全文搜索引擎。我每天都使用它,它是免费软件,它对我使用它的效果非常好,但它并不是像Lucene这样的世界级搜索系统。

作为以精确度为代价使发布列表更小的示例,管理技嘉书(以及mg4j project)具有称为“签名的最小完美哈希表”的数据结构,其实际上不存储索引的术语 - 只是它们的哈希值。因此,假阳性的可能性很小 - 您必须检索包含该术语的文档,以确认它们确实存在。

后缀数组是一个更紧凑,速度稍慢的基数树(又名尝试),由GLIMPSE和其他一些程序实现,但它们基本上已经不再使用了。它们具有发布列表数据结构中不存在的一些灵活性 - 例如,它们允许正则表达式搜索和拼写错误搜索,但它们不是那么快。最近有一些基于后缀数组的Burrows-Wheeler变换工作,它提供了一种压缩算法,其中压缩文件全文索引!最好的文档版本称为FM-index,虽然我听说有这种技术的旧版本,可能未发表。不同于上面描述的其他技术,我认为当文档是PDF文件或类似的东西时,这实际上不起作用 - 您仍然可以使用相同的方法来提取每个页面的文本版本并将其编入索引,但是你不要没有压缩原始文件的好处。

我的熟人蒂姆在2003年写了一篇非常好的系列博客帖子on search,但仍然非常棒。他们更深入地介绍了这些内容(除了最近的发展)。

拉维:这是你要找的那种信息吗?

编辑:感谢您修改我的格式,马丁!

答案 1 :(得分:14)

看看Lucene。它是文本(文件)的超快速搜索库。还有Lucene.NET可用。如果您想自己实现它,那么它是您实现的良好起点和基准。

答案 2 :(得分:2)

您是仅搜索文件名还是要查看内容?您想用什么语言实现这个?

如果你只是在寻找文件名,那么索引是一个很大的性能提升,而如果你需要打开你想要查找的每个文件,索引只会帮助你只打开那些文件您要查找的内容可能位于

的位置。

它仍然需要您打开每个文件,直到找到您要注意的内容。

答案 3 :(得分:1)

全文搜索:想象一下,您有一个单词词典,并且对于每个单词,您都记下了包含该单词的文档以及该单词在该文档中的确切位置。这称为全文索引,它允许您执行布尔搜索和匹配精确短语之类的操作。全文索引可以轻松扩展到数百万个文档,是Windows Search 4.0通常使用的。另见Lucene或Sphinx。

概念搜索:概念搜索允许您输入一堆相关的单词(甚至整个文档)并返回与您的输入最相似的文档。根据您的文档集合,它生成概念空间,允许它推断单词之间的语义链接。这允许它返回更相关的搜索结果,因为计算机“理解”您正在搜索的概念,并且将匹配概念上相似的单词和短语。这就是企业搜索和eDiscovery解决方案常用的方法。提供概念搜索的产品包括Engenium和Autonomy。

元搜索:您不是直接搜索内容,而是搜索有关内容的信息,称为元数据。元数据可以包括标签,关键字,作者姓名,时间戳等内容。例如,如果您知道撰写文档的大致日期,则可以在搜索条件中包含该元数据,以便更快地缩小搜索范围。结果

正如您所知,有许多方法可以进行搜索,每种方法都涉及许多不同类型的数据结构。如果您希望我详细说明某个特定领域,我可以为您做到这一点。

答案 4 :(得分:1)

网上有很多关于全文搜索的研究论文,有很多源代码。如果你看一下它们,你会发现使用二叉搜索树不会在现代硬件上提供良好的结果。二叉搜索树是一种非常特定的数据结构,在具有多级缓存的现代cpu上尽可能不快。快速数据结构的扇出率高于2。

此外,问题更适合(基数)特里。见维基百科。

答案 5 :(得分:1)

你可以使用knuth-morris-pratt或boyer-more搜索,它们非常快,你不需要索引。

答案 6 :(得分:1)

没有单一的技术或“银弹”。但如果您从头开始,请更好地了解该主题的thisthis标准文字。

答案 7 :(得分:-1)

也许您可以根据自己的需要调整PigeonRank™:)