이 장에서는 MongoDB의 전체 텍스트 검색을 소개합니다. 이는 SQL의 "like" 연산자와는 다릅니다. MongoDB의 전체 텍스트 검색은 "like"의 구현에 비해 텍스트 검색에 더 효율적입니다.

테스트 데이터 준비

stores 컬렉션에 몇 개의 레코드를 삽입합니다.

db.stores.insert(
   [
     { _id: 1, name: "Java Hut", description: "커피와 케이크" },
     { _id: 2, name: "Burger Buns", description: "고메 햄버거" },
     { _id: 3, name: "Coffee Shop", description: "커피 전문점" },
     { _id: 4, name: "Clothes Clothes Clothes", description: "의류 할인" },
     { _id: 5, name: "Java Shopping", description: "인도네시아 상품" }
   ]
)

텍스트 인덱스 생성

전체 텍스트 검색 기능을 사용하려면 텍스트 인덱스를 생성해야 합니다. 예시:

db.stores.createIndex( { name: "text", description: "text" } )

설명:

  • 이름과 설명 필드에 대한 텍스트 형식의 인덱스를 생성합니다.

참고: 컬렉션은 한 개의 텍스트 인덱스만 허용하지만, 텍스트 인덱스는 여러 필드를 포함할 수 있습니다.

$text 연산자

텍스트 검색에 $text 연산자를 사용합니다.

구문:

{ $text: { $search: "검색 키워드" } }

예시:

db.stores.find( { $text: { $search: "커피 인도네시아" } } )

설명:

  • 이름과 설명 필드에서 "커피"와 "인도네시아" 키워드를 포함한 문서를 검색합니다.

결과:

{ "_id" : 3, "name" : "Coffee Shop", "description" : "커피 전문점" }
{ "_id" : 5, "name" : "Java Shopping", "description" : "인도네시아 상품" }
{ "_id" : 1, "name" : "Java Hut", "description" : "커피와 케이크" }

구문 검색

db.stores.find( { $text: { $search: "\"커피 전문점\"" } } )

결과:

{ "_id" : 3, "name" : "Coffee Shop", "description" : "커피 전문점" }

관련성 정렬

기본적으로 $text 쿼리의 결과는 정렬되지 않습니다. $text 쿼리는 각 문서의 관련성에 대한 점수 (textScore)를 계산합니다. 이 점수를 사용하여 상위 관련성을 가진 문서를 정렬하고 표시할 수 있습니다.

db.stores.find(
   { $text: { $search: "커피 인도네시아" } },
   { score: { $meta: "textScore" } }  // textScore 관련성 점수를 반환할 것을 선언
).sort( { score: { $meta: "textScore" } } ) // textScore를 사용한 정렬 지정

참고: MongoDB 전체 텍스트 검색은 중국어 구문에 대한 아주 좋은 지원을 제공하지 않습니다.