什么是索引上最快的单词搜索?

时间:2009-07-13 01:49:01

标签: search

我正在编写一个查询引擎来搜索一个非常大的排序索引文件。所以这是我的计划,使用二进制搜索扫描和Levenshtein distance单词比较进行匹配。有更好或更快的方式吗?感谢。

4 个答案:

答案 0 :(得分:1)

您可能希望查看Tries,在许多情况下,它们比二进制搜索更快。

答案 1 :(得分:1)

如果您正在搜索确切的单词,我会建议一个大的哈希表,它会在一次查找中为您提供结果。

由于你正在查看类似的单词,也许你可以通过像soundex这样的东西将单词分组到很多文件中,为你提供更短的单词列表来计算距离。 http://en.wikipedia.org/wiki/Soundex

答案 2 :(得分:1)

在你的鞋子里,我不会重新发明轮子 - 相反,我会找到适当版本的Berkeley DB(现在由Oracle拥有,但仍然是开源的,就像它拥有它一样由加州大学伯克利分校开发,后来由Sleepycat拥有和开发; - )。

本机接口是C和Java(实际上还没有尝试过后者),但是Python接口也相当不错(实际上现在它已经不再是Python的标准库了,因为它可以更好地跟上游开发;-),C ++当然不是问题等等 - 我很确定你可以使用大多数语言。

并且,您可以选择“BTree”(实际上更像是B*Tree)和哈希(以及其他在您的情况下没有帮助的方法) - 使用实际数据进行基准测试,顺便说一句,你可能会对性能和存储成本感到惊讶(

如果你需要在你的索引问题上抛出多台机器(因为它对于单个机器来说太大而且太重),分布式哈希表是一个好主意 - 原始机器是Chord但是有现在很多其他人(不幸的是我的第一手经验目前仅限于专有经验,所以我不能在这里建议你。)

答案 3 :(得分:1)

David's answer发表评论后,我要说你需要两个不同的索引:

  1. '倒排索引',您可以保留所有单词,每个单词都包含找到的地点列表
    • 该文件的索引,可以快速找到任何单词。应该很容易适应RAM,因此它可以是一个非常有效的结构,如哈希表或红/黑树。我猜第一个索引不经常更新,所以也许有可能获得perfect hash
  2. 或者,只需使用XapianLucene或任何其他此类库。有几种被广泛使用和优化。

    编辑:我对单词比较算法了解不多,但我猜大多数都与散列不兼容。在这种情况下,R / B树或Trie可能是最佳方式。