复杂对象中的最佳匹配 Mongodb

Best match Mongodb in complex objects

我有一个数据库,其中包含大约 50k 条有关候选人的记录,如下例所示:

[
{
    "_id":{  
       "$oid":"5744eff20ca7832b5c7452321"
    },
    "name":"Candidate 1",
    "characteristics":[  
       {  
          "name":"personal skills",
          "info":[  
             "Great speaker",
             "Very friendly",
             "Born to be a leader"
          ]
       },
       {  
          "name":"education background",
          "info":[  
             "Studied Mechanical Engineering",
             "Best of his class 2001"
          ]
       }
    ]
},
... thousands more objects with same structure
]

考虑到一些个人技能,我想搜索该输入的最佳匹配项:

输入示例: ["speaker", "leader"]

预期输出: 从最佳匹配下降的候选列表(整个对象)。

我基本上只需要搜索字段"personal skills"。

使用 MongoDB 解决此问题的好方法是什么?或者是否有另一个数据库更适合这个问题?

下面使用正则表达式的查询为我们带来了 speakerleader 的匹配记录。

db.collection_name.find( 
   { $and : 
      [ 
        {"characteristics.info": /.*speaker.*/}, 
        {"characteristics.info": /.*leader.*/}
      ]
   }
) 

为了获得更好的性能,我们可以有一个 Text Index,如下所示,但请注意,每个集合只允许一个文本索引

db.collection_name.createIndex({"characteristics":"text"});

创建文本索引后,我们可以看到它已用于我们的搜索

使用explain查看Text Index的使用

db.collection_name.find({ $and: [{"characteristics.info": /.*speaker.*/}, {"characteristics.info": /.*leader.*/}]}).explain()

Mongo shell 带查询计划解释的输出

{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "test.a",
                "indexFilterSet" : false,
                "parsedQuery" : {
                        "$and" : [
                                {
                                        "characteristics.info" : {
                                                "$regex" : ".*speaker.*"
                                        }
                                },
                                {
                                        "characteristics.info" : {
                                                "$regex" : ".*leader.*"
                                        }
                                }
                        ]
                },
                "winningPlan" : {
                        "stage" : "COLLSCAN",
                        "filter" : {
                                "$and" : [
                                        {
                                                "characteristics.info" : {
                                                        "$regex" : ".*speaker.*"
                                                }
                                        },
                                        {
                                                "characteristics.info" : {
                                                        "$regex" : ".*leader.*"
                                                }
                                        }
                                ]
                        },
                        "direction" : "forward"
                },
                "rejectedPlans" : [ ]
        },
        "serverInfo" : {
                "host" : "PC369236",
                "port" : 27017,
                "version" : "3.6.1",
                "gitVersion" : "025d4f4fe61efd1fb6f0005be20cb45a004093d1"
        },
        "ok" : 1
}