🌈 인덱스(INDEX) 이해
🔥 인덱스(INDEX)란?
🔥 인덱스(INDEX) 정보
🔥 인덱스(INDEX) 생성
🔥 텍스트 검색과 인덱스(INDEX)
1. 인덱스(INDEX)란?
- MongoDB의 index는 list에서 말하는 index와는 관련이 없음
- 사전의 목차('A', 'B'...'ㄱ','ㄴ','ㄷ'...)와 같은 의미
- 검색을 더 빠르게 수행하고자 만든 추가적인 데이터 구조를 인덱스(INDEX)라 부름
2. 인덱스(INDEX) 정보 확인 및 삭제
1) 인덱스 정보 확인
- MongoDB 컬렉션은 기본적으로 "_id" 를 기반으로 기본 인덱스가 자동으로 생성되어 있음
- 생성된 INDEX의 정보를 확인할 땐 index_information() 메소드를 사용
- 🔍 [컬렉션 객체명].index_information()
import pymongo
conn = pymongo.MongoClient()
actor_db = conn.cine21
actor_collection = actor_db.actor_collection
print(actor_collection.index_information())
2) 인덱스 삭제
- 모든 인덱스를 삭제하고 싶을 때(_id인덱스는 삭제되지 않음)
- 🔍 [컬렉션 객체명].drop_indexes()
- 특정 인덱스를 삭제하고 싶을 때(es 빼고, 인자로 리스트 안에 옵션까지 입력해야함)
- 🔍 [컬렉션 객체명].drop_index([('인덱스명', 1), ('인덱스명', 1), ('인덱스명', 1)...])
import pymongo
conn = pymongo.MongoClient()
actor_db = conn.cine21
actor_collection = actor_db.actor_collection
actor_collection.drop_indexes()
actor_collection.drop_index([('출연영화', 1), ('랭킹', -1), ('흥행지수', "text")])
3. 인덱스(INDEX) 생성
1) 기본 인덱스 : _id 인덱스
- MongoDB 컬렉션에는 기본 인덱스로 "_id" 가 자동으로 존재하며 삭제되지 않음
- 이를 기본 인덱스 또는 _id 인덱스라 부름
2) 단일(Single) 필드 인덱스
- [컬렉션 객체명].create_index([("필드명", 옵션)])
- 옵션은 3가지로, 오름차순(default), 내림차순, TEXT가 있음
- 리스트 안에 튜플 형식으로 필드명과 옵션을 입력 👈 [(필드명, 옵션)]
- 오름차순은 defalut 값이기 때문에 안적어줘도 되고, "pymongo.ASCENDING" 또는 1을 입력하면 됨
- 🔍 [컬렉션 객체명].create_index('필드명')
- 🔍 [컬렉션 객체명].create_index([('필드명', pymongo.ASCENDING)])
- 🔍 [컬렉션 객체명].create_index([('필드명', 1)])
- 내림차순은 "pymongo.DESCENDING" 또는 -1을 입력하면 됨
- 🔍 [컬렉션 객체명].create_index([('필드명', pymongo.DESCENDING)])
- 🔍 [컬렉션 객체명].create_index([('필드명', -1)])
- TEXT 옵션을 주게되면 value값의 일부 글자만 가지고도 검색이 가능해짐
- 🔍 [컬렉션 객체명].create_index([('필드명', pymongo.TEXT)])
- 🔍 [컬렉션 객체명].create_index([('필드명', "text")])
import pymongo
conn = pymongo.MongoClient()
actor_db = conn.cine21
actor_collection = actor_db.actor_collection
actor_collection.create_index('출연영화')
actor_collection.create_index([('흥행지수', -1)])
actor_collection.create_index([('직업', pymongo.ASCENDING)])
actor_collection.create_index([('배우이름', pymongo.DESCENDING)])
actor_collection.create_index([('배우이름', 'text')])
print(actor_collection.index_information())
3) 복합(Compound) 필드 인덱스
- 여러 필드를 하나의 인덱스로 만들 수 있음(최대 31개의 필드까지)
- 생성 방법은 single 필드 인덱스와 일치하나, 인덱스로 만들 필드명과 옵션을 튜플 형식으로 추가하면 됨
- 🔍 [컬렉션 객체명].create_index([('필드명', 1), ('필드명, -1), ('필드명', 'text')...])
import pymongo
conn = pymongo.MongoClient()
actor_db = conn.cine21
actor_collection = actor_db.actor_collection
actor_collection.create_index([('출연영화', 'text'),('직업', 'text'),('흥행지수', 'text')])
print(actor_collection.index_information())
4. 텍스트 검색과 인덱스(INDEX)
- 인덱스는 데이터를 효과적으로 빠르게 하는 것이기 때문에 사용 검색 방법은 기존과 같음
- 데이터량이 많지 않다면 크게 체감적으로 느낄 수 없음
- 그럼에도 불구하고 INDEX를 쓰는 이유는 'text' 옵션으로 생성된 INDEX를 활용하기 위해서임
- 'text'로 생성한 인덱스는 어떤 글자가 value에 포함되어있는지 부분 문자열 검색이 가능해짐
1) 기본 인덱스 : text 검색
- 텍스트 검색은 '$serach'로 text를 검색함
- 🔍
[컬렉션 객체명].find({'$text':{'$search':'원하는 text'}})
- '원하는 텍스트'가 들어간 documents를 모두 출력
import pymongo
conn = pymongo.MongoClient()
actor_db = conn.cine21
actor_collection = actor_db.actor_collection
actor_collection.create_index([('출연영화', 'text')])
docs = actor_collection.find({'$text': {'$search':'국제수사'}})
for doc in docs:
print(doc)