我不是问有关实现拼写判断算法本身的问题.我有一个包含数十万条记录的数据库.我要做的是对照表中的特定列判断用户输入以查找所有这些记录,并返回具有特定Hamming距离的任何匹配(同样,这个问题不是关于确定Hamming距离等).当然,这样做的目的是创建一个"你是不是有意的"特性,用户在其中搜索一个名字,如果在数据库中没有找到直接匹配,则返回一个可能匹配的列表.

我正试图想出一种方法,尽可能在最合理的运行时间内完成所有这些判断.我如何才能以最有效的方式对照所有这些记录判断用户的输入?

该功能目前已经实现,但运行时非常慢.它现在的工作方式是将用户指定表中的所有记录加载到memory中,然后执行判断.

无论如何,我正在使用NHibernate进行数据访问.

如果有任何关于我如何做到这一点或我的 Select 是什么的反馈,我将不胜感激.

推荐答案

计算Levenshtein距离并不一定像你想象的那样昂贵.Norvig article中的代码可以被认为是帮助读者理解算法的伪代码.一个更有效的实现(在我的例子中,在20,000个术语数据集上大约快300倍)是遍历trie.性能差异主要归因于消除了为执行字典查找而分配数百万个字符串的需要,在GC中花费的时间要少得多,而且您还可以获得更好的引用局部性,从而减少CPU缓存未命中.使用这种方法,我可以在我的Web服务器上进行大约2毫秒的查找.额外的好处是能够轻松返回以提供的字符串开头的所有结果.

缺点是创建trie很慢(可能需要一秒钟左右),因此如果源数据定期更改,则需要决定是重建整个过程还是应用增量.无论如何,一旦构建了 struct ,您就希望尽可能多地重用它.

Database相关问答推荐

触发器作为完整性的判断约束

使用 noSQL 和 MongoDB 在数据库中存储任何类型文件的最佳方法是什么

如何将表字段的默认值设置为 0.00?

Sequel Pro / MAMP 在哪里存储本地数据库?

生产中的超大型 Mnesia 表

安装 SQL Server Management Studio Express后提示:Cannot open user default database. Login failed.

Cassandra 还是 MySQL/PostgreSQL?

只用一个 save() 插入多行

如何更改 Heroku 中的列类型?

数据库供应商如何实现事务?

返回 DataSet/DataTable 的 PowerShell 函数中的奇怪行为

用于 Java 桌面应用程序的最佳数据库是什么

多语言数据库,默认回退

如何动态更改 Ruby on Rails 中所有模型的 Active Record 数据库?

PostgreSQL 的示例数据库

数据库触发器的命名约定

为 django 模型自动创建数据的工具

什么是提交日志(log)?

数据库与纯文本

做或不做:将图像存储在数据库中