Azure DocumentDB에서 제공하는 주요 기능 중 하나는 텍스트 기반 데이터를 효율적으로 검색하고 쿼리할 수 있는 텍스트 인덱싱입니다. 서비스는 버전 2 텍스트 인덱스를 구현합니다. 버전 2는 대/소문자 구분을 지원하지만 발음 민감도는 지원하지 않습니다.
Azure DocumentDB의 텍스트 인덱스는 텍스트 기반 쿼리를 최적화하여 더 빠르고 효율적으로 만드는 특수 데이터 구조입니다. 문서, 기사, 댓글 또는 텍스트 기반의 데이터를 처리하도록 설계되었습니다. 텍스트 인덱스는 토큰화, 형태소 분석 및 중지 단어와 같은 기술을 사용하여 텍스트 기반 검색의 성능을 향상시키는 인덱스를 만듭니다.
필수 조건
Azure 구독
- Azure 구독이 없는 경우 체험 계정 만들기
기존 Azure DocumentDB 클러스터
- 클러스터가 없는 경우 새 클러스터를 만듭니다.
텍스트 인덱스 정의
간단히 하기 위해 다음 설정을 사용하여 블로그 애플리케이션의 예를 살펴보겠습니다.
-
데이터베이스 이름:
cosmicworks -
컬렉션 이름:
products
이 예제 애플리케이션은 다음 구조를 사용하여 문서를 문서로 저장합니다.
{
"_id": ObjectId("617a34e7a867530bff1b2346"),
"title": "Azure DocumentDB - A Game Changer",
"content": "Azure DocumentDB is a globally distributed, multi-model database service.",
"author": "John Doe",
"category": "Technology",
"published": true
}
createIndex메서드와text옵션을 사용하여title필드에 텍스트 인덱스를 만듭니다.use cosmicworks; db.products.createIndex({ title: "text" })비고
컬렉션당 하나의 텍스트 인덱스만 정의할 수 있지만 Azure DocumentDB를 사용하면 여러 필드에 텍스트 인덱스를 만들어 문서의 여러 필드에서 텍스트 검색을 수행할 수 있습니다.
필요에 따라
title및content필드에서 검색을 지원하기 위해 인덱스를 생성하십시오.db.products.createIndex({ title: "text", content: "text" })
텍스트 인덱스 옵션 구성
Azure DocumentDB의 텍스트 인덱스에는 동작을 사용자 지정하는 몇 가지 옵션이 제공됩니다. 예를 들어 텍스트 분석 언어를 지정하고, 가중치를 설정하여 특정 필드의 우선 순위를 지정하고, 대/소문자를 구분하지 않는 검색을 구성할 수 있습니다. 다음은 옵션을 사용하여 텍스트 인덱스 만들기의 예입니다.
title및content필드 모두에서 영어 지원으로 검색을 지원하는 인덱스를 만들기 또한 필드에 더 높은 가중치를title할당하여 검색 결과에서 우선 순위를 지정합니다.db.products.createIndex( { title: "text", content: "text" }, { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false } )
텍스트 인덱스의 가중치
텍스트 인덱스를 만들 때 인덱스의 개별 필드에 다른 가중치를 할당할 수 있습니다. 이러한 가중치는 검색에서 각 필드의 중요도 또는 관련성을 나타냅니다. Azure DocumentDB는 텍스트 검색 쿼리를 실행할 때 검색어를 기반으로 각 문서에 대한 점수 및 할당된 가중치를 계산합니다. 점수는 검색 쿼리에 대한 문서의 관련성을 나타냅니다.
title및content필드 둘 다에서 검색을 지원하는 인덱스 만들기. "제목" 필드에 가중치 2를, "콘텐츠" 필드에 가중치 1을 할당합니다.db.products.createIndex( { title: "text", content: "text" }, { weights: { title: 2, content: 1 } } )비고
클라이언트가 "DocumentDB"라는 용어로 텍스트 검색 쿼리를 수행하는 경우 컬렉션의 각 문서에 대한 점수는 "제목" 및 "콘텐츠" 필드 모두에서 용어의 현재 상태와 빈도에 따라 계산되며 가중치가 높기 때문에 "제목" 필드에 더 높은 중요도를 부여합니다.
텍스트 인덱스로 텍스트 검색 수행
텍스트 인덱스가 만들어지면 쿼리에서 "text" 연산자를 사용하여 텍스트 검색을 수행할 수 있습니다. 텍스트 연산자는 검색 문자열을 사용하여 텍스트 인덱스와 일치하여 관련 문서를 찾습니다.
구
DocumentDB에 대한 텍스트 검색을 수행합니다.db.products.find( { $text: { $search: "DocumentDB" } } )필요에 따라 쿼리의
$meta필드와 함께textScore프로젝션 연산자를 사용하여 가중치를 확인합니다.db.products.find( { $text: { $search: "DocumentDB" } }, { score: { $meta: "textScore" } } )
텍스트 인덱스 삭제
MongoDB에서 텍스트 인덱스 삭제를 위해 컬렉션에서 메서드를 사용하고 dropIndex() 제거할 텍스트 인덱스의 인덱스 키 또는 이름을 지정할 수 있습니다.
키를 명시적으로 지정하여 텍스트 인덱스 삭제
db.products.dropIndex({ title: "text" })필요에 따라 자동 생성된 고유 이름을 지정하여 텍스트 인덱스 삭제
db.products.dropIndex("title_text")
텍스트 인덱스 제한 사항
- 컬렉션에 하나의 텍스트 인덱스만 정의할 수 있습니다.
- Hint()는 $text 식을 사용하는 쿼리와 함께 지원되지 않습니다.
- 정렬 작업은 MongoDB에서 텍스트 인덱스의 순서를 사용할 수 없습니다.
- 텍스트 인덱스는 상대적으로 클 수 있으며 다른 인덱스 유형에 비해 상당한 스토리지 공간을 사용할 수 있습니다.