【发布时间】:2009-07-13 01:49:01
【问题描述】:
我正在编写一个查询引擎来搜索一个非常大的排序索引文件。所以这是我的计划,使用二进制搜索扫描和Levenshtein distance 单词比较进行匹配。有没有比这更好或更快的方法?谢谢。
【问题讨论】:
标签: search
我正在编写一个查询引擎来搜索一个非常大的排序索引文件。所以这是我的计划,使用二进制搜索扫描和Levenshtein distance 单词比较进行匹配。有没有比这更好或更快的方法?谢谢。
【问题讨论】:
标签: search
您可能想查看Tries,在许多情况下它们比二分查找更快。
【讨论】:
如果您正在搜索确切的单词,我建议您使用一个大哈希表,它可以为您提供一次查找的结果。
由于您正在查看相似的单词,也许您可以通过诸如 soundex 之类的方式将这些单词分组到许多文件中,从而为您提供更短的单词列表来计算到它们的距离。 http://en.wikipedia.org/wiki/Soundex
【讨论】:
在您的情况下,我不会重新发明轮子 - 而是使用适当版本的 Berkeley DB(现在由 Oracle 拥有,但仍然是开源的,就像它在拥有和开发时一样由加州大学伯克利分校,后来由 Sleepycat 拥有和开发;-)。
native 接口是 C 和 Java(后者其实没试过),但是 Python 接口也不错(现在已经不在 Python 的标准库中了,实际上更好,因为它可以更好地跟上上游开发;-),C++ 当然不是问题,等等等等——我很确定你可以使用大多数语言。
而且,您可以选择“BTree”(实际上更像是 B*Tree)和哈希(以及其他对您的情况没有帮助的方法)——用真实数据进行基准测试,顺便说一句,您可能会对性能和存储成本感到惊讶(以某种方式)。
如果您需要多台机器来解决索引问题(因为它对于单个机器来说变得太大太重),分布式哈希表是一个好主意 - 原来的哈希表是 Chord 但还有很多其他的现在(不幸的是,我的第一手经验目前仅限于专有的,所以我不能在这里给你真正的建议)。
【讨论】:
在您对David's answer 发表评论后,我想说您需要两个不同的索引:
或者,只需使用Xapian、Lucene 或任何其他此类库。有几个被广泛使用和优化的。
编辑:我不太了解单词比较算法,但我猜大多数与散列不兼容。在这种情况下,R/B 树或Tries 可能是最好的方法。
【讨论】: