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



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

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

输入可能如下所示:Barcck Obmaa我希望返回一个人员列表,其中姓名Barack Obama在顶部。

该算法应考虑到以下事实:作为名称前缀的字符串比与名称同样接近但不是前缀的字符串更匹配。

有一堆算法利用预先计算的索引来使这种搜索更快。引起我注意的两个是Pass-Join Index和BKTree,它们使用Levenshtein或Jaro-Winkler等算法。在我看来,应该有一些方法将这些技术集成到mongo数据库中,但似乎没有任何既定的方法可以做到这一点。

我能找到的最佳解决方案是本文中描述的基于 n-gram 的方法。这是我最好的选择吗?

几年前,我致力于数字化一本医学书籍,发现使用Soundex系统的修改版本(https://www.archives.gov/research/census/soundex(作为执行模糊搜索的手段效果很好,只需对整个单词使用soundex编号进行微小修改。

例如,"华盛顿"的实际声音是...

  • W-252(W,2 代表 S,5 代表 N,2 代表 G,其余字母不计入(

。而对于医学书籍,它将被编码为...

  • 25235
当与">

pf"或"ps"结合使用时,我也忽略了p,以及我在官方声音之上添加的其他一些小规则,我现在不记得了。 因此,这种修改后的soundex系统允许医生在医学文本中进行搜索时完全破坏单词的拼写。 例如,以下两个单词将具有相同的声音...

  • 心理学 = 2242
  • 西卡维吉 = 2242

。因此,搜索"sikawligy"将返回带有"心理学"的结果。

不确定这是否完全回答了您的问题,因为您似乎正在寻找与拼写错误的人的紧密匹配,而我提出的是一种基于拼写错误的单词进行搜索的方法,这些单词听起来与实际单词相同正在寻求......

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

最新更新