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