散列中的高效模糊查找

时间:2014-08-13 00:27:00

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

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

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

例如,查找hello不仅应返回hello键下索引的所有值,还应返回Hellohello!,{{1}的值}},yellohelo

当然,天真的解决方案是迭代每个键,计算其levenshtein距离,并包括其值,如果它在某个阈值内。但是,这个解决方案不能很好地扩展O(n)时间复杂度来迭代每个密钥,O(n-1)迭代每个密钥以将其与之进行比较,并且每个levenshtein计算得到O(n),从而导致查找O(n * n * n-1)的时间当然是不可接受的。

如何构建此数据以优化查找时间复杂度?空间复杂性,插入,删除和编辑运行时都是无关紧要的(但是,我更喜欢将插入保持在一秒以下,以避免出现瓶颈)。

有关数据的一些信息:

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

1 个答案:

答案 0 :(得分:0)

我不确定这里使用的数据结构,但最简单的选择可能是使用ElasticSearch&#39; s fuzzy query或其亲属。从根本上说,它是使用具有良好优化的反向索引来执行模糊查询。