텍스트 검색 사용
MongoDB와 호환되는 Firestore의 텍스트 검색 기능을 사용하여 컬렉션 내에서 특정 문자열을 검색합니다.
시작하기 전에
텍스트 검색을 사용하기 전에 다음을 실행하세요.
기존 MongoDB 호환 작업 데이터베이스에 액세스할 수 있는지 확인하거나 데이터베이스를 만들고 연결합니다.
텍스트 색인이 있는지 확인하거나 텍스트 색인을 만듭니다.
텍스트 검색 실행
텍스트 검색은 필터 내에서 $text 연산자를 사용합니다.
$search 인수에 쿼리된 문자열을 지정합니다.
일반 텍스트 검색 실행
다음 명령어를 실행하여 일반 텍스트 검색을 실행합니다.
# Find search
db.cities.find({ $text: { $search: "french bread" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "french bread" } } }
]);
색인이 분할된 경우 검색 내에서 'and' 동일성 필터에 파티션을 포함하여 파티션을 기준으로 필터링할 수 있습니다.
예를 들어 city 파티션이 있는 경우 다음과 같이 텍스트 검색을 필터링할 수 있습니다.
db.myCollection.find( { $and: [
{ $text: { $search: "french bread" } },
{ "city": "Paris" }
] } )
파티션을 기준으로 집계를 필터링할 수도 있습니다. 예를 들면 다음과 같습니다.
db.myCollection.aggregate([
{ $match: { $text: { $search: "french bread" } } },
{ "city": "Paris" }
] );
파티션의 값은 문자열이어야 합니다. 파티션 필터는 'and'를 사용하여 텍스트 검색에 조인되어야 합니다.
텍스트 검색 언어 설정
$language 인수를 사용하여 텍스트 검색 언어를 설정할 수 있습니다. 예를 들면 다음과 같습니다.
db.cities.find({ $text: { $search: "french bread", $language: "en"} })
언어를 설정하지 않으면 검색에서 텍스트 색인의 언어를 사용합니다.
정확한 검색어 검색
정확한 검색어를 검색하려면 검색어를 큰따옴표로 묶인 단어 시퀀스로 구성합니다. 예를 들면 다음과 같습니다.
# Find search
db.cities.find({ $text: { $search: "\"best french bread\"" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "\"best french bread\"" } } },
]);
검색어 조합 검색
텍스트 검색을 더 정확하게 만들려면 검색어 체인을 지정합니다. 예를 들어, 다음 검색은 best AND french AND ("bread" OR "is") 조합과 일치하는 문서를 반환합니다.
# Find search
db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
]);
검색어 제외
텍스트 검색에서 검색어를 제외하려면 검색어 앞에 하이픈 (-)을 붙입니다.
# Find search
db.cities.find({ $text: { $search: "best bread -french"} })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best bread -french" } } },
]);
관련성 점수 계산
{$meta: "textScore"} 표현식을 사용하여 텍스트 검색과 일치하는 문서의 관련성 점수를 계산합니다. 점수 내림차순으로 결과를 정렬하려면 정렬 표현식에서 $meta를 사용합니다. 다음 예를 참고하세요.
SCORE_FIELD는 점수 값을 저장하는 데 사용되는 필드의 이름입니다.
# Find search
db.cities
.find({ $text: { $search: "best french bread" } })
.sort({ SCORE_FIELD: { $meta: "textScore" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
]);
프로젝션 표현식에서 텍스트 점수를 사용할 수도 있습니다. 예를 들면 다음과 같습니다.
# Find search
db.cities
.find({ $text: { $search: "best french bread" } })
.project({ score: { $meta: "textScore" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $project: { "scoreField": { $meta: "textScore"} } },
]);
검색 확장
텍스트 검색 결과의 관련성을 높이기 위해 $text 연산자는 지정된 언어에 따라 검색 문자열을 보강하여 컨텍스트 인식 동의어, 어간 추출된 형식, 맞춤법 수정된 검색어, 발음 구별 기호 변형 등의 일치 항목을 포함합니다.
제한사항
$near연산자와$text연산자는 동일한 텍스트 검색에서 사용할 수 없습니다.find또는aggregation검색당 하나의$text연산자가 허용됩니다.- 집계에서
$text가 있는$match단계는 첫 번째 파이프라인 단계여야 합니다. $text는$and및$or내에서만 중첩될 수 있습니다.$text가$or내에 있는 경우 검색하지 않는 분리자는 기존의 정렬된 색인을 사용하여 검색을 최적화할 수 있습니다. 다른 분리자가 색인되지 않은 경우 검색은 컬렉션 스캔에 의존합니다.$text는 힌트와 함께 사용할 수 없습니다.- 텍스트 검색이 포함된 쿼리는
$natural로 정렬할 수 없습니다.