Mongoose中如何实现支持部分单词的正则过滤?
问题原因
你当前的正则是将输入关键词作为连续字符串进行匹配:比如输入san suhag时,会查找包含san suhag连续字符的name字段,但目标数据是Sanam Suhag,中间隔了am ,连续字符串不匹配,所以返回空数组。
解决方案
要实现「输入包含部分单词的查询词就能匹配」,需要将输入的关键词拆分为独立部分,确保每个部分都能在name中匹配到,以下是两种可行方案:
方案一:多关键词独立匹配(不限制顺序)
拆分输入的关键词,生成多个正则条件,用$and确保所有关键词都出现在name中,不限制关键词顺序:
router.get('/filter/:keywords', (req, res) => { console.log('Keyword recieved in backend ...', req.params.keywords); // 拆分关键词并过滤空字符串(处理多空格情况) const keywords = req.params.keywords.split(' ').filter(k => k.trim()); // 为每个关键词生成不区分大小写的正则条件 const regexConditions = keywords.map(key => ({ name: new RegExp(key, "i") })); var itemFound = Item.find( { $and: regexConditions, "status.active": true }, { 'name': 1 } ).sort({ "updated_at": -1, "created_at": -1 }).limit(20); // 合并排序规则,避免多次sort覆盖 itemFound.exec((err, data) => { console.log(data); if (err) { console.log(err); return res.send([]); } // 直接返回查询结果,无需循环复制 res.send(data || []); }) });
此方案下,输入san suhag或suhag san都能匹配到Sanam Suhag。
方案二:多关键词顺序匹配
如果需要关键词按输入顺序匹配(比如san suhag要求san出现在suhag之前),可以用正则正向预查实现:
router.get('/filter/:keywords', (req, res) => { console.log('Keyword recieved in backend ...', req.params.keywords); const keywords = req.params.keywords.split(' ').filter(k => k.trim()); // 生成正向预查正则,确保关键词按顺序出现(不要求连续) const regexPattern = keywords.map(key => `(?=.*${key})`).join(''); const regex = new RegExp(regexPattern, "i"); var itemFound = Item.find( { name: regex, "status.active": true }, { 'name': 1 } ).sort({ "updated_at": -1, "created_at": -1 }).limit(20); itemFound.exec((err, data) => { console.log(data); if (err) { console.log(err); return res.send([]); } res.send(data || []); }) });
此方案下,输入san suhag能匹配Sanam Suhag,但输入suhag san不会匹配。
内容的提问来源于stack exchange,提问作者user11586200
相关产品推荐
相关产品推荐

