개발과 기록의 조화

[MongoDB] 텍스트(TEXT) 인덱스 본문

Database/MongoDB

[MongoDB] 텍스트(TEXT) 인덱스

dlaudtjr03 2020. 2. 3. 13:01
해당 게시물은 학습 및 기록 목적으로 작성되었습니다. 사실과 다른 내용이 있을 수 있으며, 오류가 있거나 궁금한 점은 댓글이나 dlaudtjr07@gmail.com 으로 메일 주시면 감사하겠습니다.


텍스트 검색

MongoDB는 문자열 내용의 텍스트 검색 수행 쿼리 작업을 지원합니다. 이에 따라 텍스트 검색을 위해 Text Index와 $text 연산자를 이용합니다.

 

예제 데이터 작성

 

예제를 하나 만듭시다.

 

db.shop.insert(
	[ 
		{_id : 1, name : "StarBucks" , description : "StarBucks Coffee"},
		{_id : 2, name : "CarHartt" ,   description : "Work In Progress"},
		{_id : 3, name : "Converse", description : "Chuck Taylor"}
	]
)

 

MongoDB에서는 텍스트 검색 쿼리를 지원하는 Text Index 기능이 있습니다. 문자열 , 문자열 배열 요소가 이에 적용 가능합니다.  컬렉션은 하나의 텍스트 인덱스만 가질 수 있습니다만, 해당 인덱스는 여러 필드를 포함할 수 있습니다.

 

텍스트 인덱스를 사용할려면 당연히 등록을 해야겠죠. 등록 해봅시다.

 

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

name 필드와 description 필드에 text 타입으로 인덱스를 생성했습니다. 이는 곧 두 개의 인덱스 필드를 지정한 것과 같습니다.

 

이제 텍스트 인덱스를 등록했기 때문에 $text 쿼리 연산자를 이용해 텍스트 인덱스로 검색할 수 있습니다.

 

db.shop.find({$text:{$search : "CarHartt"}})

 

문자열 검색 시에 조건에 해당하는 문자열 범위 내에 일치하는 데이터를 검색할 수도 있습니다. 

db.shop.find({$text:{$search : "\"StarBucks\""}})

$search 연산자로 따옴표로 문자열 검색 조건을 묶으면 대소문자 구별 없이 정확히 일치하는 데이터만 찾아냅니다.

 

 

'-' 연산자로 제외할 텀을 지정할 수도 있습니다.

db.shop.find({$text:{$search : "CarHartt -StarBucks"}})

 

기본적으로 MongoDB는 정렬하지 않는 결과를 반환하는 반면, 텍스트 인덱스는 "검색 정확도"를 기반으로 문서에 대한 점수를 매겨서 스코어 기준으로 정렬하는 특징을 가지고 있습니다.

db.shop.find(
	{
    	$text : {$search:"StarBucks Carhartt"}},
		{score:{$meta:"textScore"}}
	).sort({score :{$meta : "textScore"}})

 

 

 


해당 글은 코드프레소 DevOps Roasting 코스를 수강하면서 작성한 글입니다.

 

Comments