$text(자체 관리 배포서버)
참고
이 페이지에서는 자체 관리(비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
연산자는 다음 필드에서 텍스트 쿼리 문서를 허용합니다.
필드 | 유형 | 설명 |
---|---|---|
$search | 문자열 | |
$language | 문자열 | 선택 사항 쿼리에 대한 중지 단어 목록과 형태소 분석기 및 토크나이저에 대한 규칙을 결정하는 언어입니다. 지정하지 않으면 MongoDB는 인덱스의 기본 언어를 사용합니다. 지원되는 언어는 자체 관리형 배포서버의 텍스트 검색 언어를 참조하세요.
|
$caseSensitive | 부울 | 선택 사항입니다. 대/소문자 구분을 활성화 또는 비활성화할 수 있는 부울 플래그입니다. 기본값은 자세한 내용은 대소문자 구분 안 함을 참조하세요. |
$diacriticSensitive | 부울 | 선택 사항입니다. 버전 3 텍스트 인덱스에 대해 발음 구분 민감성을 활성화하거나 비활성화하는 부울 플래그입니다. 기본값은 이전 버전의 텍스트 인덱스에 대한 텍스트 쿼리는 본질적으로 분음 부호에 민감하며, 분음 부호를 무시할 수 없습니다. 따라서 자세한 내용은 발음 구별 기호 무시를 참조하세요. |
$text
연산자는 기본적으로 결과의 점수에 따라 정렬된 결과를 반환하지 않습니다. 결과 점수를 기준으로 정렬하는 방법에 대한 자세한 내용은 텍스트 점수 문서를 참조하세요.
행동
제한 사항
쿼리는 최대 하나의
$text
표현식을 지정할 수 있습니다.$text
$nor
표현식에 나타날 수 없습니다.$text
는$elemMatch
쿼리 표현식 또는$elemMatch
프로젝션 표현식에 표시될 수 없습니다.쿼리에
$text
표현식이 포함된 경우hint()
를 사용하여 쿼리에 사용할 인덱스를 지정할 수 없습니다.쿼리에
$text
표현식이 포함된 경우$natural
정렬 순서를 지정할 수 없습니다.특수 텍스트 인덱스가 필요한
$text
표현식과 다른 유형의 특수 인덱스가 필요한 쿼리 연산자를 결합할 수 없습니다. 예를 들어$text
표현식을$near
연산자와 결합할 수 없습니다.보기는
$text
을(를) 지원하지 않습니다.$text
Stable API V1을 사용하여 인덱스를 만들 때 지원되지 않습니다.
$text
연산자를 집계에 사용하는 경우 다음 제한 사항도 적용됩니다.
$search
필드
$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
연산자는 영어의 the
및 and
같은 언어별 불용어를 무시합니다.
어간 단어
대소문자 구분을 사용하지 않고 발음 구별 기호 인식도 사용하지 않을 때 $text
연산자는 완전히 어간 추출된 단어와 일치합니다. 문서 필드에 단어 blueberry
가 포함되어 있는 경우 $search
항목이 blue
인 $text
작업은 일치하지 않습니다. 그러나 blueberry
또는 blueberries
는 일치합니다.
대소문자 구분 및 어간 추출
사용 사례($caseSensitive: true
)을 사용할 때, 접미사의 어간에 대문자가 포함되어 있으면 $text
연산자는 정확한 단어와 일치합니다.
발음 구별 기호 인식 및 어간 단어
발음 구별 기호 인식($diacriticSensitive: true
)을 사용하는 경우 접미사 어간에 발음 구별 기호가 하나 이상 포함되어 있으면 $text
연산자는 정확한 단어와 일치합니다.
대소문자 구분 안 함
$text
연산자는 기본적으로 텍스트 인덱스의 대소문자를 구분하지 않습니다.
버전 3 텍스트 인덱스는 분음 부호가 있거나 없는 라틴 문자와 키릴 문자 같은 라틴 알파벳이 아닌 문자의 경우 대소문자를 구분하지 않습니다. 자세한 내용은 텍스트 인덱스를 참조하십시오.
이전 버전의
text
색인은 발음 구별 부호가 없는 라틴 문자의 경우 대소문자를 구분하지 않습니다. 즉,[A-z]
입니다.
$caseSensitive
옵션
text
인덱스가 대소문자를 구분하지 않는 경우 대소문자 구분 검색을 지원하려면 $caseSensitive: true
를 지정합니다.
대소문자 구분 프로세스
$caseSensitive: true
및 text
인덱스가 대소문자를 구분하지 않는 경우 $text
연산자는 다음과 같습니다.
먼저
text
인덱스에서 대소문자를 구분하지 않고 발음 구별 부호가 일치하는지 쿼리합니다.그런 다음 지정된 용어의 대소문자와 일치하는 문서만 반환하기 위해
$text
작업은 지정된 대소문자와 일치하지 않는 문서를 필터링하는 추가 단계가 포함됩니다.
$caseSensitive: true
이고 접미사 어간에 대문자가 포함된 경우 $text
연산자는 정확한 단어와 일치합니다.
$caseSensitive: true
을(를) 지정하면 성능에 영향을 줄 수 있습니다.
발음 구별 기호 무시
$text
연산자는 기본적으로 텍스트 인덱스의 발음 기호 부호를 구분하지 않습니다.
버전 3 텍스트 인덱스는 발음 구별 기호를 구분하지 않습니다. 즉, 색인은 분음 부호를 포함하는 문자와 표시되지 않은 문자 (예:
é
,ê
,e
)를 구분하지 않습니다.이전 버전의
text
인덱스는 발음 구별 기호를 구분합니다.
$diacriticSensitive
옵션
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 } ] )
$text
단일 단어로
다음 예시는 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
용어 중 하나와 일치
$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 }
$text
구문으로
정확한 구를 단일 용어로 일치시키려면 따옴표를 이스케이프합니다.
다음 예시는 coffee shop
구문과 일치합니다.
db.articles.find( { $text: { $search: "\"coffee shop\"" } } )
이 작업은 coffee shop
구문이 포함된 문서를 반환합니다.
{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg", "views" : 5 }
다음 예시는 coffee shop
및 Cafe
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 namedscore
for the expression and thesort()
uses the field namedignoredName
.db.articles.find( { $text: { $search: "cake" } } , { score: { $meta: "textScore" } } ).sort( { ignoredName: { $meta: "textScore" } } )
일치하는 문서 상위 2개 반환
limit()
메서드를 sort()
와 함께 사용하여 일치하는 상위 n
개 문서를 반환합니다.
다.다음 예시는 용어 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" } } )