MongoDB에서 전체 텍스트 검색(Full Text Search)을 수행하려면 $text 연산자를 사용합니다. $text 연산자는 지정된 필드의 내용을 대상으로 텍스트 검색을 수행하며, 이를 사용하기 위해서는 먼저 검색 대상 필드에 텍스트 인덱스(text index)를 생성해야 합니다.
이 글에서는 컬렉션을 생성하고 문서를 삽입한 뒤, $text 연산자로 전체 텍스트 검색을 실행하는 전 과정을 예제와 함께 단계별로 살펴보겠습니다.
1. 텍스트 인덱스 생성
전체 텍스트 검색을 사용하려면 검색 대상이 될 필드에 text 타입의 인덱스를 먼저 생성해야 합니다. createIndex() 메서드를 사용하여 Name 필드에 텍스트 인덱스를 생성해 보겠습니다.
> db.demo654.createIndex({Name:"text"});
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}인덱스 생성 시 해당 컬렉션이 존재하지 않으면 자동으로 생성되며, 결과에 "createdCollectionAutomatically" : true가 표시됩니다.
2. 문서 삽입
이제 insertOne() 메서드를 사용해 컬렉션에 문서를 차례로 추가합니다.
> db.demo654.insertOne({"Name":"John Doe"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea04e924deddd72997713c8")
}
> db.demo654.insertOne({"Name":"Chris Brown"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea04e9d4deddd72997713c9")
}
> db.demo654.insertOne({"Name":"John Smith"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea04ea54deddd72997713ca")
}
> db.demo654.insertOne({"Name":"David Miller"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea04eb24deddd72997713cb")
}3. 전체 문서 조회
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo654.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5ea04e924deddd72997713c8"), "Name" : "John Doe" }
{ "_id" : ObjectId("5ea04e9d4deddd72997713c9"), "Name" : "Chris Brown" }
{ "_id" : ObjectId("5ea04ea54deddd72997713ca"), "Name" : "John Smith" }
{ "_id" : ObjectId("5ea04eb24deddd72997713cb"), "Name" : "David Miller" }4. 전체 텍스트 검색 실행
이제 $text 연산자와 $search 연산자를 함께 사용하여 Name 필드에 "John"이라는 단어가 포함된 문서를 검색해 보겠습니다.
> db.demo654.find({ $text: { $search: "John" } } );위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5ea04ea54deddd72997713ca"), "Name" : "John Smith" }
{ "_id" : ObjectId("5ea04e924deddd72997713c8"), "Name" : "John Doe" }마무리
검색 결과를 보면 Name 필드에 "John"이 포함된 두 개의 문서만 반환된 것을 확인할 수 있습니다. 이처럼 MongoDB의 $text 연산자를 활용하면 텍스트 인덱스가 생성된 필드를 대상으로 빠르고 효율적인 전체 텍스트 검색을 수행할 수 있습니다. 검색 조건이 복잡해지는 경우 $search에 여러 단어나 구문을 조합하여 더욱 정교한 검색도 가능합니다.