[MongoDB] Text Search
2020. 12. 17. 13:42ㆍDatabase/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" } } }
]
)
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 |