MongoDB 텍스트 인덱스
MongoDB 의 텍스트 검색은 텍스트 매칭이 다가 아니다. 형태소를 분리 한다음, 단어를 끄집어낸뒤, 각 단어와 유사한 단어를 검색 하는 기능이다. 웹사이트의 검색처럼 형태소를 분리 해서 검색하는 유사한 검색 방식을 제공하지만 검색 엔진처럼 유사어 등과 같이 파워풀한 기능을 제공하지는 못한다.
MongoDB 지원기능
컬렉션은 하나의 인덱스만 가질 수 있다.
인덱스 지정은 다음과 같이 한다.
db.products.createIndex({
name: 'text',
description: 'text',
tags: 'text'
});
* 인덱스 필드 지정시 -1 이나 1이 아닌 text 로 지정한다.
* 텍스트 인덱스가 될 필드를 지정 할 수 있으며, 지정된 필드는 단일 필드인 것처럼 한번에 검색 한다.
* 컬렉션별로 하나의 텍스트 인덱스만 가질 수 있으며, 원하는 만큼 필드를 지정 할 수 있다. 만약 문자열이 있는 모든 필드를 지정하려면 name 이나 description 대신에 '$**' 만 사용하면 된다. 이것을 와일드 카드 필드명 이라고 한다.
db.products.createIndex({
'$**': 'text'
});
생성된 인덱스의 크기는 인덱스 지정된 컬럼들의 합과 거의 같다. 이는 모든 필드 항목이 인덱싱 되어야 하기 때문이기도 하다. 때문에 스토리지가 많이 사용된다는 점을 유의 깊게 고려해 작업을 진행 해야 한다.
형태소 분석 과 불용어 삭제
텍스트 검색시 actions 를 검색하기 위해선 다음과 같이 한다.
db.books.find({$text: {$search: 'actions'}},{title:1})
이때 MongoDB 는 actions 에서는 제외하고 action 을 이용해 동일 텍스트를 검색한다.
만약 "man in the house" 라면
man in the house > man house 로 in 과 the 가 제거된 상태로 man 과 house 만으로 텍스트를 검색하게 된다.
이렇게 형태소를 분석해 불용어를 제거하고 검색하게 된다.
필드이름을 통해 선택적으로 지정 가능한 가중치
MongoDB는 여러개의 필드를 텍스트 인덱스로 지정 할 수 있는데, 이때 각 필드별로 검색 가중치를 부여 할 수 있다.
가중치를 지정하면 조회시에 해당 가중치를
다국어지원
덴마크, 네덜란드, 영어, 필란드, 프랑스, 독일어, 헝가리어, 이탈리아 등 다양한 언어를 지원한다. 단, 한국어, 일본어는 아직 제공하고 있지 않다. (https://docs.mongodb.com/manual/reference/text-search-languages/)
정확한 구문 또는 단어일치
검색 구문에 정확하게 포함된 문자열을 지정하고 싶다면, "를 이용해 필수로 포함 되어야 하는 단어를 감쌓는다.
db.books.
... find({$text: {$search: ' "mongodb" "second edition" '}},
... {_id:0, title:1})
{ "title" : "MongoDB in Action, Second Edition" }
주어진 구, 또는 단어로 결과를 제외할수 있는기능
역으로 제외 하고자 하는 단어가 있다면 단어 앞에 간단히 - 기호만 추가하면 된다.
db.books.
... find({$text: {$search: ' mongodb -second '}},
... {_id:0, title:1 })
{ "title" : "MongoDB in Action" }
추가적으로 find 기능을 추가하여 더 정확한 결과 값을 추출 할 수 있다.
텍스트 검색 스코어
텍스트 검색 스코어는 인덱스 를 지정할 때 부여한 가중치를 이용해 도큐먼트 검색 결과 관련성을 평가하는 평가 값을 제공한다.
검색스코어를 노출 하기 위해서는 find() 명령어에 score : {$meta : "textScore"} 를 추가한다.
가중치는 특정 필드에서 특정 단어가 검색되는 점에 대한 중요성에 영향을 미친다. 가중치를 임의로 지정하면 지정한 값이 입력되고 지정하지 않으면 기본적으로 1이 입력된다.
텍스트 검색 스코어를 이용해 검색 결과를 ranking 으로 이용해 정렬 할수 있다.