问题描述
我有两个应该与简单文本匹配的字段。
我目前正在使用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中轻松完成。
我尝试过的其他事情:
- 为我要搜索的字段创建了文本索引
- 使用排序规则,这显然不适用于Regex
示例文件
{
lastname: "Mbappé",firstname: "Kylian",name: "Kylian Mbappé"
otherfields: 123
}
我想要什么:
与姓氏,名字或部分字符串(连字符,appe,mbappe等)匹配的查询,不区分大小写,不区分变音符号。
好的匹配项应该是:“ Mbappe”,“ appe”,“mbappé”,“ Kylian”,“ kylian mbappe”
解决方法
确实不支持将正则表达式与排序规则一起使用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点声望:(
,我认为像这样在mongodb中尝试它会起作用。
db.users.find({name:{$ regex:'appe',$ options:'i'},firstname:{$ regex:'lian',$ options:'i'},lastname:{$ regex:'appé',$ options:'i'}})