复杂对象中的最佳匹配 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 解决此问题的好方法是什么?或者是否有另一个数据库更适合这个问题?
下面使用正则表达式的查询为我们带来了 speaker
和 leader
的匹配记录。
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
}
我有一个数据库,其中包含大约 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 解决此问题的好方法是什么?或者是否有另一个数据库更适合这个问题?
下面使用正则表达式的查询为我们带来了 speaker
和 leader
的匹配记录。
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
}