2016-07-17 12 views
4

私は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}); 
     } 
    }); 
}); 
+0

最も正確な検索には、mongoose FullTextライブラリを使用できます。https://www.npmjs.com/package/mongoose-fulltext –

答えて

11

「ファジィ」検索を行うには、正規表現を使用する必要があります。これは、あなたが(escapeRegex関数ソースhere)探しているものを達成する必要があります

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を照会する場合、アプリケーションは、パフォーマンスの問題が発生することができます。 search-indexのようなライブラリを検索に使用すると、アプリケーションのパフォーマンスを最適化するのに役立ちます。単語の幹を検索するという利点があります(「find」から「found」を返すなど)。


UPDATE:私のオリジナルの答えはregex DDoS attackに対して脆弱にアプリケーションを残すだろう単純な正規exressionが含まれています。私は "安全な"エスケープされた正規表現を更新しました。

+0

ありがとうございました!!!それは完全に完全に機能しました。私ははるかに複雑なソリューションの真中にあり、それは完全に機能し、非常に簡単でした。お手伝いありがとう! – AndrewLeonardi

+3

@AndrewLeonardiちょうどあなたが私の更新された答えを見ていることをチェック...あなたのアプリが正規表現のDDoS攻撃の影響を受けないようにしたいです! –