在不知道所需详细信息的情况下,您可能想要执行以下一项操作:
我不完全了解安装和配置狮身人面像所涉及的内容;但是,我的印象是您可以将其指向数据库,告诉它要索引哪些字段,如何加权结果,这将为您提供匹配记录的有序列表。
对于面向用户或关键任务的资料,请使用现有的搜索工具。
如果您只是想学习,请使用ngrams:
一个ngrams查找表可以用作您的潜在匹配的初始集合,并且您可以使用Levenshtein距离对结果进行修剪和排序。
假设您要搜索people
,则可以执行以下操作:
_ people _________
personId: int
name: varchar
soundex_name: varchar
_ people_ngrams __
personId: int
ngramId: int
_ ngrams _________
ngramId: int
ngram: char(3)
count: int
您可以定期重建ngram,也可以即时构建它们。无论哪种方式,一个简单的天真的搜索算法都可以像这样:
search_ngrams = ngrammify(soundex(search_string));
notable_ngrams = select top 10 *
from ngrams
where ngram in (search_ngrams)
order by count asc;
possible_matches = select top 1000 distinct people.*
from people_ngrams, people
where ngramId in (notable_ngrams);
best_matches = top 100 possible_matches
ordered by Levenshtein_distance(match, soundex(search_string));
使用与此类似的内容(但进行了更多的ngram“流行度”调整,黑名单,白名单等),我已经看到这种算法模糊地将数据集之间的记录合并成批,以及促进自定义模糊搜索实用程序和正在进行的记录重复数据删除工作。
现在,以我为例,我没有匹配数百万条记录,而是希望在两个数据集之间选择最佳的合并方式,每个合并的数量大约为数十万条。而且,我们希望它能够在几分钟之内快速运行。(很快,什么是100,000 * 100,000?)而且,我们成功了。
因此,通过正确的调整,这种事情可能会变得敏捷而有效。我们最终能够在几分钟内在一台陈旧的双核计算机上生成合并集,并自动将“可疑”合并标记为手动审核。但是,找到ngram受欢迎程度/相关性最佳点,正确的字符串距离阈值,黑名单和白名单等花费了很多时间。
如此说来,您真的可以陷入研究这些东西的漏洞。对于任何实际生产层次的东西,你应该普遍使用已经行之有效的工具制作和优化这类搜索的。
像狮身人面像或露西娜。