首页 > 解决方案 > 如何对 MongoDB 中的嵌套字段进行全文搜索?

问题描述

我通过以下方式将我的本地化存储在 MongoDB 中

db.user.insertMany([
    {
        "name": {
            "en": "Frodo Baggins",
            "ru": "Фродо Беггинс"
        }
    },
    {
        "name": {
            "en": "Bilbo Baggins",
            "ru": "Бильбо Беггинс"
        }
    }
])

我知道我可以用这个在所有字段上应用全文搜索索引

db.user.ensureIndex({ "$**": "text" })

但是我的文档有很多我不想索引的其他信息。有没有办法指定只索引名称字段内容?

标签: mongodb

解决方案


您可以在 name.en 和 name.ru 上创建复合索引:

db.user.createIndex(
   {
     "name.en": "text",
     "name.ru": "text"
   }
 )

并使用此查询进行搜索:

db.user.find( { $text: { $search: "Baggins" } }) 

您甚至可以添加一个分值,并排序:

db.user
  .find({ $text: { $search: "Baggins" } }, { score: { $meta: "textScore" } })
  .sort({ score: { $meta: "textScore" } });

这将给出如下结果:

{
    "_id" : ObjectId("5e8237b3c3ff893c44edd74e"),
    "name" : {
        "en" : "Frodo Baggins",
        "ru" : "Фродо Беггинс"
    },
    "score" : 1.5
},
{
    "_id" : ObjectId("5e8237b3c3ff893c44edd74f"),
    "name" : {
        "en" : "Bilbo Baggins",
        "ru" : "Бильбо Беггинс"
    },
    "score" : 0.75
}

推荐阅读