[MongoDB] Text Search

2020. 12. 17. 13:42Database/MongoDB

1. Text Search

1) Text Index

MongoDB는 Text Index를 통해 문자열로된 컨텐츠에 대한 Text Search를 지원한다. Text Index는 값이 문자열이거나 문자열 요소의 배열인 모든 필드를 포함할 수 있다. Text Search를 수행하기 위해서는 컬렉션에 Text Index가 있어야한다. Text Search에는 오직 하나의 Index를 가지지만 여러 필드를 포함할 수 있다.

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

2) Text Search

Text Search를 하기 위해서는 $text를 사용한다. 공백을 이용하여 문자열을 찾을 수 있다. 예를 들어 java, coffee, shop 3개의 문자열이 포함된 스토어를 찾을 수 있다.

db.stores.find( { $text: { $search: "java coffee shop" } } )

$meta를 이용하여 일치하는 각 문서를 정렬할 수 있다.

db.stores.find(
   { $text: { $search: "coffee shop cake" } },
   { score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )

3) Aggregation Pipeline

찾고자 하는 단어에 대한 모든 뷰의 수 계산하는 경우는 다음과 같다.

db.articles.aggregate(
   [
     { $match: { $text: { $search: "cake" } } },
     { $group: { _id: null, views: { $sum: "$views" } } }
   ]
)

Text Search Score로 정렬하여 결과를 반환하는 경우는 다음과 같다. (cake 혹은 tea와 일치하는 내용과 textScore로 정렬되어 title필드만 반환)

db.articles.aggregate(
   [
     { $match: { $text: { $search: "cake tea" } } },
     { $sort: { score: { $meta: "textScore" } } },
     { $project: { title: 1, _id: 0 } }
   ]
)

Text Search Score와 일치하는 경우는 다음과 같다. (cake 혹은 tea와 일치하는 내용과 textScore가 1.0 이상인 결과를 반환)

db.articles.aggregate(
   [
     { $match: { $text: { $search: "cake tea" } } },
     { $project: { title: 1, _id: 0, score: { $meta: "textScore" } } },
     { $match: { score: { $gt: 1.0 } } }
   ]
)

Text Search에서 특정 언어에 대한 결과 반환은 다음과 같다.

db.articles.aggregate(
   [
     { $match: { $text: { $search: "saber -claro", $language: "es" } } },
     { $group: { _id: null, views: { $sum: "$views" } } }
   ]
)

[참고] docs.mongodb.com/manual/text-search/

728x90

'Database > MongoDB' 카테고리의 다른 글

[MongoDB] Model 활용  (0) 2020.12.18
[MongoDB] Data Model (Documents간의 관계 설정 구조)  (0) 2020.12.17
[MongoDB] Bulk Write, Retryable Write/Read  (0) 2020.12.16
[MongoDB] CRUD  (0) 2020.12.15