在 MongoDB 中执行不区分变音符号的 $regex 搜索

dec*_*cho 6 mongodb

正如标题所说,我试图弄清楚如何执行不区分变音符号的操作$regex在 MongoDB 中执行不区分变音符号的搜索,尽管目前我不确定这是否可能。

\n

基本上,想象我们有一个团队集合,其中包含如下文档:

\n
{ id: 1, name: "FC Bayern M\xc3\xbcnchen" },\n{ id: 2, name: "Atl\xc3\xa9tico Madrid" }\n
Run Code Online (Sandbox Code Playgroud)\n

对于这个集合,我创建了一个text索引name

\n

db.getCollection(\'teams\').createIndex({name: \'text\'});

\n

这使我能够执行变音符号和不区分大小写的搜索。

\n
db.getCollection(\'teams\').find({ $text: { $search: "bayern" }});\ndb.getCollection(\'teams\').find({ $text: { $search: "munchen" }});\n// \xe2\x9c\x85 { id: 1, name: "FC Bayern M\xc3\xbcnchen" }\n
Run Code Online (Sandbox Code Playgroud)\n

但是,如果文本搜索不包含完整单词(Bayern,Munchen ),则查询不会产生任何结果:

\n
db.getCollection(\'teams\').find({ $text: { $search: "bayer" }});\ndb.getCollection(\'teams\').find({ $text: { $search: "munc" }});\n// \xe2\x9d\x8c (no results)\n
Run Code Online (Sandbox Code Playgroud)\n

因此,为了使这项工作按预期进行,我需要使用$regex搜索,但是,我似乎无法找到忽略变音符号的方法。

\n
db.getCollection(\'teams\').find({ name: { $regex: "baye", $options: \'i\' }});\n// \xe2\x9c\x85 { id: 1, name: "FC Bayern M\xc3\xbcnchen" }\n\ndb.getCollection(\'teams\').find({ name: { $regex: "munchen", $options: \'i\' }});\n// \xe2\x9d\x8c (no results)\n
Run Code Online (Sandbox Code Playgroud)\n

所以我的问题是,有什么方法可以实现这种通用搜索,可以通过正则表达式或其他方式不敏感地搜索变音符号,而不必匹配整个单词?

\n

jam*_*mix 1

如果您使用 MongoDB Atlas,您可以使用标记化在字段上创建自动完成索引并将其设置为:nameedgeGramfoldDiacriticstrue

{
  "mappings": {
    "dynamic": false,
    "fields": {
      "name": {
        "type": "autocomplete",
        "analyzer": "lucene.standard",
        "tokenization": "edgeGram",
        "minGrams": 1,
        "maxGrams": 5,
        "foldDiacritics": true
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这将使您可以根据$search您正在寻找的行为发出查询(单词前缀匹配,忽略变音符号)。