【发布时间】:2016-05-11 04:33:09
【问题描述】:
您好,我正在使用 mongoose 来搜索我收藏中的人。
/*Person model*/
{
name: {
first: String,
last: String
}
}
现在我想搜索有查询的人:
let regex = new RegExp(QUERY,'i');
Person.find({
$or: [
{'name.first': regex},
{'name.last': regex}
]
}).exec(function(err,persons){
console.log(persons);
});
如果我搜索 John,我会得到结果(如果我搜索 Jo,则会发生事件)。 但是,如果我搜索 John Doe,我显然没有得到任何结果。
如果我将 QUERY 更改为 John|Doe 我会得到结果,但它会返回所有拥有 John 或 Doe 的人 在他们的姓/名中。
接下来是尝试使用 mongoose 文本搜索:
首先将字段添加到索引:
PersonSchema.index({
name: {
first: 'text',
last: 'text'
}
},{
name: 'Personsearch index',
weights: {
name: {
first : 10,
last: 10
}
}
});
然后修改Person查询:
Person.find({
$text : {
$search : QUERY
}
},
{ score:{$meta:'textScore'} })
.sort({ score : { $meta : 'textScore' } })
.exec(function(err,persons){
console.log(persons);
});
这很好用! 但是现在只返回与整个名字/姓氏匹配的人:
-> John 返回值
-> Jo 不返回任何值
有没有办法解决这个问题?
没有外部插件的答案是首选,但也希望其他答案。
【问题讨论】:
-
您可能需要为此使用 Elasticsearch。如果您愿意,我可以为您提供详细的代码。为了获得全名搜索,您应该以 \"query"\ 格式输入查询。
-
只用猫鼬进行部分搜索是行不通的。在选择弹性之前,我尝试了 3 天。
-
感谢您的提示,但对于这种情况,Elastiq 似乎有点过分了。如果有可能将名字和姓氏合并到一个字段中(仅用于一个查询),然后使用正则表达式进行搜索就可以了。但是我不确定猫鼬是否可以做到这一点?
-
所以您需要自动完成(通配符查询,如“phrase*”)名字和姓氏,但想分别存储?
-
请看:virtuals 可以合并两个字段。
标签: node.js mongodb mongoose text-search