inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

mongoDB 기초부터 실무까지(feat. Node.js)

text index 생성하기

RDB에서 사용하는 like 검색과 유사한 검색?

654

Peter Choi

작성한 질문수 6

1

안녕하세요~?

좋은 강의 만들어주심에 항상 감사를 드립니다! ^^

text index 를 학습하다가 궁금한 것이 생겼는데요, 

RDB에서 사용하는 like 검색처럼 몽고디비에서도 검색 가능할까요?

예를 들어서 content: "abcd efgh"라고 저장되어 있으면 RDB에서는 like '%bc%' 로 검색을 해도 해당 row가 검색이 될 텐데, 이번 강의에서 설명해주신 text index에서는 full word(abcd)로만 검색이 가능한 것 같네요.

mongodb에서 full word 가 아닌 word 중 일부 letter(bc) 로 검색하는 방법이 혹시 있을까요?

mongodb javascript DBMS/RDBMS rest-api nodejs aws 데이터 엔지니어링

답변 2

3

김시훈 (도도소프트)

Peter Choi님 안녕하세요 :)

좋은 질문입니다. MongoDB에서 $regex을 이용하면 정규식으로 검색을 할 수 있어요. "Mongodb $regex"로 검색하면 바로 나올거에요. 다만 이건 index를 사용하지 않기 때문에 성능이 좋지 않아요. 제가 알기로 관계형 데이터베이스에서의 like도 비슷하게 index를 사용하지 않습니다. 그래서 성능이 별로죠.

데이터가 엄청 많은게 아니라면 $regex를 사용하셔도 무방할거 같아요. 특히 인덱스 되어 있는 다른 필드랑 같이 조합해서 탐색을 하게 되면 $regex로 탐색해야하는 데이터양이 줄기 때문에 이 경우 괜찮다고 봅니다.

하지만 상품 검색 혹은 블로그 검색과 같은 "검색 엔진"을 만들기에는 RDB의 like는 물론 $text, $regex모두 부족합니다. 검색엔진은 단순히 상품 이름, 블로그 제목만 가지고 검색하지 않고 상품 상세 내용, 블로그의 본문을 가지고도 검색을 해야하거든요. 오타가 나도 비슷한 단어로 검색을 해줄 수 있어야 하고 검색한 단어가 얼마나 많이 포함되어 있는지도 봐야하고요. 이에 따라서 검색 순위가 바뀌어야 합니다. 

그래서 보통 검색엔진 전용으로 ElasticSearch NoSQL 데이터베이스를 따로 둡니다. 여기에 검색관련 데이터를 저장(메인디비와 동기화) 해서 사용하는거죠.

몽고디비에서 매우 비슷한 기능이 존재합니다. ElasticSearch는 Lucene이라는 검색엔진을 사용하는데요. 몽고디비에서도 1~2년 전즘부터 Lucene엔진 기반 검색기능이 제공되고 있어요. 이 탐색은 기능적으로 좋지만 인덱스 기반이라서 퍼포먼스도 좋습니다. 다만 메모리를 많이 먹을 수 있으니 이점은 인지해주시구요.

본 강의에서 이 내용을 다룰까 고민을 많이 했었는데 이 기능을 사용하려면 MongoDB Aggregate를 알아야 해서 생략했어요. Aggregate는 data lake랑 묶어서 data engineering 강의로 따로 만드는게 좋을것 같더라고요.

적용 해보고 싶으시면 밑에 공유한 공식문서 보고 따라하시면 될거 같아요! 예시 데이터로 시험해볼 수 있도록 되어 있기도 해서 적용하는건 크게 어렵지 않을거에요 :)

https://docs.atlas.mongodb.com/atlas-search/

1

Peter Choi

기능만 여쭤봤었는데 성능에 대한 부분까지 상세한 답변 너무너무 감사드립니다~ ^^

0

정연광

좋은 질문 감사합니다! 덕분에 저도 좋은 정보를 알아갑니다!

option usecreateindex is not supported 오류 나면은

0

149

1

Schemaless 특성을 재생시 검은화면이 나와요

0

241

1

user 내장 시 ref 필드 필요성

0

240

1

await 관련해서 질문드릴게 있습니다!!

0

294

2

섹션6의 3번째 강의 faker파일이 어디있나요?

0

312

1

$elemMatch 질문이 있습니다.

0

248

1

DB 업데이트에 실패했을 상황에서 대처는 어떻게 할 수 있나요.

2

771

2

블로그에 user 데이터를 추가하는 방법에 대해서

0

240

1

blog 데이터 생성시 user 관련 오류

0

352

1

age 예외 처리를 별도로 하신 이유가 궁금합니다.

2

304

2

delete 메소드가 많은 이유가 궁금합니다.

0

184

1

unique validation 처리

0

298

1

updateMany에서 user._id를 못찾는 상황

1

399

1

find() 가 리턴하는 instance member

1

434

3

몽고 db를 백업방법을 부탁합니다.

0

606

1

인덱스 생성시점

0

714

1

$pull 문법에 대한 질문

0

363

1

comment의 id가 생성되는 시점

1

304

1

리팩토링 강의에서 라우터 리팩토링 전개연산자(...)

1

317

1

session.abortTransaction()에 대한 실제 예시 문의

0

290

1

섹션9 Computed Fields 강의에서, 다음 강의 가기 전 빠진부분

-1

411

1

faker 패키지 취약성 이슈

1

488

1

라우터 리팩토링

0

347

1

섹션4 진행중, mongoose 질문

0

314

1