다음을 통해 공유


Azure Cosmos DB for MongoDB vCore에서 텍스트 인덱스를 사용하여 검색 및 쿼리

적용 대상: MongoDB vCore

Azure Cosmos DB for MongoDB vCore에서 제공하는 주요 기능 중 하나는 텍스트 기반 데이터를 효율적으로 검색하고 쿼리할 수 있는 텍스트 인덱싱입니다. 서비스는 버전 2 텍스트 인덱스를 구현합니다. 버전 2는 대/소문자 구분을 지원하지만 분음 부호 구분은 지원하지 않습니다.

Azure Cosmos DB for MongoDB의 텍스트 인덱스는 텍스트 기반 쿼리를 최적화하여 더 빠르고 효율적으로 만드는 특수 데이터 구조입니다. 문서, 아티클, 메모 또는 기타 텍스트가 많은 데이터와 같은 텍스트 콘텐츠를 처리하도록 설계되었습니다. 텍스트 인덱스는 토큰화, 형태소 분석 및 중지 단어와 같은 기술을 사용하여 텍스트 기반 검색의 성능을 향상시키는 인덱스를 만듭니다.

필수 조건

텍스트 인덱스 정의

간단한 설명을 위해 다음 설정을 사용하는 블로그 애플리케이션의 예를 살펴보겠습니다.

  • 데이터베이스 이름: 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
}
  1. createIndex 메서드를 text 옵션과 함께 사용하여 title 필드에 텍스트 인덱스를 만듭니다.

    use cosmicworks;
    
    db.products.createIndex({ title: "text" })
    

    참고 항목

    컬렉션당 하나의 텍스트 인덱스만 정의할 수 있지만 Azure Cosmos DB for MongoDB vCore를 사용하면 여러 필드에 텍스트 인덱스를 만들어 문서의 여러 필드에서 텍스트 검색을 수행할 수 있습니다.

  2. 필요에 따라 titlecontent 필드 모두에 대한 검색을 지원하는 인덱스를 만듭니다.

    db.products.createIndex({ title: "text", content: "text" })
    

텍스트 인덱스 옵션 구성

Azure Cosmos DB for MongoDB의 텍스트 인덱스에는 동작을 사용자 지정하는 몇 가지 옵션이 제공됩니다. 예를 들어 텍스트 분석 언어를 지정하고, 가중치를 설정하여 특정 필드의 우선 순위를 지정하고, 대/소문자를 구분하지 않는 검색을 구성할 수 있습니다. 다음은 옵션을 사용하여 텍스트 인덱스 만들기의 예입니다.

  1. 영어 지원을 통해 titlecontent 필드 모두에 대한 검색을 지원하는 인덱스를 만듭니다. 또한 검색 결과에서 우선순위를 지정하기 위해 title 필드에 더 높은 가중치를 할당합니다.

    db.products.createIndex(
        { title: "text", content: "text" },
        { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false }
    )
    

텍스트 인덱스의 가중치

텍스트 인덱스를 만들 때 인덱스의 개별 필드에 다른 가중치를 할당할 수 있습니다. 이러한 가중치는 검색에서 각 필드의 중요도 또는 관련성을 나타냅니다. Azure Cosmos DB for MongoDB vCore는 텍스트 검색 쿼리를 실행할 때 검색어를 기반으로 각 문서에 대한 점수 및 할당된 가중치를 계산합니다. 점수는 문서와 검색 쿼리의 관련성을 나타냅니다.

  1. titlecontent 필드 모두에 대한 검색을 지원하는 인덱스를 만듭니다. "title" 필드에 가중치 2를 할당하고 "content" 필드에 가중치 1을 할당합니다.

    db.products.createIndex(
    { title: "text", content: "text" },
    { weights: { title: 2, content: 1 } }
    )
    

    참고 항목

    클라이언트가 "Cosmos DB"라는 용어로 텍스트 검색 쿼리를 수행하는 경우 컬렉션의 각 문서에 대한 점수는 "title" 및 "content" 필드 모두에서 용어의 존재 및 빈도에 따라 계산되며, 가중치가 높기 때문에 "title" 필드에 더 높은 중요도를 부여합니다.

텍스트 인덱스로 텍스트 검색 수행

텍스트 인덱스가 만들어지면 쿼리에서 "text" 연산자를 사용하여 텍스트 검색을 수행할 수 있습니다. text 연산자는 검색 문자열을 가져와 텍스트 인덱스와 대조하여 관련 문서를 찾습니다.

  1. Cosmos DB 구문에 대한 텍스트 검색을 수행합니다.

    db.products.find(
        { $text: { $search: "Cosmos DB" } }
    )
    
  2. 필요에 따라 쿼리에 $meta 프로젝션 연산자를 textScore 필드와 함께 사용하여 가중치를 확인합니다.

    db.products.find(
        { $text: { $search: "Cosmos DB" } },
        { score: { $meta: "textScore" } }
    )
    

텍스트 인덱스 삭제

MongoDB에서 텍스트 인덱스를 삭제하려면 컬렉션에서 dropIndex() 메서드를 사용하고 제거할 텍스트 인덱스의 인덱스 키 또는 이름을 지정할 수 있습니다.

  1. 키를 명시적으로 지정하여 텍스트 인덱스를 삭제합니다.

    db.products.dropIndex({ title: "text" })
    
  2. 필요에 따라 자동 생성된 고유 이름을 지정하여 텍스트 인덱스 삭제합니다.

    db.products.dropIndex("title_text")
    

텍스트 인덱스 제한 사항

  • 컬렉션에 하나의 텍스트 인덱스만 정의할 수 있습니다.
  • 텍스트 인덱스는 간단한 텍스트 검색을 지원하며 정규식 검색과 같은 고급 검색 기능을 제공하지 않습니다.
  • Hint()는 $text 식을 사용하는 쿼리와 함께 지원되지 않습니다.
  • 정렬 작업은 MongoDB에서 텍스트 인덱스의 순서를 사용할 수 없습니다.
  • 텍스트 인덱스는 상대적으로 클 수 있으며 다른 인덱스 유형에 비해 상당한 스토리지 공간을 사용할 수 있습니다.

다음 단계