在MongoDB“db.foo.find()”语法中,如何判断它是否匹配所有字母及其重音版本?
例如,如果我的数据库中有一个名单列表:
若昂
弗朗索瓦
赫苏斯
如何搜索字符串“Joao”,“Francois”或“Jesus”以匹配给定名称?
我希望我每次都不需要这样搜索:
db.names.find({name : /Fr[aã...][nñ][cç][all accented o characters][all accented i characters]s/ })
答案 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
这样的简化字符串的索引字段,例如
搜索时可以使用在数据库中插入新项目时使用的相同映射。将保留具有正确外壳和重音的原始字符串。
最重要的是,查询可以使用索引。 不区分大小写的查询和正则表达式查询不能使用索引(除了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