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 연산자를 사용하는 것이 좋습니다. 이 방식은 부분 문자열 매칭이나 복수 키워드 검색 등 복잡한 쿼리 상황에서도 뛰어난 성능을 발휘하며, 데이터 규모가 커질수록 그 효과가 더욱 두드러집니다.