【问题标题】:Best match Mongodb in complex objects复杂对象中的最佳匹配 Mongodb
【发布时间】:2018-07-24 01:30:57
【问题描述】:

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

[
{
    "_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
]

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

输入示例: [“演讲者”,“领导者”]

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

我基本上只需要搜索“个人技能”这个字段。

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

【问题讨论】:

    标签: mongodb mongodb-query full-text-search bigdata aggregation-framework


    【解决方案1】:

    下面使用正则表达式的查询为我们带来了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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-21
      • 1970-01-01
      • 2012-05-14
      • 2019-11-28
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多