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')] 
            ]
        ]
    ]
]];

缺少的是我想忽略字段 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”

【问题讨论】:

如果您使用的是 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 中删除字符串中的重音符号/变音符号

如何从 .NET 中的字符串中删除变音符号(重音符号)?

如何从 .NET 中的字符串中删除变音符号(重音符号)?

MongoDB diacriticInSensitive 搜索未按预期显示所有重音(带有变音符号的单词)行,反之亦然

将非 ASCII 字符(变音符号、重音符号...)转换为最接近的 ASCII 等效字符(创建 slug)