MongoDB 匹配部分文本忽略重音符号(变音符号)
Posted
技术标签:
【中文标题】MongoDB 匹配部分文本忽略重音符号(变音符号)【英文标题】:MongoDB match partial text ignoring accents (diacritics) 【发布时间】:2020-12-09 12:38:24 【问题描述】:我有两个字段应该与简单文本匹配。
我目前正在使用 Jenssegers 的 Laravel Mongodb (https://github.com/jenssegers/laravel-mongodb)
现在的代码是这样的,几乎可以像我想要的那样工作:
$nameFilter = [[
'$match' =>
[
'$or' =>
[
[
'content.itemList.name' => ['$regex' => new Regex($request->q, 'i')]
],
[
'content.itemList.commonName' => ['$regex' => new Regex($request->q, 'i')]
]
]
]
]];
缺少的是我想忽略字段 name
和 commonName
中的重音符号,例如,如果 content.itemList.name
是 "foöBàr" 并且查询是 "obar " 我应该在结果中得到它。
编辑:经过几天的尝试,我还没有找到解决方案。
我想应该在 MongoDB 中轻松完成一些如此微不足道的事情。
我尝试过的其他事情:
为我要搜索的字段创建了文本索引 使用排序规则,这显然不适用于正则表达式示例文档
lastname: "Mbappé",
firstname: "Kylian",
name: "Kylian Mbappé"
otherfields: 123
我想要什么:
匹配任何姓氏、名字或带有部分字符串(lian、appe、mbappe 等)的名称的查询,不区分大小写和变音符号(重音)。
好的匹配应该是,例如:“Mbappe”“appe”“mbapp锓Kylian”“kylian mbappe”
【问题讨论】:
如果您使用的是 Mongodb Atlas,您可以为此使用 Atlas Search 自动完成运算符。 docs.atlas.mongodb.com/reference/atlas-search/autocomplete/… 【参考方案1】:确实不支持使用带有排序规则的正则表达式Use of collation in mongodb $regex
我猜想为了完成这项工作,我会创建一个解决方法,例如在 MongoDB 数据中创建一个不带变音符号的字段,以便将其用于搜索功能。
使用您的示例文档
lastname: "Mbappé",
firstname: "Kylian",
name: "Kylian Mbappé"
otherfields: 123
name_clean: "Kylian Mbappe" // this is new
我会评论原始帖子,但 Stack Overflow 说我需要 50 声望才能做到这一点:(
【讨论】:
这是我想过的替代方案,如果我没有找到更直接的解决方案,我会实施它!【参考方案2】:我认为像这样在 mongodb 中尝试它会起作用。
db.users.find(name:$regex: 'appe',$options:'i',firstname:$regex: 'lian',$options:'i',lastname:$正则表达式:'appé',$options:'i')
【讨论】:
以上是关于MongoDB 匹配部分文本忽略重音符号(变音符号)的主要内容,如果未能解决你的问题,请参考以下文章
在 JavaScript 中删除字符串中的重音符号/变音符号