You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 11:07:40