.net - 最快的搜索技术/方法是什么? (在文件搜索的上下文中)

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

我不知道它们在普通的Windows搜索中会使用什么,但是有一种技术可以让您一次使用文件索引,然后在以后使用索引来加快搜索速度(例如Windows search 4.0)。

除此之外,还有其他方法可以更快地进行搜索吗?您能否从实现的角度进行详细说明? (假设我可能需要实现)

为了易于理解,让我这样说:

假设我要构建一个搜索应用程序,该应用程序执行与我们在Windows中使用的搜索操作类似的搜索操作。

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

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

最佳答案

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

发布列表是(term,document_id)对的列表,可以选择在文档中具有位置。如果按术语对其进行排序或对其进行哈希处理,则将具有可有效搜索的全文本索引。

有多种使发布列表更小,访问更快,更新更快和更灵活的技术,其中一些是以准确性为代价的。 Lucene可能是当今可用的最好的基于现成列表的文本索引器,并且(与您先前的评论相反),Lucene可以索引PDF,Microsoft Word等文件中的文本。 Thomas Maierhofer链接的Lucene.net project看起来是一个相当合理的端口,尽管当然,您始终总是落后于Java版本中的最新技术。

对于比内存大得多的语料库,您几乎必须将发布列表存储在磁盘上。这不利于使用简单的二进制搜索树进行访问:如果您有十万个文档,每个文档有一万个单词,那么您有十亿个帖子,这意味着您的二进制搜索树的最小深度为30。通常,从树的根到叶的路径上的30个节点将位于磁盘的不同部分,因此磁盘必须搜索30次才能找到一个词的发布!那大约是2½秒,这太慢了。

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

例如,以牺牲准确性为代价使发布列表变小,“管理千兆字节”书(和mg4j project)具有称为“有符号最小完美哈希表”的数据结构,该数据结构实际上并不存储被索引的术语,只是它们的哈希值。因此,误报的可能性很小-您必须检索据称包含该术语的文档,以确认它们确实确实存在。

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

我的熟人Tim早在2003年就撰写了一系列非常不错的博客文章on search,这些文章仍然非常棒。他们将更深入地介绍这些内容(最近的发展除外)。

拉维:这是您正在寻找的信息吗?

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

关于.net - 最快的搜索技术/方法是什么? (在文件搜索的上下文中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1415078/

相关文章:

c# - 如何异步使用 HttpWebRequest (.NET)?

.net - DSL : TCL or Lisp? 有什么更好的

c# - 在 C# 中动态创建和释放控件

java - java类中的类

java - Java 中的循环链表

c - 二维结构数组 -> 无法修复段错误 :(

MySQL全文检索外键包含的数据

c# - 添加对 Office 库的引用失败 : type or namespace name Word not found

ruby-on-rails - 在附件中实现全文搜索

mysql - mysql fulltext 的性能取决于关键字的顺序