Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 텍스트 인덱스를 활용해 복잡한 쿼리를 효율적으로 실행하는 방법

MongoDB에서 대량의 데이터를 대상으로 복잡한 검색 쿼리를 빠르게 실행하려면 인덱스(index) 생성이 필수적입니다. 특히 문자열 필드에서 키워드 기반 검색을 수행할 때는 텍스트(text) 인덱스를 활용하면 전체 컬렉션을 스캔하지 않고도 효율적인 검색이 가능합니다.

이 글에서는 실제 예제를 통해 컬렉션을 만들고, 텍스트 인덱스를 생성한 뒤, $text 연산자로 검색을 수행하는 과정을 단계별로 살펴보겠습니다.

1단계: 샘플 데이터가 담긴 컬렉션 생성

먼저 insertOne() 메서드를 사용해 문서(document)를 포함하는 컬렉션을 생성합니다.

> db.demo400.insertOne({SubjectName:"Java Spring"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e610720fac4d418a0178572")
}
> db.demo400.insertOne({SubjectName:"Spring Hibernate"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e61072dfac4d418a0178573")
}
> db.demo400.insertOne({SubjectName:"Java Hibernate"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e610736fac4d418a0178574")
}

세 개의 문서가 정상적으로 삽입되었습니다. 이제 이 필드에 텍스트 인덱스를 생성합니다.

2단계: 텍스트 인덱스 생성

createIndex() 메서드에 "text" 옵션을 지정하면 해당 필드에 텍스트 인덱스가 생성됩니다.

> db.demo400.createIndex({SubjectName:"text"});
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

출력 결과를 보면 인덱스 개수가 1개에서 2개로 증가했으며, ok : 1은 명령이 성공적으로 실행되었음을 의미합니다.

3단계: find() 메서드로 전체 문서 확인

find() 메서드를 사용해 컬렉션의 모든 문서를 조회해 보겠습니다.

> db.demo400.find();

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e610720fac4d418a0178572"), "SubjectName" : "Java Spring" }
{ "_id" : ObjectId("5e61072dfac4d418a0178573"), "SubjectName" : "Spring Hibernate" }
{ "_id" : ObjectId("5e610736fac4d418a0178574"), "SubjectName" : "Java Hibernate" }

4단계: $text 연산자로 키워드 검색 실행

텍스트 인덱스가 준비되었으므로, $text$search 연산자를 조합해 특정 키워드가 포함된 문서를 효율적으로 검색할 수 있습니다. 아래는 "Spring"이라는 단어가 포함된 문서를 찾는 쿼리입니다.

> db.demo400.find({ $text: { $search: "Spring" } } )

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e61072dfac4d418a0178573"), "SubjectName" : "Spring Hibernate" }
{ "_id" : ObjectId("5e610720fac4d418a0178572"), "SubjectName" : "Java Spring" }

결과를 보면 "Spring"이라는 키워드를 포함한 두 개의 문서만 반환된 것을 확인할 수 있습니다. 텍스트 인덱스 덕분에 MongoDB는 컬렉션 전체를 스캔하지 않고도 조건에 맞는 문서를 신속하게 찾아냅니다.

정리

문자열 필드에 대한 키워드 검색이 잦은 경우, 일반 인덱스 대신 텍스트 인덱스를 생성하고 $text 연산자를 사용하는 것이 좋습니다. 이 방식은 부분 문자열 매칭이나 복수 키워드 검색 등 복잡한 쿼리 상황에서도 뛰어난 성능을 발휘하며, 데이터 규모가 커질수록 그 효과가 더욱 두드러집니다.