【问题标题】:How do you Index Files for Fast Searches?您如何索引文件以进行快速搜索?
【发布时间】:2010-10-25 01:30:21
【问题描述】:

如今,Microsoft 和 Google 将对您硬盘上的文件编制索引,以便您快速搜索其内容。

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

【问题讨论】:

    标签: algorithm search indexing


    【解决方案1】:

    简单的情况是倒排索引。

    最基本的算法很简单:

    • 扫描文件中的单词,创建唯一单词列表
    • 规范化和过滤单词
    • 在您的索引中放置一个将该词与文件联系起来的条目

    细节是事情变得棘手的地方,但基本原理是一样的。

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

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

    有用于减少存储的优化,用于检查单词位置的技术(例如,文档中的“this”是否靠近“that”)。

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

    【讨论】:

      【解决方案2】:

      这是一个非常基本的描述;更多详情,您可以阅读这本教科书(免费在线):http://informationretrieval.org/¹

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

      变体:有时当您生成索引时,您想忽略停用词(“a”、“the”等)。不过,您必须小心(“to be or not to be”是一个由停用词组成的真实查询)。

      有时你也会阻止单词。这对使用后缀和前缀的非英语语言的搜索质量影响更大。

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

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

      4) 还可以存储词位来推断词组等

      其中大部分与桌面搜索无关,因为您对召回(包含该术语的所有文档)比排名更感兴趣。


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

      【讨论】:

      • 您提供的链接已损坏。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-22
        • 2021-10-01
        • 2023-01-05
        • 1970-01-01
        • 2018-09-20
        • 2014-10-14
        • 2012-03-17
        • 1970-01-01
        相关资源
        最近更新 更多