复杂对象中最匹配的Mongodb

时间:2018-07-24 01:30:57

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

我有一个大约有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解决此问题的最佳方法是什么?还是有另一个更适合此问题的数据库?

1 个答案:

答案 0 :(得分:1)

以下使用正则表达式的查询为我们带来了<div class="container"> <h1>Custom Checkboxes</h1></br> <label class="customcheck">One <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> <label class="customcheck">Two <input type="checkbox"> <span class="checkmark"></span> </label> <label class="customcheck">Three <input type="checkbox"> <span class="checkmark"></span> </label> <label class="customcheck">Four <input type="checkbox"> <span class="checkmark"></span> </label> </div>speaker的匹配记录。

leader

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

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

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

使用解释来查看文本索引的使用

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

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

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