正如标题所说,我试图弄清楚如何执行不区分变音符号的操作$regex在 MongoDB 中执行不区分变音符号的搜索,尽管目前我不确定这是否可能。
基本上,想象我们有一个团队集合,其中包含如下文档:
\n{ id: 1, name: "FC Bayern M\xc3\xbcnchen" },\n{ id: 2, name: "Atl\xc3\xa9tico Madrid" }\nRun Code Online (Sandbox Code Playgroud)\n对于这个集合,我创建了一个text索引name:
db.getCollection(\'teams\').createIndex({name: \'text\'});
这使我能够执行变音符号和不区分大小写的搜索。
\ndb.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" }\nRun Code Online (Sandbox Code Playgroud)\n但是,如果文本搜索不包含完整单词(Bayern,Munchen ),则查询不会产生任何结果:
db.getCollection(\'teams\').find({ $text: { $search: "bayer" }});\ndb.getCollection(\'teams\').find({ $text: { $search: "munc" }});\n// \xe2\x9d\x8c (no results)\nRun Code Online (Sandbox Code Playgroud)\n因此,为了使这项工作按预期进行,我需要使用$regex搜索,但是,我似乎无法找到忽略变音符号的方法。
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)\nRun Code Online (Sandbox Code Playgroud)\n所以我的问题是,有什么方法可以实现这种通用搜索,可以通过正则表达式或其他方式不敏感地搜索变音符号,而不必匹配整个单词?
\n如果您使用 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您正在寻找的行为发出查询(单词前缀匹配,忽略变音符号)。
| 归档时间: |
|
| 查看次数: |
1090 次 |
| 最近记录: |