01.MongoDB 기초 - 인덱스(INDEX) 이해

ID짱재·2021년 3월 2일
0

MongoDB

목록 보기
8/8
post-thumbnail

🌈 인덱스(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 
# mongodb connection
conn = pymongo.MongoClient() # pymongo로 mongodb 연결(localhost:27017)
actor_db = conn.cine21 
actor_collection = actor_db.actor_collection
# INDEX 정보 확인
print(actor_collection.index_information())

2) 인덱스 삭제

  • 모든 인덱스를 삭제하고 싶을 때(_id인덱스는 삭제되지 않음)
    • 🔍 [컬렉션 객체명].drop_indexes()
  • 특정 인덱스를 삭제하고 싶을 때(es 빼고, 인자로 리스트 안에 옵션까지 입력해야함)
    • 🔍 [컬렉션 객체명].drop_index([('인덱스명', 1), ('인덱스명', 1), ('인덱스명', 1)...])
import pymongo 
# mongodb connection
conn = pymongo.MongoClient() # pymongo로 mongodb 연결(localhost:27017)
actor_db = conn.cine21 
actor_collection = actor_db.actor_collection
# 모든 INDEX 삭제
actor_collection.drop_indexes()
# 특정 INDEX 삭제
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 
# mongodb connection
conn = pymongo.MongoClient() # pymongo로 mongodb 연결(localhost:27017)
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 
# mongodb connection
conn = pymongo.MongoClient() # pymongo로 mongodb 연결(localhost:27017)
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 
# mongodb connection
conn = pymongo.MongoClient() # pymongo로 mongodb 연결(localhost:27017)
actor_db = conn.cine21 
actor_collection = actor_db.actor_collection
# text 검색
actor_collection.create_index([('출연영화', 'text')])
docs = actor_collection.find({'$text': {'$search':'국제수사'}})
for doc in docs:
    print(doc)

profile
Keep Going, Keep Coding!

0개의 댓글