크리스티나 초도로 , 섀넌 브래드쇼 , 오언 브라질 님의 "몽고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로 파일 저장하기
'Database > MongoDB' 카테고리의 다른 글
[몽고DB 완벽 가이드] 8. 트랜잭션 (1) | 2025.04.30 |
---|---|
[몽고DB 완벽 가이드] 7. 집계 프레임워크 (1) | 2025.04.30 |
[몽고DB 완벽 가이드] 5. 인덱싱 (0) | 2025.04.29 |
[몽고DB 완벽 가이드] 4. 쿼리 (1) | 2025.04.28 |
[몽고DB 완벽 가이드] 3. 도큐먼트 생성, 갱신, 삭제 (0) | 2025.04.28 |