MongoDB进行模糊字符串搜索的有效方法

时间:2020-05-16 21:47:54

标签: javascript string mongodb search fuzzy-search

我希望能够在给定字符串的情况下从我的mongo数据库返回最匹配的名称列表。我想尽可能有效地做到这一点。为了说明这一点,我的文档如下:

const personSchema = new Schema({
    name: { type: String, required: true }
    ...more fields
});

输入的内容可能类似于:Barcck Obmaa,我希望它返回一个名称为Barack Obama的人的列表。

该算法应考虑以下事实:作为名称前缀的字符串比不与该名称相似但不带前缀的字符串更好地匹配该名称。

有一堆算法可以利用预先计算的索引来加快这种搜索的速度。 Pass-Join IndexBKTree引起了我的注意,它们使用Levenshtein或Jaro-Winkler之类的算法。在我看来,应该有某种方法可以将这些技术集成到mongo数据库中,但是似乎还没有确定的方法。

我能找到的最佳解决方案是this article中描述的基于n元语法的方法。这是我最好的选择吗?

1 个答案:

答案 0 :(得分:1)

几年前,我致力于对医学书籍进行数字化,发现使用soundex系统的修改版本(https://www.archives.gov/research/census/soundex)作为执行模糊搜索的一种方法非常有效,而使用soundex的修改很小整个单词的数字。

例如,“华盛顿”的实际soundex是...

  • W-252(W,S表示2,N表示5,G表示2,其余字母均忽略不计)

...而对于医学书籍来说,它本应被编码为...

  • 25235

当与“ pf”或“ ps”结合使用时,我也忽略了p,加上我在官方soundex上添加的其他一些次要规则,现在我不记得了。因此,当在医学文本中进行搜索时,这种经过改进的soundex系统允许医生完全屠杀单词的拼写。例如,以下两个单词将具有相同的音色...

  • 心理学= 2242
  • sikawligy = 2242

......因此搜索“ sikawligy”将返回带有“ psychology”的结果。

不确定这是否能正确回答您的问题,因为您似乎正在寻找与某人粗心的拼写匹配的人,而我建议的是一种基于与拼音相同的拼写错误的单词进行搜索的方法正在寻找实际的单词...

无论如何,希望这会有所帮助。