Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

$text

참고

MongoDB 향상된 전체 텍스트 검색 솔루션인MongoDB Search와 시맨틱 검색 솔루션인MongoDB Vector Search를 제공합니다. 연산자 $search $searchMeta대신, 또는 $vectorSearch 단계를 사용하는 것이 $text 좋습니다.

이 페이지에서는 자체 관리 배포를 위한 $text 연산자에 대해 설명합니다.

$text

$text 텍스트 인덱스로 인덱싱된 필드에 대해 텍스트 쿼리수행합니다.

다음 환경에서 호스팅되는 배포에 $text 사용할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

$text 표현식의 구문은 다음과 같습니다.

{
$text: {
$search: <string>,
$language: <string>,
$caseSensitive: <boolean>,
$diacriticSensitive: <boolean>
}
}

$text 연산자 이러한 필드를 허용합니다.

필드
유형
설명

$search

문자열

MongoDB 텍스트 인덱스 쿼리 위해 구문 분석하고 사용하는 용어의 문자열입니다. MongoDB는 정확한 문자열을 지정하지 않는 한 용어에 대해 논리적 OR 쿼리를 수행합니다. 자세한 내용은 동작 을 참조하세요.

$language

문자열

선택 사항. 중지 단어, 형태소 분석기 및 토크나이저 규칙을 결정하는 언어 입니다. 기본값은 인덱스 언어 입니다. 지원되는 언어는 자체 관리형 배포서버의 $text 쿼리 언어를 참조하세요.

default_language 값을 none으로 지정하면 텍스트 인덱스는 중단어(stop word)를 포함하여 필드에 있는 각 단어를 구문 분석하고 접미사 어간(stemming)은 무시합니다.

$caseSensitive

부울

선택 사항. 대소문자 구분을 활성화합니다. 기본값은 false입니다. 대소문자 구분 안 함을 참조하세요.

$diacriticSensitive

부울

선택 사항. 버전 3 텍스트 인덱스에 대해 발음 부호 민감도를 활성화합니다. 기본값은 false입니다. 이전 텍스트 인덱스 버전은 항상 발음 구별 부호를 구분합니다. 분음 부호 무시를 참조하세요.

기본값 으로 $text 는 점수별로 결과를 정렬하지 않습니다. 점수 정렬에 대한 자세한 내용은 텍스트 점수 를 참조하세요.

  • 쿼리 $text 표현식 하나만 지정할 수 있습니다.

  • $text $nor 표현식에 나타날 수 없습니다.

  • $text $elemMatch 쿼리 또는 프로젝션 표현식에 나타날 수 없습니다.

  • $text을(를) 사용하려면 모든 $or 절은 인덱싱되어야 합니다.

  • 쿼리에 $text 표현식이 포함된 경우 hint()를 사용하여 쿼리에 사용할 인덱스를 지정할 수 없습니다.

  • $text 이 포함된 쿼리는 $natural 정렬을 사용할 수 없습니다.

  • 특수 텍스트 인덱스가 필요한 $text 표현식과 다른 유형의 특수 인덱스가 필요한 쿼리 연산자를 결합할 수 없습니다. 예를 들어 $text 표현식을 $near 연산자와 결합할 수 없습니다.

  • 보기$text을(를) 지원하지 않습니다.

  • Stable API V1 는 인덱스 생성을 위한 $text 를 지원 하지 않습니다.

$text 연산자를 집계에 사용하는 경우 다음 제한 사항도 적용됩니다.

  • $text를 포함하는 $match 단계는 파이프라인의 첫 번째 단계여야 합니다.

  • $text 연산자는 단계에서 한 번만 나타날 수 있습니다.

  • $text 연산자 표현식은 $or 또는 $not 표현식에 나타날 수 없습니다.

  • $text기본적으로 일치하는 점수순으로 일치하는 문서를 반환하지 않습니다. 내림차순 점수를 기준으로 정렬하려면 $sort 단계에서 $meta 집계 표현식을 사용합니다.

$search 필드에 MongoDB가 텍스트 인덱스쿼리 데 사용하는 단어를 지정합니다.

참고

