programing

Mongodb로 퍼지 검색?

goodsources 2023. 7. 5. 20:41
반응형

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});
       }
    });
});

퍼지 검색을 하려면 정규식을 사용해야 할 것 같습니다.이렇게 하면 원하는 작업을 수행할 수 있습니다(여기서 Regex 함수 소스 탈출).

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를 쿼리할 때 응용 프로그램에 성능 문제가 발생할 수 있습니다.검색 인덱스와 같은 라이브러리를 검색에 사용하면 "찾기"에서 "찾기"를 반환하는 것과 같은 단어 스템 검색의 추가적인 이점과 함께 응용 프로그램의 성능을 최적화할 수 있습니다.


업데이트: 원래 답변에는 정규식 DDoS 공격에 취약한 애플리케이션을 만드는 간단한 정규식이 포함되어 있었습니다."안전한" 탈출 정규식으로 업데이트했습니다.

저는 이것이 오래된 스레드라는 것을 알지만, 이 기사를 기반으로 플러그인을 만들었습니다.

몽구스에 감염된

(사용)$text쿼리 연산자 대신$regex더 빠른 결과를 위해)

다음 예제는 제목과 도시를 기준으로 이벤트를 검색합니다.

const mongoose_fuzzy_searching = require('mongoose-fuzzy-searching');

const schema = {
    title: {
        type: String,
        trim: true,
        required: true,
    },
    description: {
        type: String,
        trim: true,
    },
    city: {
        type: String,
    },
    address: {
        type: String,
    }
};

const EventsSchema = mongoose.Schema(schema);
EventsSchema.plugin(mongoose_fuzzy_searching, {fields: ['title', 'city']});

const Events = mongoose.model('Events', EventsSchema);

Events.fuzzySearch('Nodejs meetup').then(console.log).catch(console.error);

MongoDB Atlas 기능을 사용하여 MongoDB에서 제공하는 다양한 Analyzer를 기반으로 텍스트를 검색할 수 있습니다.그런 다음 다음 다음과 같은 검색을 수행할 수 있습니다.퍼지 개체가 없으면 전체 텍스트 일치 검색이 수행됩니다.

$search:{
 {
  index: 'analyzer_name_created_from_atlas_search',
  text: {
    query: 'Russ has denied involvement in the case',
    path: 'sentence',
    fuzzy:{
      maxEdits: 2
    }
  }
 }
}

원래 게시 당시 공개되지 않았던 MongoDB의 신제품에 이어 나온 업데이트된 답변입니다.MongoDB에는 이제 Apache Lucene 인덱스를 배포하여 강력한 퍼지 검색 기능을 얻을 수 있는 기능과 동의어, 강조 표시 및 자동 완성과 같은 다른 기능이 있습니다.

다음은 제가 받은 다른 답변에 게시된 구문입니다.

{
  $search: {
    "index": <index name>, // optional, defaults to "default"
    "text": {
      "query": "queryText",
      "path": "<fields-to-search>",
      "fuzzy": {
         "maxEdits": 2
       }
    }
  }
}

아틀라스를 사용하는 경우 색인 탭으로 이동하여 데이터베이스에 대한 색인을 만든 다음 보다 강력한 퍼지 검색을 위해 집계를 사용할 수 있습니다.

Jobs.aggregate([
    {
        $search: {
            "index": "default",
            "text": {
                "path": "name",
                "query": req.query.search,
            }
        }
    },
], (err: any, data: any) => {
    if (err) {
        res.status(500).send(err);
    }
    else {
        res.status(200).send(data);
    }
}).limit(20)

언급URL : https://stackoverflow.com/questions/38421664/fuzzy-searching-with-mongodb

반응형