Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

$text(자체 관리 배포서버)

이 페이지의 내용

  • 정의
  • 호환성
  • 구문
  • 행동
  • 예시

참고

이 페이지에서는 자체 관리(비Atlas) 배포를 위한 텍스트 쿼리 기능에 대해 설명합니다. MongoDB Atlas 에서 호스팅되는 데이터의 경우, MongoDB 는 향상된 전체 텍스트 쿼리 솔루션인Atlas Search 와 벡터 검색 솔루션인Atlas Vector Search 를 제공합니다.

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

$text

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

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

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

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

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

$text 연산자는 다음 필드에서 텍스트 쿼리 문서를 허용합니다.

필드
유형
설명
$search
문자열
MongoDB가 구문을 분석하고 텍스트 인덱스를 쿼리하는 데 사용하는 용어 문자열입니다. 텀을 구문으로 지정하지 않는 한 MongoDB는 텀에 대해 논리적 OR 쿼리를 수행합니다. 필드에 대한 자세한 내용은 동작을 참조하세요.
$language
문자열

선택 사항 쿼리에 대한 중지 단어 목록과 형태소 분석기 및 토크나이저에 대한 규칙을 결정하는 언어입니다. 지정하지 않으면 MongoDB는 인덱스의 기본 언어를 사용합니다. 지원되는 언어는 자체 관리형 배포서버의 텍스트 검색 언어를 참조하세요.

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

$caseSensitive
부울

선택 사항입니다. 대/소문자 구분을 활성화 또는 비활성화할 수 있는 부울 플래그입니다. 기본값은 false입니다. 지정하지 않으면 MongoDB는 텍스트 인덱스의 대소문자 구분을 따릅니다.

자세한 내용은 대소문자 구분 안 함을 참조하세요.

$diacriticSensitive
부울

선택 사항입니다. 버전 3 텍스트 인덱스에 대해 발음 구분 민감성을 활성화하거나 비활성화하는 부울 플래그입니다. 기본값은 false입니다. 지정하지 않은 경우 MongoDB는 텍스트 인덱스의 발음 구분 민감성을 따릅니다.

이전 버전의 텍스트 인덱스에 대한 텍스트 쿼리는 본질적으로 분음 부호에 민감하며, 분음 부호를 무시할 수 없습니다. 따라서 text 인덱스의 이전 버전에서는 $diacriticSensitive 옵션이 적용되지 않습니다.

자세한 내용은 발음 구별 기호 무시를 참조하세요.

$text 연산자는 기본적으로 결과의 점수에 따라 정렬된 결과를 반환하지 않습니다. 결과 점수를 기준으로 정렬하는 방법에 대한 자세한 내용은 텍스트 점수 문서를 참조하세요.

  • 쿼리는 최대 하나의 $text 표현식을 지정할 수 있습니다.

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

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

  • $or 표현식에서 $text를 사용하려면 $or 배열의 모든 절을 인덱싱해야 합니다.

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

  • 쿼리에 $text 표현식이 포함된 경우 $natural 정렬 순서를 지정할 수 없습니다.

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

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

  • $text Stable API V1을 사용하여 인덱스를 만들 때 지원되지 않습니다.

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

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

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

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

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

$search 필드에서 $text 연산자가 구문 분석하고 텍스트 인덱스를 쿼리하는 데 사용하는 단어 문자열을 지정합니다.

$text 연산자는 용어를 부정하는 하이픈 빼기(-)나 구를 지정하는 이스케이프된 큰따옴표 \" 제외하고 문자열의 대부분의 문장 부호를 구분 기호로 처리합니다.

참고

$search $text 표현식의 필드는 Atlas Search에서 제공하는 $search 집계 단계와 다릅니다. $search 집계 단계는 지정된 필드에서 전체 텍스트 검색을 수행하며 MongoDB Atlas에서만 사용할 수 있습니다.

