본문 바로가기
All Side/Runtime > NodeJS

[NodeJS] 검색기능 만들기 (1) MongoDB Query

by developerBeluga 2022. 8. 19.
728x90
반응형

 

규모가 크지 않은 서비스라면 굳이 검색엔진을 구축할 필요는 없습니다.

MongoDB Query를 가지고 간단한 검색기능을 알아보도록 하겠습니다.

 

 

1) Regex

아마 가장 많이 사용하는 방법이 정규식이라고 생각합니다.

정규식을 이용하면 쿼리 중에 문자열의 패턴을 검색 가능합니다.

정규식은 패턴을 일련의 문자와 일치시키는 일반화된 방법입니다.

 

.find({ title: { $regex: "강아지" } })

 

원하는 필드에 찾고자 하는 데이터를 $regex로 걸어줍니다.

그러면 title이라는 필드 안에 "강아지"라는 단어를 가진 데이터들을 모두 가지고 옵니다.

예를 들어, title이라는 데이터에 "강아지" 말고도 "강아지산책", "사료강아지" 등 강아지가 포함된 모든 데이터들이 검색됩니다.

 

부분 텍스트 검색이 가능하다는 장점이 있지만 검색 관련성이 높은 순으로 결과를 보여주지 않는다는 단점도 있습니다.

어떤 상황에서는 가장 정확하게 "강아지"라는 데이터를 먼저 보고 싶은데 관련성과 상관없이 보여주기 때문에 중간에서야 원하는 데이터를 찾을 수도 있습니다.

그리고 모든 문자열에서 패턴이나 단어를 찾기 때문에 데이터가 많아질수록 그만큼 느려집니다.

 

 

2) Text Index

MongoDB에서 제공하는 Index는 관계형 테이터베이스에서 제공하는 인덱스와 동일한 기능을 제공합니다.

일반적으로 Index를 사용하는 이유는 빠른 데이터 검색을 수행하기 위해서입니다.

 

그렇다면 Index는 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조입니다.

Text Index는 전문 검색 인덱스으로 문자열 내용의 텍스트 검색 수행 쿼리 작업을 지원합니다.

 

 

const test = new Schema({
	title: String
});

test.index({ title: 'text' })

Index를 사용하기 위해서는 필드에 Index를 걸어주셔야 합니다.

 

 

.find({ $text:{ $search : "강아지" } })

Index를 걸어주셨다면 인제 $text와 $search 쿼리 연산자를 이용해서 검색합니다.

그렇다면 title이라는 필드에서 정확히 "강아지"라는 데이터를 검색합니다.

"강아지산책"과 같은 부분 텍스트는 나오지 않지만 "강아지 산책" 혹은 "사료 강아지"처럼 띄어쓰기를 기준으로 한 단어 한 단어 키워드로 검색 가능합니다.

 

부분 텍스트 검색이 불가능하다는 단점이 있지만 검색 결과의 관련성을 알아서 계산하어 관련성 높은 순으로 보여준다는 장점이 있습니다.

가장 정확한 "강아지"가 먼저 노출된 후 이후에 "강아지 산책", "사료 강아지"와 같은 데이터들이 나옵니다.

 

 

 

 

 

728x90
반응형

댓글