1

我有两个应该与简单文本匹配的字段。

我目前正在使用 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')] 
            ]
        ]
    ]
]];

缺少的是我想忽略字段中的重音namecommonName,因此例如,如果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”

4

2 回答 2

2

确实不支持使用带有排序规则的正则表达式 在mongodb $regex 中使用排序规则

我猜想为了完成这项工作,我会创建一个解决方法,例如在 MongoDB 数据中创建一个没有变音符号的字段,以便将其用于搜索功能。

使用您的示例文档

{
    lastname: "Mbappé",
    firstname: "Kylian",
    name: "Kylian Mbappé"
    otherfields: 123
    name_clean: "Kylian Mbappe" // this is new
}

我会对原始帖子发表评论,但 Stack Overflow 说我需要 50 声望才能做到这一点:(

于 2020-08-27T11:43:40.157 回答
0

我认为像这样在mongodb中尝试它会起作用。

db.users.find({name:{$regex:'appe',$options:'i'},firstname:{$regex:'lian',$options:'i'},lastname:{$regex:' appé',$options:'i'}})

于 2020-08-30T06:20:03.997 回答