개별 용어가 아닌 구를 일치시키려면 다음과 같이 구를 이스케이프된 큰따옴표(\")로 묶습니다.

"\"ssl certificate\""

$text 연산의 $search 문자열에 구와 개별 용어가 포함된 경우 $text는 해당 구가 포함된 문서에만 일치합니다.

예를 들어 $search 문자열을 전달하였습니다.

"\"ssl certificate\" authority key"

$text 연산자는 "ssl certificate" 구문이 포함된 문서를 반환합니다.

참고

$text 연산자를 여러 문구와 함께 사용할 수 없습니다.

단어 앞에 하이픈 마이너스(-)를 붙이면 단어가 부정됩니다.

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

  • 부정 단어만 포함된 문자열이 전달되면 $text는 어떤 문서와도 일치하지 않습니다.

  • pre-market 과 같이 하이픈으로 연결된 단어는 부정이 아닙니다. 하이픈을 넣은 단어에 사용되는 경우 $text 연산자는 하이픈 빼기(-)를 구분 기호로 처리합니다. 이 인스턴스에서 market 단어를 부정하려면 pre-market 사이의 공백, 즉 pre -market을 포함합니다.

$text 연산자는 논리적 AND 연산자와 함께 모든 부정을 연산에 추가합니다.

$text 연산자는 영어의 theand 같은 언어별 불용어를 무시합니다.

대소문자 구분을 사용하지 않고 발음 구별 기호 인식도 사용하지 않을 때 $text 연산자는 완전히 어간 추출된 단어와 일치합니다. 문서 필드에 단어 blueberry가 포함되어 있는 경우 $search 항목이 blue$text 작업은 일치하지 않습니다. 그러나 blueberry 또는 blueberries는 일치합니다.

사용 사례($caseSensitive: true)을 사용할 때, 접미사의 어간에 대문자가 포함되어 있으면 $text 연산자는 정확한 단어와 일치합니다.

발음 구별 기호 인식($diacriticSensitive: true)을 사용하는 경우 접미사 어간에 발음 구별 기호가 하나 이상 포함되어 있으면 $text 연산자는 정확한 단어와 일치합니다.

$text 연산자는 기본적으로 텍스트 인덱스의 대소문자를 구분하지 않습니다.

  • 버전 3 텍스트 인덱스는 분음 부호가 있거나 없는 라틴 문자와 키릴 문자 같은 라틴 알파벳이 아닌 문자의 경우 대소문자를 구분하지 않습니다. 자세한 내용은 텍스트 인덱스를 참조하십시오.

  • 이전 버전의 text 색인은 발음 구별 부호가 없는 라틴 문자의 경우 대소문자를 구분하지 않습니다. 즉, [A-z]입니다.

text 인덱스가 대소문자를 구분하지 않는 경우 대소문자 구분 검색을 지원하려면 $caseSensitive: true를 지정합니다.

$caseSensitive: truetext 인덱스가 대소문자를 구분하지 않는 경우 $text 연산자는 다음과 같습니다.

  • 먼저 text 인덱스에서 대소문자를 구분하지 않고 발음 구별 부호가 일치하는지 쿼리합니다.

  • 그런 다음 지정된 용어의 대소문자와 일치하는 문서만 반환하기 위해 $text 작업은 지정된 대소문자와 일치하지 않는 문서를 필터링하는 추가 단계가 포함됩니다.

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

$caseSensitive: true 을(를) 지정하면 성능에 영향을 줄 수 있습니다.

다음도 참조하세요.

$text 연산자는 기본적으로 텍스트 인덱스의 발음 기호 부호를 구분하지 않습니다.

  • 버전 3 텍스트 인덱스는 발음 구별 기호를 구분하지 않습니다. 즉, 색인은 분음 부호를 포함하는 문자와 표시되지 않은 문자 (예: é, ê, e)를 구분하지 않습니다.

  • 이전 버전의 text 인덱스는 발음 구별 기호를 구분합니다.

text 인덱스에 대해 분음 부호 민감도를 지원하려면 $diacriticSensitive: true를 지정합니다.

이전 버전의 text 인덱스에 대한 텍스트 검색은 기본적으로 분음 부호를 구분하며 분음 부호를 구분하지 않을 수 없습니다. 따라서 $text 연산자에 대한 $diacriticSensitive 옵션은 이전 버전의 text 인덱스에는 영향을 주지 않습니다.

버전 3 text 인덱스에 대해 분음 부호 구분을($diacriticSensitive: true) 사용하려면 $text 연산자는 다음을 수행합니다.

  • 먼저 발음 구별 기호를 인식하지 않는 text 인덱스를 쿼리합니다.

  • 그런 다음 지정된 텀의 발음 구별 기호로 표시된 문자와 일치하는 문서만 반환하기 위해 $text 작업에는 일치하지 않는 문서를 필터링하는 추가 단계가 포함되어 있습니다.

$diacriticSensitive: true 을(를) 지정하면 성능에 영향을 줄 수 있습니다.

이전 버전의 text 인덱스와 함께 $diacriticSensitive: true를 사용하는 경우 $text 연산자는 분음 부호를 구분하는 text 인덱스를 쿼리합니다.

$diacriticSensitive: true이고 접미사 어간에 발음 구별 호가 포함된 경우 $text 연산자는 정확한 단어와 일치합니다.

다음도 참조하세요.

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

다음 예시에서는 articles 필드에 버전 3 텍스트 인덱스가 있는 collection이 있다고 subject 가정합니다.

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 }
] )

