如何在大数据中进行模糊搜索

时间:2012-11-22 14:15:43

标签: database search indexing fuzzy-search

我是那个领域的新手,我很想知道最先进的是什么以及我在哪里可以阅读它。

让我们假设我只有一个键/值存储,并且我以某种方式定义了一些距离(key1,key2)(不确定它是否必须是度量,即如果三角不等式必须始终保持)。

我想要的主要是搜索(键)功能,它返回所有带有与搜索键一定距离的键的项目。也许距离限制是可配置的。也许这也只是一个懒惰的迭代器。也许还有一个计数限制,一个项目(键,值)在返回的集合中有一些概率P,其中P = 1 /距离(键,搜索键)左右(即,完美匹配肯定会是在集合和近似匹配中至少具有高概率)。


一个示例应用是MusicBrainz中的指纹匹配。他们使用AcoustId指纹并定义了this compare function。他们使用PostgreSQL GIN索引,我猜(虽然我还没有完全理解/读取acoustid服务器代码)GIN Partial Match Algorithm,但我还没有完全理解这是我要求的以及它是如何工作的。


对于文本,到目前为止我发现的是使用一些phonetic algorithm来根据发音简化单词。一个例子是here。这主要是为了将搜索空间缩小到更小的空间。但是,这有一些限制,例如它必须在较小的空间内完美匹配。

但无论如何,我也在寻找更通用的解决方案,如果存在的话。

3 个答案:

答案 0 :(得分:11)

没有(快速)通用解决方案,每个应用程序都需要不同的方法。

这两个例子都没有实际进行传统的最近邻搜索。 AcoustID(我是作者)只是寻找完全匹配,但它搜索了大量的哈希值,希望它们中的一些匹配。语音搜索示例使用metaphone将单词转换为其语音表示,并且仅查找完全匹配。

您会发现,如果您拥有大量数据,那么使用大型哈希表的精确搜索是您唯一可以实际执行的操作。那么问题就变成了如何将模糊匹配转换为精确搜索。

一种常见的方法是使用locality-sensitive hashing(LSH)和智能散列方法,但正如您在两个示例中所看到的,有时您可以使用更简单的方法。

顺便说一句,您正在寻找专门用于文本搜索的方法,您可以使用最简单的方法将输入拆分为N-grams并对其进行索引。根据您的距离函数的定义方式,这可能会为您提供正确的候选匹配而无需太多工作。

答案 1 :(得分:5)

我建议你看看FLANN Fast Approximate Nearest Neighbors。大数据中的模糊搜索也称为近似最近邻。

这个库提供了不同的度量,例如Euclidian,Hamming和不同的聚类方法:例如LSH或k-means。

搜索始终分为两个阶段。首先,您需要为系统提供数据来训练算法,这可能会耗费大量时间,具体取决于您的数据。 我在不到一分钟的时间内成功聚集了1300万个数据(使用LSH)。

然后是搜索阶段,这非常快。您可以指定最大距离和/或最大邻居数。

正如Lukas所说,没有好的通用解决方案,每个域都会有一些技巧可以让它更快或者找到一种更好的方法来使用您使用的数据的内部属性。

Shazam使用一种带有几何投影的特殊技术来快速找到你的歌曲。在计算机视觉中,我们经常使用BOW:Bag of words,最初出现在文本检索中。

如果您可以将数据视为图形,则可以使用光谱图理论进行近似匹配。

告诉我们。

答案 2 :(得分:1)

取决于您的键/值是什么样的,Levenshtein算法(也称为编辑距离)可以提供帮助。它计算修改一个字符串以获取另一个字符串所需的最少编辑操作数。