Node.js + MongoDB 검색2(MongoDB index만들기)
https://daehyuntsory.tistory.com/85
Node.js + MongoDB 검색(Query형식 GET로 처리하기)
우리가 발행한 게시물의 검색기능을 만들어봅시다. 검색창 UI 그리고 검색결과 보여주는 html 페이지가 필요하겠군요. 검색창 UI를 다음과 같이 list.ejs 아무데나 추가합시다. 검색 Bootstrap 설치되
daehyuntsory.tistory.com
위에서 검색기능을 구현하였다 하지만 문제점은 정확히 일치하는 것만 찾아줍니다.
"글쓰기"라고 검색하면 "글쓰기를 잘해야합니다" 이런 게시물은 못찾는 겁니다.
어떻게 해결하냐면
간단한 해결책 : 정규식을 씁니다.
정규식은 문자를 검사하는 식입니다. // 안에다가 문자를 담으면 검사해줍니다.
/abc/ 이렇게 적으면 문자에 abc라는게 들어있냐~ 라고 검사해줄 수 있으니 이거 쓰면 해결입니다.
db.collection('post').find({제목 : /글쓰기/})
그니까 find() 함수쓸 때 이렇게 검색하면 되는 것임
끝
Database가 게시물을 찾는 방법
원래 게시물을 그냥 찾으면 매우 느립니다.
원하는걸 찾으려면 게시물 100만개를 전부 탐색해야하니까요.
그래서 데이터베이스는 보통 Binary Search라는걸 사용할 수 있습니다.
이게 뭐냐면 제가 1부터 100까지 숫자를 하나 생각해볼테니 여러분이 한번 찾아보시길 바랍니다.
빠르게 찾고싶으면 저에게 어떻게 질문을 던져야할까요.
1입니까 2입니까~~ 이렇게 하나하나 물어보면 평생걸리겠죠?
그래서 똑똑한 사람들은 "50 이상입니까?" 라고 물어봅니다.
예라고 답하면 그 다음은 "75 이상입니까?" 라고 물어봅니다.
이렇게 반을 잘라가면서 물어보면 매우 빠르게 최소한의 질문으로 찾아낼 수 있습니다.
5~6번만 질문 던지면 100개 중에 내가 원하는 항목을 빠르게 찾을 수 있게 됩니다.
게시물이 100만개라도 20번만 물어보면 될걸요?
이게 Binary Search라는 알고리즘입니다.
거의 모든 Database들은 기본적으로 이걸로 게시물을 찾아주는데
근데 이걸 쓰려면 조건이 있습니다. 숫자가 1부터 100까지 미리 정렬이 되어있어야합니다.
그래야 "50 이상입니까~" 라고 물어보죠.
그럼 글제목도 빠르게 찾으려면?
미리 정렬해두면 되지 않을까요? (글자도 정렬이 가능합니다)
맞습니다 이걸 멋진 용어로 indexing이라고 합니다.
indexing을 해두면 이제 글자로 뭔가 검색할 때 매우 빠르게 찾을 수 있습니다.
indexing 하려면 MongoDB Atlas 들어가셔서
원하는 Collection 안에서 Index 만들기 누르시면 됩니다.
▲ 잘 찾아보셈 어딘가에 있음
▲ 그 다음에 저렇게 설정해주면 됩니다.
{ 인덱스만들항목이름 : 'text' }
이렇게 기입하면 끝입니다.
글자인 경우 'text' 숫자인 경우 1 또는 -1을 기입하면 끝입니다.
그러면 index가 생성됩니다.
인덱싱이라는 용어가 어려워 보이지만 그냥 collection을 사본을 하나 더 만들어주는 작업일 뿐입니다. 근데 정렬된 사본임
아무튼 index를 만들어두면 빠르게 찾아낼 수 있는데 한글 게시물들의 경우 문제점이 있을 수 있습니다.
다음글에서 해결해보도록 합시다.
(참고) 정규식을 사용하면 항상 index를 사용하는게 아닙니다.
정규식을 쓸 때 시작하는 단어가 '이닦기'인걸 찾아주세요~ 라고 명령을 주면 index를 사용하고
'이닦기'가 포함된걸 다찾아주세요~ 라고 명령을 주면 index를 사용하지 않습니다.
그래서 인덱싱 이런게 항상 만능은 아닙니다.
이런 문제도 다음글에서 해결합시다.