【问题标题】:what is the fastest word search on index?索引上最快的单词搜索是什么?
【发布时间】:2009-07-13 01:49:01
【问题描述】:

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

【问题讨论】:

    标签: search


    【解决方案1】:

    您可能想查看Tries,在许多情况下它们比二分查找更快。

    【讨论】:

    • 问题是,我在非常大的磁盘文件(随机访问)上搜索,而不是在预加载的树上。
    • 因为这个 B*trees 很难被击败
    【解决方案2】:

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

    由于您正在查看相似的单词,也许您可​​以通过诸如 soundex 之类的方式将这些单词分组到许多文件中,从而为您提供更短的单词列表来计算到它们的距离。 http://en.wikipedia.org/wiki/Soundex

    【讨论】:

    • 如何实现大索引的大哈希表?将它们加载到内存中?因为我在这里谈论 50GB+ 的索引文件。
    • 它是一个研究文档的集合(多语言 utf8),索引的字典文件(字长 + 单词 + 文档内容的偏移量)超过 50GB
    【解决方案3】:

    在您的情况下,我不会重新发明轮子 - 而是使用适当版本的 Berkeley DB(现在由 Oracle 拥有,但仍然是开源的,就像它在拥有和开发时一样由加州大学伯克利分校,后来由 Sleepycat 拥有和开发;-)。

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

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

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

    【讨论】:

    • memcached 是一种流行的高性能内存分布式哈希表,用于许多大型网站。
    • @Jim,是的,我使用 memcached(尤其是它的 GAE 实现,尤其是 memcache - 原始和 GAE 都归功于我的朋友和同事 Brian Fitzpatrick,AKA fitz;-)定期,但是 OP 所说的 500 GB 索引大小,memcache 并没有太大帮助......你有多少数百台机器专门用于作为 memcached 分片?!-)。
    【解决方案4】:

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

    1. “倒排索引”,您可以在其中保存所有单词,每个单词都有一个找到的位置列表
      • 该文件的索引,以快速找到任何单词。应该很容易放入 RAM,因此它可以是一个非常有效的结构,例如哈希表或红/黑树。我猜第一个索引不会经常更新,所以也许可以得到一个perfect hash

    或者,只需使用XapianLucene 或任何其他此类库。有几个被广泛使用和优化的。

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

    【讨论】:

    • 实际上我不得不重新发明轮子,因为收藏品每个月都在快速增长,而且我们有依赖于我们自定义单词级倒排索引格式的遗留应用程序。所以我的任务是为一些新的应用程序构建新的搜索界面。我打算将 Tries(由 uniquesnowflake8 建议)与红黑树进行基准测试,看看哪个是最好的。谢谢大家的回复,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 2021-09-07
    • 2011-03-12
    • 1970-01-01
    相关资源
    最近更新 更多