如何提高关键词搜索的效果?

时间:2013-03-03 13:38:23

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

这是一个面试问题。

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

我的回答:

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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