Нечеткий поиск с Mongodb?

мне удалось настроить функцию поиска в моем приложении mongodb. См. код ниже. Это работает очень хорошо, однако он возвращает только точные результаты. Как изменить код, чтобы он принимал более "нечеткие" Результаты поиска? Спасибо!

router.get("/", function(req, res){
    if (req.query.search) {
       Jobs.find({"name": req.query.search}, function(err, foundjobs){
       if(err){
           console.log(err);
       } else {
          res.render("jobs/index",{jobs:foundjobs});
       }
    }); 
    }

  Jobs.find({}, function(err, allJobs){
       if(err){
           console.log(err);
       } else {
          res.render("jobs/index",{jobs:allJobs});
       }
    });
});

1 ответов


Я считаю, что для выполнения "нечеткого" поиска вам нужно будет использовать регулярное выражение. Это должно выполнить то, что вы ищете (источник функции escapeRegex здесь):

function escapeRegex(text) {
    return text.replace(/[-[\]{}()*+?.,\^$|#\s]/g, "\$&");
};

router.get("/", function(req, res) {
    if (req.query.search) {
       const regex = new RegExp(escapeRegex(req.query.search), 'gi');
       Jobs.find({ "name": regex }, function(err, foundjobs) {
           if(err) {
               console.log(err);
           } else {
              res.render("jobs/index", { jobs: foundjobs });
           }
       }); 
    }
}

при этом ваше приложение может испытывать проблемы с производительностью при запросе mongo с помощью regex. Использование библиотеки как поиск-индекс для поиска может помочь оптимизировать производительность вашего приложения, с дополнительным преимуществом поиска Word stems (например, возврат "найдено" из "находить.)"


UPDATE: мой первоначальный ответ включал простое регулярное выражение, которое оставило бы ваше приложение уязвимым для regex DDoS атака. Я обновил" безопасное " сбежавшее регулярное выражение.