Database/MongoDB

[몽고DB 완벽 가이드] 6. 특수 인덱스와 컬렉션 유형

noahkim_ 2025. 4. 30. 03:48

크리스티나 초도로 , 섀넌 브래드쇼 , 오언 브라질 님의 "몽고DB 완벽 가이드" 책을 정리한 포스팅 입니다.

 

1. 전문 검색을 위한 인덱스

  • 검색 관련 키워드 (일치, 정규 표현식 등) 은 한계가 존재함
  • 쿼리 속도가 느리며, 문법과 같은 언어 특성을 반영하기도 쉽지 않음

 

텍스트 인덱스

  • 문자열 기반의 데이터를 빠르게 검색할 수 있도록 도와주는 인덱스
  • 역색인 구조로 저장됨 (단어 -> 문서 목록)
항목 장점 한계 비용/성능 문제
검색 성능 빠른 텍스트 검색 복잡한 조건 검색에는 제한 있음
- 정규식
복잡한 쿼리는 성능 저하 발생
텍스트 처리 전처리 지원
1. 토큰화
2. 소문자화
3. 정지어 제거 (a, the, is 등)
4. 형태소 분석

5. 중복 제거
문법적 의미나 자연어 이해는 어려움 비용 발생
- 형태소 분석
- 인덱스 갱신
인덱스 구조/유지 인덱스 구조 설계 가능 관리 복잡
- 다양한 위치에 인덱스가 갱신됨
쓰기 성능 저하
저장소/CPU/메모리 사용량 증가
확장성과 분산 처리 (해당 없음) 샤딩 시 재배치 비용이 큼
- 인덱스 분산 및 이동이 느림
샤드 간 데이터 이동 속도 저하
관리 비용 증가

 

예시) 텍스트 처리

더보기

전처리

"나는 밥을 먹었다"

# 형태소 분석
["나", "밥", "먹다"] 
 
# 인덱스
"나" → 문서 A, 위치 1
"밥" → 문서 A, 위치 2
"먹다" → 문서 A, 위치 3
  • 불필요한 조사/어미 제거
  • 인덱스가 여러 위치에서 수정되기 때문에 쓰기 성능이 낮아짐.

 

예시) 샤딩

더보기
샤드 1: 문서 A 
- 내용: "엘라스틱서치는 텍스트 검색에 강하다"
- 인덱스: ["엘라스틱서치", "텍스트", "검색", "강하다"]

샤드 2: 문서 B
- 내용: "검색은 정보의 시작이다"
- 인덱스: ["검색", "정보", "시작"]

문서 A를 샤드 2로 이동
- 문서 A를 샤드 2에 저장
- 문서 A의 인덱스에서 "검색"은 이미 문서 B의 인덱스에 존재하는 단어 
-> "검색"은 문서 B, 문서 A로 병합됨
-> 문서 A의 인덱스는 ["엘라스틱서치", "텍스트", "강하다"]로 갱신되어야 함
  • 단순히 문서를 옮기는 게 아니라 단어 인덱스 전체에도 영향을 줌 
  • 느리고 무거운 작업이 되는 이유

 

생성

  • 기본적으로 인덱스의 각 필드의 가중치는 동일함
  • 필드 가중치 제어가 가능함

 

예제

더보기
db.articles.createIndex({title: "text", body: "text"}, {weights: {title: 2, body: 3}})

 

검색

항목 설명
$text
텍스트 인덱스 기반 검색을 수행하는 MongoDB 연산자
- 공백과 구두점을 기준으로 검색 문자열을 토큰화
- 검색 문자열의 모든 토큰을 논리적 OR로 처리
- $search
실제 검색 문자열을 입력하는 필드
- $meta 검색 결과에 메타데이터 필드를 포함시킬 때 사용

 

예제

더보기
# text 필드의 인덱스에서 ["함지산", "산불", "대응"] 중 하나라도 포함되는 문서를 반환 (OR)
db.articles.find({ $text: { $search: "함지산 산불 대응" } })

# text 필드의 인덱스에서 "함지산"과 "산불" 모두를 포함하는 문서를 반환 (AND)
db.articles.find({ $text: { $search: "\"함지산\" \"산불\"" } }, {title: 1})
#textScore: 어떤 키워드가 얼마나 관련있는지 확인 가능
db.articles.find({$text: {$search: "산불"}}, {score: {$meta: "textScore"}})

 

검색 최적화

  • 전문 필드를 필터 필드보다 뒤에 두기
  • 파티셔닝을 통해 전문 검색을 훨씬 빨리 할 수 있음

 

다른 언어로 검색하기

  • 언어에 따라 형태소 분석 방법이 다름
  • 인덱스나 도큐먼트가 어떤 언어로 쓰였는지 명시해야 함
  • 옵션: default_language

 

2. TTL 인덱스

  • 도큐먼트에 유효시간 설정 가능
  • 캐시나 세션 사용시 유용함

 

예시) expiredAfterSeconds 속성

더보기
db.sessions.createIndex({lastUpdated: 1}, {expiredAfterSeconds: 60*60*24})

 

3. 공간 정보 인덱스

4. 제한 컬렉션

5. GridFS로 파일 저장하기