Mongodb将重音字符作为基础角色

时间:2011-10-10 01:09:43

标签: regex mongodb internationalization diacritics

在MongoDB“db.foo.find()”语法中,如何判断它是否匹配所有字母及其重音版本?

例如,如果我的数据库中有一个名单列表:
若昂
弗朗索瓦
赫苏斯

如何搜索字符串“Joao”,“Francois”或“Jesus”以匹配给定名称?
我希望我每次都不需要这样搜索:
db.names.find({name : /Fr[aã...][nñ][cç][all accented o characters][all accented i characters]s/ })

4 个答案:

答案 0 :(得分:15)

从Mongo 3.2开始,您可以使用$text并将$diacriticSensitive设置为false:

{
  $text:
    {
      $search: <string>,
      $language: <string>,
      $caseSensitive: <boolean>,
      $diacriticSensitive: <boolean>
    }
}

在Mongo文档中查看更多内容:https://docs.mongodb.com/manual/reference/operator/query/text/

答案 1 :(得分:9)

我建议你添加一个像NameSearchable这样的简化字符串的索引字段,例如

  • João - &gt; JOAO
  • François - &gt; FRANCOIS
  • Jesús - &gt; JESUS
  • Jürgen - &gt; JUERGEN

搜索时可以使用在数据库中插入新项目时使用的相同映射。将保留具有正确外壳和重音的原始字符串。

最重要的是,查询可以使用索引。 不区分大小写的查询和正则表达式查询不能使用索引(除了root的正则表达式),并且在大型集合上的速度会非常慢。

哦,由于可以从原始字符串创建简化字符串,因此将其添加到现有集合中不是问题。

答案 2 :(得分:2)

在此博客中:http://tech.rgou.net/en/php/pesquisas-nao-sensiveis-ao-caso-e-acento-no-mongodb-e-php/

有人使用了您尝试的方法。据我所知,这是最新的MongoDB版本的唯一解决方案。

答案 3 :(得分:0)

似乎更像是mongoDb目前不支持的模糊匹配搜索。 您可以尝试的是:

/ 1。在每个条目的集合中的单独元素中存储名称的变体。然后可以通过查找变体数组中是否存在搜索词来运行查询。

/ 2。为同一集合中的每个名称存储soundex字符串。然后,对于您的搜索字符串,获取soundex字符串,并查询数据库,您将获得与查询具有类似Soundex结果的结果。 您可以在脚本中更多地过滤和验证数据。 例如:

François的Soundex代码= F652,Francois的Soundex代码= F652

Jesús= J220的Soundex代码,耶稣的Soundex代码= J220

点击此处查看: http://creativyst.com/Doc/Articles/SoundEx1/SoundEx1.htm#SoundExConverter