• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

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

21.05.20 17:55 작성 조회수 415

1

안녕하세요~?

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

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

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

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

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

답변 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님의 프로필

Peter Choi

질문자

2021.05.21

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

정연광님의 프로필

정연광

2021.05.22

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