다음 예시는 coffee$search 문자열을 지정합니다.

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 문자열이 공백으로 구분된 문자열인 경우 $text는 각 용어에 대해 논리적 OR 연산을 수행하고 해당 용어 중 하나라도 포함하는 문서를 반환합니다.

다음 예시는 공백으로 구분된 세 개의 텀 "bake coffee cake"로 구성된 $search 문자열을 지정합니다.

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 }

다음도 참조하세요.

정확한 구를 단일 용어로 일치시키려면 따옴표를 이스케이프합니다.

다음 예시는 coffee shop 구문과 일치합니다.

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

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

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

다음 예시는 coffee shopCafe con Leche 구문과 일치합니다. 이것은 두 구문의 논리적 OR입니다.

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

이 작업은 두 구의 용어가 포함된 문서를 포함하여 두 구를 모두 포함하는 문서를 반환합니다.

[
{ _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 }
]

다음도 참조하세요.

부정 용어는 빼기 기호 - 접두사가 붙는 용어입니다. 용어를 부정하는 경우 $text 연산자는 해당 용어가 포함된 문서를 결과에서 제외합니다.

다음 예시에서는 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 }

다음도 참조하세요.

$text 표현식의 선택 항목인 $language 필드를 사용하여 $search 문자열의 중지 단어 목록을 결정하는 언어 및 어간과 토크나이저 규칙을 지정합니다.

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 }

$text 표현식은 spanish라는 이름으로 해당 언어를 사용할 수도 있습니다. 지원되는 언어는 자체 관리 배포서버에서 텍스트 검색을 참조하세요.

다음도 참조하세요.

$text 연산자는 text 인덱스의 대소문자 및 발음 구별 기호를 고려하지 않습니다. 3버전 text 인덱스는 대소문자를 구분하지 않으며, 대소문자를 구분하지 않는 범위를 확장하여 키릴 문자와 대소문자가 있는 문자를 포함합니다. 자세한 내용은 텍스트 인덱스 대소문자 구분 무시텍스트 인덱스 발음 구별 기호 무시에서 확인하세요.

다음 예제에서는 сы́рники 또는 CAFÉS용어에 대해 대소문자 및 발음 구별 기호를 구분하지 않는 텍스트 쿼리를 수행합니다.

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

버전 3 text 인덱스를 사용하여 작업은 다음 문서와 일치합니다.

{ "_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 }

이전 버전의 text 인덱스에서는 쿼리가 어떤 문서와도 일치하지 않습니다.

대소문자 구분을 활성화하려면 $caseSensitive: true을(를) 지정합니다. $caseSensitive: true을(를) 지정하면 성능에 영향을 줄 수 있습니다.

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

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

이 작업은 다음 문서와 일치합니다.

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

다음 예시는 Café Con Leche 구문에 대해 대소문자를 구분하는 쿼리를 수행합니다.

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

이 작업은 다음 문서와 일치합니다.

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

부정 용어는 빼기 기호 - 접두사가 붙는 용어입니다. 용어를 부정하는 경우 $text 연산자는 해당 용어가 포함된 문서를 결과에서 제외합니다. 부정 용어에 대소문자 구분을 지정할 수도 있습니다.

다음 예시에서는 Coffee 단어는 포함하지만 소문자 shop, 더 정확하게는 단어의 어간 버전은 포함하지 않는 문서에 대해 대소문자를 구분하여 쿼리합니다.

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

이작업은 다음 문서 와 일치합니다.

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

다음도 참조하세요.

버전 3 텍스트 인덱스에서 부호 구분 기능을 활성화하려면 $diacriticSensitive: true를 지정하세요. $diacriticSensitive: true를 지정하면 성능에 영향을 줄 수 있습니다.

다음 예제는 용어 CAFÉ에 대한 발음 구별 기호 인식 텍스트 쿼리를 수행하며, 더 정확히는 어간 추출 단어에 대한 쿼리를 수행합니다.

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

이 작업은 다음 문서와만 일치합니다.

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

$diacriticSensitive 옵션은 부정 용어에도 적용됩니다. 부정 용어는 빼기 기호 - 접두사가 붙는 용어입니다. 용어를 부정하는 경우 $text 연산자는 해당 용어가 포함된 문서를 결과에서 제외합니다.

다음 예시는 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()와 함께 사용하여 일치하는 상위 n개 문서를 반환합니다.

다.다음 예시는 용어 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" } } )

돌아가기

텍스트 검색 연산자

이 페이지의 내용