【问题标题】:How to improve performance of keywords search?如何提高关键字搜索的性能?
【发布时间】:2013-03-03 13:38:22
【问题描述】:

这是一道面试题。

您必须编写程序,该程序会查找包含所有给定关键字的所有文件。您将如何预处理文件以提高搜索性能。

我的回答:

我会使用Lucene(或任何其他文本搜索引擎)。如果我需要手动实现它,我将建立一个索引,将文档单词映射到文档 ids。我们可能应该使用B-trees 来实现该索引。另一种方法是使用 RDBMS(mySQL 或 smth.),但对我来说似乎有点过头了。

这有意义吗?你会如何回答这个问题?

【问题讨论】:

    标签: algorithm data-structures indexing full-text-search


    【解决方案1】:

    我同意,大多数时候文本搜索引擎是要走的路......真的很容易构建和可靠。这里只是一个小细节:大多数引擎默认执行 OR 搜索,因此您必须指定要匹配所有单词。

    如果您必须构建自己的解决方案,是的,显然您必须构建映射。我会使用哈希查找而不是树索引,但您的树可能不会太大,所以这只是一个小问题性能改进。不过,我看不出使用树的意义,你不需要它的遍历功能,你永远不会搜索上一个或下一个单词..

    当您实际检查您将如何使用您的数据结构时,会弹出更多有趣的细节。我们以搜索为例:The pony he comes。直观地说,您不会以the 开始查找,可能所有文档都包含它(假设它们是英文文本)。 pony 是一个不错的选择,可以轻松缩小搜索范围。大多数文本搜索引擎都包含一个指标:有多少文档包含该特定单词。因此,在此基础上,您从出现频率最低的单词开始,然后按频率递增的顺序检查单词。

    一旦您设法缩小搜索范围,您就会开始意识到您的索引不能很好地工作......您仍然需要检查单词 the,并且在您的索引中将显示数以万计的文档,所以在在这一点上,最好使用从文档到单词的反向映射(同样,哈希查找或 trie)。您检查了几份文档,看看它们是否包含剩余的单词。

    注意:这里的很多决定(如何存储映射、简单或双重映射、btree/hash/trie/...)取决于项目的规模。显然,如果你必须在几个文件中搜索,你构建一些简单的东西,如果你必须索引 github 上的所有文件,或者用于基因序列搜索,即使索引可能不适合内存,你也可以构建一些不同的东西......

    【讨论】:

    • 谢谢,很有趣。您建议索引的哈希图。假设索引不适合内存。建议如何实施?
    • 有什么区别?有关系吗?您将拥有存储桶,也许还有链(取决于您使用的哈希类型)..仍然是同一件事..在内存中您有一个内存位置,在磁盘上您在文件中有相对位置...在内存你有内存管理,在磁盘上你必须推出自己的...
    猜你喜欢
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    相关资源
    最近更新 更多