algorithm - 如何提高关键字搜索的性能?

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

这是一道面试题。

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

我的回答:

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

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

最佳答案

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

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

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

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

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

关于algorithm - 如何提高关键字搜索的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15186229/

相关文章:

java - 限制条件下的过滤列表

c# - 查找总和最接近给定值的元素

data-structures - 什么是自调整数据结构?

data-structures - 链式哈希集的负载因子

arrays - 在 Postgres 中索引一个 jsonb 数组

php - 如何阻止 PhpStorm 索引我的 `excluded` 目录?

c++ - 更好的可读性和简单性与更高的复杂性和编程速度,该选择什么?

c - 如何解释算法创建说明中的蛮力?

java - 从索引优先级队列中删除 (java)

python - 为什么 SQLite 中的多列索引会降低查询的性能,除非索引所有列?