如何为快速搜索索引文件?

时间:2009-05-09 23:07:15

标签: algorithm search indexing

如今,微软和谷歌将索引您硬盘上的文件,以便您可以快速搜索其内容。

我想知道的是他们是如何做到的?你能描述一下算法吗?

3 个答案:

答案 0 :(得分:12)

简单的情况是倒排索引。

最基本的算法很简单:

  • 扫描文件中的单词,创建一个独特单词列表
  • 规范化并过滤单词
  • 将一个条目与该索引中的文件绑定

详情是事情变得棘手,但基本原理是一样的。

通过“规范化和过滤”这些词,我的意思是将所有内容转换为小写,删除常见的“停用词”(if,if,in等),可能是“词干”(删除动词的常见后缀和复数等等。

之后,您将获得该文件的唯一单词列表,您可以构建索引。

有减少存储的优化,检查单词局部性的技术(例如,文档中“这个”附近的“这个”)。

但是,这是它完成的基本方式。

答案 1 :(得分:10)

这是一个非常基本的描述;有关详细信息,请阅读此教科书(免费在线):http://informationretrieval.org/¹

1)。对于所有文件,请创建索引。索引由数据集中出现的所有唯一单词组成(称为“语料库”)。每个单词都与文档ID列表相关联;每个文档id指的是包含单词的文档。

变体:有时当您生成索引时,您要忽略停用词(“a”,“the”等)。但是你必须小心(“成为或不成为”是一个由停用词组成的真实查询)。

有时你也会说出这些话。这对使用后缀和前缀的非英语语言的搜索质量有更大的影响。

2)当用户输入查询时,查找相应的列表并合并它们。如果它是一个严格的布尔查询,那么该过程非常简单 - 对于AND,docid必须出现在所有单词列表中,对于OR,至少在一个单词列表中等。

3)如果您想对结果进行排名,有很多方法可以做到这一点,但基本思路是使用文档中出现单词的频率,与您期望的频率相比较发生在语料库中的任何文档中,作为文档或多或少相关的信号。见教科书。

4)您还可以存储单词位置以推断短语等。

大部分内容与桌面搜索无关,因为您更感兴趣的是回忆(包含该术语的所有文档)而不是排名。


¹之前在http://www-csli.stanford.edu/~hinrich/information-retrieval-book.html上,可以通过返回机器

访问

答案 2 :(得分:2)

您可以随时查看Apache Lucene之类的内容。

Apache Lucene是一个完全用Java编写的高性能,功能齐全的文本搜索引擎库。它是一种适用于几乎所有需要全文搜索的应用程序的技术,尤其是跨平台搜索。