【问题标题】:Efficient fuzzy lookups in hash哈希中的高效模糊查找
【发布时间】:2014-10-06 05:27:12
【问题描述】:

我有很多数据需要非常快速地进行模糊查询(当然,这是相对的,但是对于大约 1 亿个键来说,在几秒的范围内,但理想情况下更快)。它采用键/值对的形式,其中键是唯一的字符串,值是字符串数组。这是实际数据的结构,但我可以随意将其组织成任何数据结构以加快查找速度。

键值的查找不仅应包括该确切键的值,还应包括在预定阈值(例如 5)内的 levenshtein 距离内的所有键的值。

例如,hello 的查找不仅应返回在 hello 的键下索引的所有值,还应返回 Hellohello!yellohelohellooo 的值等。

当然,最简单的解决方案是遍历每个键,计算它的 levenshtein 距离,如果它在某个阈值内,则包括它的值。然而,这个解决方案不能很好地扩展 O(n) 时间复杂度来迭代每个键,O(n-1) 迭代每个键来比较它,以及 O(n) 每个 levenshtein 计算,导致查找O(n * n * n-1) 的时间,这当然是不可接受的。

如何构建这些数据以优化查找时间复杂度?空间复杂度、插入、删除和编辑运行时都无关紧要(不过,我更愿意将插入时间控制在 1 秒以内,以避免出现瓶颈)。

关于数据的一些信息:

  • 已准备好以 10/秒的相当恒定速率添加唯一键
  • 字符串已准备好以 10/秒的相当恒定的速率附加到值数组
  • 每个键值的大小通常为 1-5 个元素,但有些异常值有数百个
  • 值数组中的每个字符串的长度通常为 20-40 个字符

【问题讨论】:

标签: data-structures nlp levenshtein-distance fuzzy-search


【解决方案1】:

我不确定这里使用的数据结构,但最简单的选择可能是使用 ElasticSearch 的 fuzzy query 或其亲属。从根本上讲,它使用倒排索引,对执行模糊查询进行了很好的优化。

【讨论】:

    猜你喜欢
    • 2014-08-06
    • 2018-12-13
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    相关资源
    最近更新 更多