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
'programing' 카테고리의 다른 글
표시할 통화 형식 (0) | 2023.07.05 |
---|---|
스웨거 2 문제 - 스프링 부트 (0) | 2023.07.05 |
https로 보호되는 웹 사이트를 만드는 방법 (0) | 2023.07.05 |
대응/유형 스크립트/VScode - 가져오기 경로는 '.tsx' 확장자로 끝날 수 없습니다. (0) | 2023.07.05 |
select 문의 하위 쿼리가 오라클에서 작동하는 방식 (0) | 2023.07.05 |