我刚到那个地区,我最想知道的是什么是最先进的,在哪里我可以读到有关它的资料.

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

我想要的主要是一个搜索(key)函数,它可以返回到搜索键一定距离的所有项目.也许距离限制是可配置的.也许这只是一个懒惰的迭代器.可能还存在计数限制,并且一个项目(键、值)在返回的集合中的概率为P,其中P=1/距离(键、搜索键)左右(即,完美匹配肯定在集合中,并且至少以高概率接近匹配).


一个示例应用是MusicBrainz中的 fingerprint 匹配.他们使用AcoustId fingerprint ,并定义了this compare function.他们使用PostgreSQL gin Index,我猜(尽管我还没有完全理解/阅读acoustid-server代码)GIN Partial Match 算法rithm,但我还没有完全理解这是否是我所要求的,以及它是如何工作的.


在文本方面,到目前为止,我发现使用了大约phonetic algorithm个单词来根据它们的发音来简化单词.here就是一个例子.这主要是为了将搜索空间分解为更小的空间.然而,这有几个限制,例如,在较小的空间中,它必须仍然是完美匹配的.

但不管怎样,我也在寻找一种更通用的解决方案,如果存在的话.

推荐答案

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

这两个例子实际上都没有进行传统的最近邻搜索.AudioID(我是作者)只是在寻找精确的匹配,但它会搜索大量的散列,希望其中一些能够匹配.语音搜索示例使用变音将单词转换为其语音表示形式,并且只查找精确匹配.

你会发现,如果你有大量的数据,使用巨大的哈希表进行精确搜索是你现实中唯一能做的事情.接下来的问题是如何将模糊匹配转换为精确搜索.

一种常见的方法是将locality-sensitive hashing(Lsh)与智能散列方法一起使用,但正如您在两个示例中看到的那样,有时甚至可以使用更简单的方法.

顺便说一句,你正在寻找专门的文本搜索,这是最简单的方法,你可以把你的输入分割成N-grams个,并索引这些.根据距离函数的定义,这可能会在不做太多工作的情况下为您提供正确的候选匹配.

Database相关问答推荐

如何使用聚合管道从对象数组中获取正确的百分比

如何在华为Appcube中创建和使用对象(模型)?

在保持抽象的同时将格式化文本存储在数据库中

如何理解mysql explain 命令

sql-dump 有什么用?

为什么 COUNT() 只显示一行表格?

Symfony2:spl_object_hash() expects parameter 1 to be object, string given in Doctrine

从 DbDataReader 读取数据的最快方法是什么?

按纬度/经度进行半径搜索

Android - SQLite 数据库存储在哪里?

通过删除执行计划中的排序运算符来优化 SQL 查询

用于 sql server 的免费国家、城市数据库

Boyce-Codd 范式的良好 KISS 描述是什么?

MySQL 中的多个 OR 子句

MySQL JDBC Driver中cachePrepStmts和useServerPrepStmts有什么区别

返回 SQLite 数据库中表大小的查询

MySQL 转储所有数据库并在导入时创建(或重新创建)它们?

在 Firestore 中使用嵌套的单个查询

用 SQL 进行条件插入?

如何在数据库中获取原始的created_at值(不是转换为 ActiveSupport::TimeWithZone 的对象)