$search 필드 MongoDB Atlas $ 검색 집계 단계와 다릅니다. $search 단계는 전체 텍스트 검색 제공하며 MongoDB Atlas 에서만 사용할 수 있습니다.

개별 텀 대신 여러 단어로 구성된 정확한 string을 일치시키려면 다음과 같이 string을 이스케이프된 double(\")로 묶습니다.

"\"ssl certificate\""

$text 작업의 $search 문자열에 여러 단어로 된 문자열과 개별 용어가 포함된 경우 $text 는 여러 단어 문자열을 포함하는 문서와만 일치합니다.

예시 들어, 이 $search string은 정확한 string "ssl certificate"이 포함된 문서를 반환합니다.

"\"ssl certificate\" authority key"

단어를 부정하려면 단어 앞에 하이픈 빼기(-)를 붙입니다.

  • 부정 단어는 결과 설정하다 에서 부정 단어가 포함된 문서를 제외합니다.

  • 부정 단어만 있는 string은 문서와 일치하지 않습니다.

  • pre-market 과 같이 하이픈으로 연결된 단어는 부정이 아닙니다. MongoDB 하이픈을 구분 기호로 취급합니다. market을 부정하려면 pre -market를 사용합니다.

MongoDB 논리적 AND이 있는 작업에 모든 부정을 적용합니다.

MongoDB 영어에서 theand 와 같은 언어별 불용어를 무시합니다.

대소문자 및 분음 부호를 구분하지 않는 경우 $text 은 전체 어간 단어와 일치합니다. 문서 필드 에 blueberry이 포함되어 있으면 blue$search 텀 일치하지 않습니다. 그러나 blueberry 또는 blueberries 는 일치합니다.

대소문자 구분이 활성화된($caseSensitive: true) 상태에서 접미사 어간에 대문자가 포함되어 있으면 $text 이(가) 정확한 단어와 일치합니다.

분음 부호 민감도 를 활성화($diacriticSensitive: true)한 상태에서 접미사 어간에 분음 부호 표시가 포함되어 있으면 $text 가 정확한 단어와 일치합니다.

$text 기본값은 텍스트 인덱스의 대소문자를 구분하지 않습니다.

  • 버전 3 텍스트 인덱스 는 분음 부호가 있거나 없는 라틴 문자 및 키릴 문자와 같은 라틴 문자가 아닌 문자의 대소문자를 구분하지 않습니다.

  • 이전 버전에서는 분음 부호가 없는 라틴 문자([A-z])의 대소문자를 구분하지 않습니다.

텍스트 인덱스 대소문자를 구분하지 않는 경우 대소문자 구분을 활성화 하려면 $caseSensitive: true 를 지정합니다.

$caseSensitive: true 이고 텍스트 인덱스 대소문자를 구분하지 않는 경우 $text은 다음과 같습니다.

  • 대소문자를 구분하지 않는 일치 항목과 발음 부호를 구분하지 않는 일치 항목에 대한 텍스트 인덱스 쿼리합니다.

  • 지정된 대소문자와 일치하는 문서만 반환하도록 결과를 필터링합니다.

$caseSensitive: true 및 접미사 어간에 대문자가 포함된 경우 $text 는 정확한 단어와 일치합니다.

$caseSensitive: true 를 활성화하면 성능이 저하될 수 있습니다.

$text 기본값은 텍스트 인덱스의 분음 부호를 무시합니다.

  • 버전 3 텍스트 인덱스 는 분음 부호를 구분하지 않습니다. 인덱스 분음 부호가 있는 문자와 표시되지 않은 문자(é, ê, e)를 구분하지 않습니다.

  • 이전 버전은 발음 부호를 구분합니다.

버전 3 텍스트 인덱스에서 발음 부호 구분을 활성화 하려면 $diacriticSensitive: true 를 지정합니다.

이전 텍스트 인덱스 버전은 항상 분음 부호를 구분하므로 $diacriticSensitive 은 아무런 효과가 없습니다.

버전 3 텍스트 인덱스 및 $diacriticSensitive: true 사용 시, $text:

  • 분음 부호를 구분하지 않는 텍스트 인덱스 쿼리합니다.

  • 결과를 필터하여 지정된 텀의 발음 부호와 일치하는 문서만 반환합니다.

$diacriticSensitive: true 를 활성화하면 성능이 저하될 수 있습니다.

이전 텍스트 인덱스 버전에서는 $diacriticSensitive: true 가 이미 발음 구별 부호를 구분하는 텍스트 인덱스 쿼리합니다.

$diacriticSensitive: true 및 접미사 어간에 분음 부호가 포함된 경우 $text 는 정확한 단어와 일치합니다.

$text 연산자는 각 결과 문서에 점수를 할당합니다. 점수는 주어진 쿼리에 대한 문서의 관련성을 나타냅니다. 점수는 sort() 메서드 사양의 일부일 수도 있고 프로젝션 표현식의 일부일 수도 있습니다. { $meta: "textScore" } 표현식은 $text 작업 처리에 대한 정보를 제공합니다. $meta 프로젝션 연산자를 참조하여 프로젝션 또는 정렬을 위해 점수에 액세스하는 방법에 대한 자세한 내용을 확인하세요.

버전 8.3에서 변경되었습니다.

MongoDB 8.3 부터 쿼리 엔진 TextOr 단계 메모리 사용량을 메가바이트로 100 제한합니다. 단계는 텍스트 TextOr $text 점수 메타데이터 읽는 쿼리를 처리합니다. 예시TextOr 를 들어 는 텍스트 점수를 기준으로 결과를 정렬하는 쿼리를 처리합니다.TextOr 단계가 이 제한을 초과하는 경우:

  • allowDiskUsetrue인 경우 단계에서 중간 결과를 디스크로 유출합니다.

  • allowDiskUsefalse인 경우 메모리 제한 초과 오류와 함께 쿼리 실패합니다.

이전 버전에서는 TextOr 단계에 메모리 제한이 없었고 제한 없이 RAM 사용하여 메모리 부족(OOM) 오류가 발생할 위험이 있었습니다.

다음 예제에서는 subject버전 3 텍스트 인덱스가 있는 articles 컬렉션 사용합니다.

db.articles.createIndex( { subject: "text" } )

다음 문서로 컬렉션을 채웁니다.

db.articles.insertMany( [
{ _id: 1, subject: "coffee", author: "xyz", views: 50 },
{ _id: 2, subject: "Coffee Shopping", author: "efg", views: 5 },
{ _id: 3, subject: "Baking a cake", author: "abc", views: 90 },
{ _id: 4, subject: "baking", author: "xyz", views: 100 },
{ _id: 5, subject: "Café Con Leche", author: "abc", views: 200 },
{ _id: 6, subject: "Сырники", author: "jkl", views: 80 },
{ _id: 7, subject: "coffee and cream", author: "efg", views: 10 },
{ _id: 8, subject: "Cafe con Leche", author: "xyz", views: 10 }
] )

이 예시 $search 문자열에 coffee 를 지정합니다.

db.articles.find( { $text: { $search: "coffee" } } )

이렇게 하면 인덱싱된 subject 필드 에 coffee 의 어간 버전이 포함된 문서가 반환됩니다.

{ _id: 1, subject: 'coffee', author: 'xyz', views: 50 },
{ _id: 7, subject: 'coffee and cream', author: 'efg', views: 10 },
{ _id: 2, subject: 'Coffee Shopping', author: 'efg', views: 5 }

공백으로 구분된 $search 문자열은 각 텀 에 대해 논리적 OR 를 수행합니다. MongoDB 텀이 포함된 문서를 반환합니다.

이 예시 공백으로 구분된 세 개의 텀을 지정합니다.

db.articles.find( { $text: { $search: "bake coffee cake" } } )

이렇게 하면 인덱싱된 subject 필드에 bake 또는 coffee 또는 cake 의 어간 버전이 포함된 문서가 반환됩니다.

{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg", "views" : 5 }
{ "_id" : 7, "subject" : "coffee and cream", "author" : "efg", "views" : 10 }
{ "_id" : 1, "subject" : "coffee", "author" : "xyz", "views" : 50 }
{ "_id" : 3, "subject" : "Baking a cake", "author" : "abc", "views" : 90 }
{ "_id" : 4, "subject" : "baking", "author" : "xyz", "views" : 100 }

여러 단어로 구성된 정확한 문자열과 일치하도록 따옴표를 이스케이프 처리합니다.

이 예시 정확한 string coffee shop과 일치합니다.

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

이 작업은 coffee shop 문자열이 포함된 문서를 반환합니다.

{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg", "views" : 5 }

이 예시 두 개의 정확한 문자열에 대해 논리적 OR을 수행합니다.

db.articles.find( { $text: { $search: "\'coffee shop\' \'Cafe con Leche\'" } } )

이렇게 하면 두 string의 텀이 포함된 문서를 포함하여 두 string 중 하나를 포함하는 문서가 반환됩니다.

[
{ _id: 8, subject: 'Cafe con Leche', author: 'xyz', views: 10 },
{ _id: 5, subject: 'Café Con Leche', author: 'abc', views: 200 },
{ _id: 1, subject: 'coffee', author: 'xyz', views: 50 },
{ _id: 7, subject: 'coffee and cream', author: 'efg', views: 10 },
{ _id: 2, subject: 'Coffee Shopping', author: 'efg', views: 5 }
]

해당 텀 포함된 문서를 제외하려면 텀 앞에 - 을 붙입니다.

이 예시 coffee 를 포함하지만 shop 는 포함하지 않는 문서(어간 버전)와 일치합니다.

db.articles.find( { $text: { $search: "coffee -shop" } } )

이 작업은 다음 문서를 반환합니다.

{ "_id" : 7, "subject" : "coffee and cream", "author" : "efg", "views" : 10 }
{ "_id" : 1, "subject" : "coffee", "author" : "xyz", "views" : 50 }

$language 를 사용하여 $search string에 대한 중지 단어, 형태소 분석기 및 토크나이저 규칙을 결정하는 언어 지정합니다.

default_language 값을 none으로 지정하면 텍스트 인덱스는 중단어(stop word)를 포함하여 필드에 있는 각 단어를 구문 분석하고 접미사 어간(stemming)은 무시합니다.

이 예시 es (스페인어)를 언어 로 지정합니다.

db.articles.find(
{ $text: { $search: "leche", $language: "es" } }
)

이번 예시에서는 다음 문서를 반환합니다.

{ "_id" : 5, "subject" : "Café Con Leche", "author" : "abc", "views" : 200 }
{ "_id" : 8, "subject" : "Cafe con Leche", "author" : "xyz", "views" : 10 }

spanish와 같이 이름으로 언어를 지정할 수도 있습니다. 지원되는 언어는 자체 관리형 배포서버의 $text 쿼리 언어 를 참조하세요.

$text 기본값은 텍스트 인덱스 의 대소문자와 분음 부호를 구분하지 않습니다. 버전 3 텍스트 인덱스는 분음 부호가 있는 라틴 문자 및 키릴 문자와 같은 라틴 문자가 아닌 문자에 대해 분음 부호를 구분하지 않고 대소문자를 구분하지 않습니다. 대소문자 구분 없이 인덱스 인덱스발음 구별 부호 무시하기 텍스트를 참조하세요.

이 예시 대소문자 및 분음 부호를 구분하지 않는 쿼리 수행합니다.

db.articles.find( { $text: { $search: "сы́рники CAFÉS" } } )

버전 3 텍스트 인덱스를 사용하면 다음과 일치합니다.

{ "_id" : 6, "subject" : "Сырники", "author" : "jkl", "views" : 80 }
{ "_id" : 5, "subject" : "Café Con Leche", "author" : "abc", "views" : 200 }
{ "_id" : 8, "subject" : "Cafe con Leche", "author" : "xyz", "views" : 10 }

이전 텍스트 인덱스 버전은 어떤 문서와도 일치하지 않습니다.

$caseSensitive: true로 대소문자 구분을 활성화합니다. 이로 인해 성능이 저하될 수 있습니다.

이 예시 Coffee에 대해 대소문자를 구분하는 쿼리 수행합니다.

db.articles.find( { $text: { $search: "Coffee", $caseSensitive: true } } )

이는 다음과만 일치합니다.

{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg", "views" : 5 }

이 예시 정확한 여러 단어로 구성된 string에 대해 대소문자를 구분하는 쿼리 수행합니다.

db.articles.find( {
$text: { $search: "\"Café Con Leche\"", $caseSensitive: true }
} )

이는 다음과만 일치합니다.

{ "_id" : 5, "subject" : "Café Con Leche", "author" : "abc", "views" : 200 }

부정 텀(텀 - 접두사)에는 사용 사례 수 있습니다.

이 예시 Coffee 는 포함하지만 shop 은 포함하지 않는 문서(어간 버전)에 대해 대소문자를 구분하는 쿼리 수행합니다.

db.articles.find( { $text: { $search: "Coffee -shop", $caseSensitive: true } } )

이는 다음과 일치합니다:

{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg" }

$diacriticSensitive: true을 사용하여 버전 3 텍스트 인덱스에서 발음 부호 구분을 활성화합니다. 이로 인해 성능이 저하될 수 있습니다.

이 예시 CAFÉ (어간 버전)에 대해 발음 부호 구분 쿼리 수행합니다.

db.articles.find( { $text: { $search: "CAFÉ", $diacriticSensitive: true } } )

이는 다음과만 일치합니다.

{ "_id" : 5, "subject" : "Café Con Leche", "author" : "abc" }

부정 텀(텀에 - 접두사가 붙음)에는 분음 부호 구분을 사용할 수 있습니다.

이 예시 leches 는 포함하지만 cafés 는 포함하지 않는 문서(어간 버전)에 대해 발음 부호 구분 쿼리 수행합니다.

db.articles.find(
{ $text: { $search: "leches -cafés", $diacriticSensitive: true } }
)

이는 다음과 일치합니다:

{ "_id" : 8, "subject" : "Cafe con Leche", "author" : "xyz" }

이 예시에서는 cake 를 쿼리하고 $meta 을 사용하여 일치하는 각 문서에 관련성 점수를 추가합니다.

db.articles.find(
{ $text: { $search: "cake" } },
{ score: { $meta: "textScore" } }
)

반환된 문서 관련성 점수가 포함된 score 필드 포함되어 있습니다.

{ "_id" : 3, "subject" : "Baking a cake", "author" : "abc", "views" : 90, "score" : 0.75 }
  • 프로젝션에서 표현식을 지정하지 않고도 sort()에서 { $meta: "textScore" } 표현식을 지정할 수 있습니다. 예를 들면 다음과 같습니다.

    db.articles.find(
    { $text: { $search: "cake" } }
    ).sort( { score: { $meta: "textScore" } } )

    따라서 textScore를 투영하지 않고도 관련성을 기준으로 결과 문서를 정렬할 수 있습니다.

  • { $meta: "textScore" } 표현식을 프로젝션sort()에 모두 포함하면 프로젝션 및 정렬 문서에서 표현식에 대해 서로 다른 필드 이름을 가질 수 있습니다.

    For example, in the following operation, the projection uses a field named score for the expression and the sort() uses the field named ignoredName.
    db.articles.find(
    { $text: { $search: "cake" } } ,
    { score: { $meta: "textScore" } }
    ).sort( { ignoredName: { $meta: "textScore" } } )

limit()sort() 와 함께 사용하면 일치하는 상위 문서를 반환할 수 있습니다.

이 예시 에서는 coffee를 쿼리하고, 점수를 내림차순으로 정렬하며, 결과를 상위 두 문서로 제한합니다.

db.articles.find(
{ $text: { $search: "coffee" } },
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } ).limit(2)

이 예시 author"xyz" 이고 subjectcoffee 또는 bake가 포함된 문서와 일치합니다. date 오름차순으로 정렬한 다음 관련성 점수를 내림차순으로 정렬합니다.

db.articles.find(
{ author: "xyz", $text: { $search: "coffee bake" } },
{ score: { $meta: "textScore" } }
).sort( { date: 1, score: { $meta: "textScore" } } )

돌아가기

$text 쿼리 연산자

이 페이지의 내용