참고
이 페이지에서는 자체 관리(비Atlas) 배포를 위한 텍스트 쿼리 기능에 대해 설명합니다. MongoDB Atlas 에서 호스팅되는 데이터의 경우, MongoDB 향상된 전체 텍스트 쿼리 솔루션인Atlas Search 와 벡터 검색 솔루션인Atlas Vector Search 제공합니다.
이 페이지에서는 자체 관리 배포가 가능한 $text 연산자에 대해 설명합니다.
정의
$text$text텍스트 인덱스 로 인덱싱된 필드에 텍스트 쿼리 수행합니다.
호환성
다음 환경에서 호스팅되는 배포에 $text 사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
구문
$text 표현식의 구문은 다음과 같습니다.
{ $text: { $search: <string>, $language: <string>, $caseSensitive: <boolean>, $diacriticSensitive: <boolean> } }
$text 연산자 이러한 필드를 허용합니다.
필드 | 유형 | 설명 |
|---|---|---|
| 문자열 | |
| 문자열 | 선택 사항. 중지 단어, 형태소 분석기 및 토크나이저 규칙을 결정하는 언어 입니다. 기본값은 인덱스 언어 입니다. 지원되는 언어는 자체 관리 배포서버의 텍스트 검색 언어를 참조하세요.
|
| 부울 | 선택 사항. 대소문자 구분을 활성화합니다. 기본값은 |
| 부울 | 3 선택 사항. 버전 텍스트 인덱스에 대해 발음 부호 민감도를 활성화합니다. 기본값은 입니다. |
기본값 으로 는 점수별로$text 결과를 정렬하지 않습니다. 점수 정렬에 대한 자세한 내용은 텍스트 점수를 참조하세요.
행동
제한 사항
쿼리
$text표현식 하나만 지정할 수 있습니다.$text$nor표현식에 나타날 수 없습니다.$text쿼리 또는 프로젝션 표현식에$elemMatch나타날 수 없습니다.를
$or사용하려면 모든 절을 인덱싱해야$text합니다.쿼리에
$text표현식이 포함된 경우hint()를 사용하여 쿼리에 사용할 인덱스를 지정할 수 없습니다.이 포함된 쿼리는 정렬을
$text$natural사용할 수 없습니다.특수 텍스트 인덱스가 필요한
$text표현식과 다른 유형의 특수 인덱스가 필요한 쿼리 연산자를 결합할 수 없습니다. 예를 들어$text표현식을$near연산자와 결합할 수 없습니다.보기는
$text을(를) 지원하지 않습니다.Stable API V1 는
$text인덱스 생성을 위한 를 지원 하지 않습니다.
$text 연산자를 집계에 사용하는 경우 다음 제한 사항도 적용됩니다.
$search 필드
필드에 $search MongoDB 텍스트 인덱스 쿼리 데 사용하는 단어를 지정합니다.
참고
$search 필드 MongoDB Atlas $ 검색 집계 단계와 다릅니다.$search 단계는 전체 텍스트 검색 제공하며 MongoDB Atlas 에서만 사용할 수 있습니다.
정확한 문자열
개별 용어 대신 여러 단어로 구성된 정확한 문자열을 일치시키려면 다음과 같이 문자열을 이스케이프된 큰따옴표(\")로 묶습니다.
"\"ssl certificate\""
$text 작업의 $search 문자열에 여러 단어로 된 문자열과 개별 용어가 포함된 경우 $text 는 여러 단어 문자열을 포함하는 문서와만 일치합니다.
예시 들어, 이 $search 문자열은 정확한 문자열 "ssl certificate"이 포함된 문서를 반환합니다.
"\"ssl certificate\" authority key"
부정
단어를 부정하려면 단어 앞에 하이픈 빼기(-)를 붙입니다.
부정 단어는 결과 설정하다 에서 부정 단어가 포함된 문서를 제외합니다.
부정 단어만 있는 문자열은 문서와 일치하지 않습니다.
pre-market과 같이 하이픈으로 연결된 단어는 부정이 아닙니다. MongoDB 하이픈을 구분 기호로 취급합니다.market을 부정하려면pre -market를 사용합니다.
MongoDB 논리적 AND이 있는 연산에 모든 부정을 적용합니다.
매치 작업
중지 단어
MongoDB 영어에서 the 및 and 와 같은 언어별 불용어를 무시합니다.
어간 단어
대소문자 및 분음 부호를 구분하지 않는 경우 은$text 전체 어간 단어와 일치합니다. 문서 필드 에 이 포함되어 blueberry 있으면 $search 의 blue 텀 일치하지 않습니다. 그러나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 프로젝션 연산자를 참조하여 프로젝션 또는 정렬을 위해 점수에 액세스하는 방법에 대한 자세한 내용을 확인하세요.
예시
다음 예제에서는 에 articles 버전 3 텍스트 인덱스 가 있는 컬렉션 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 } ] )
단일 단어 검색
이 예시 $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" } } )
이렇게 하면 인덱싱된 필드 에 bake 또는 또는 의 어간 버전이 포함된 문서가 coffee cake subject 반환됩니다.
{ "_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 }
이 예시 두 개의 정확한 문자열에 대해 논리적 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 } ]
용어가 포함된 문서 제외
해당 텀 포함된 문서를 제외하려면 텀 앞에 - 을 붙입니다.
이 예시 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 문자열에 대한 중지 단어, 형태소 분석기 및 토크나이저 규칙을 결정하는 언어 지정합니다.
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 기본값은 텍스트 인덱스 의 대소문자와 분음 부호를 구분하지 않습니다. 버전 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 }
대소문자 구분 정확한 문자열 검색
이 예시 정확한 여러 단어로 구성된 문자열에 대해 대소문자를 구분하는 쿼리 수행합니다.
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" }
발음 구별 기호 인식
을 사용하여 버전 텍스트 인덱스에서 발음 부호 구분을 3 $diacriticSensitive: true 활성화합니다. 이로 인해 성능이 저하될 수 있습니다.
분음 부호 구분 용어 검색
이 예시 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 namedscorefor the expression and thesort()uses the field namedignoredName.db.articles.find( { $text: { $search: "cake" } } , { score: { $meta: "textScore" } } ).sort( { ignoredName: { $meta: "textScore" } } )
일치하는 문서 상위 2개 반환
limit() 를 와 sort() 함께 사용하면 일치하는 상위 문서를 반환할 수 있습니다.
이 예시 에서는 coffee를 쿼리하고, 점수를 내림차순으로 정렬하며, 결과를 상위 두 문서로 제한합니다.
db.articles.find( { $text: { $search: "coffee" } }, { score: { $meta: "textScore" } } ).sort( { score: { $meta: "textScore" } } ).limit(2)
$text를 다른 쿼리 및 정렬 작업과 결합하기
이 예시 author 이 "xyz" 이고 subject 에 coffee 또는 bake가 포함된 문서와 일치합니다. date 오름차순으로 정렬한 다음 관련성 점수를 내림차순으로 정렬합니다.
db.articles.find( { author: "xyz", $text: { $search: "coffee bake" } }, { score: { $meta: "textScore" } } ).sort( { date: 1, score: { $meta: "textScore" } } )