Cloud Firestore의 텍스트 검색 기능을 사용하여 컬렉션 내에서 특정 문자열을 검색합니다.
시작하기 전에
텍스트 쿼리를 사용하기 전에 다음을 수행하세요.
기존 MongoDB 호환 작업 데이터베이스에 액세스할 수 있는지 확인하거나 데이터베이스를 만들고 연결합니다.
텍스트 색인이 있는지 확인하거나 텍스트 색인을 만듭니다.
IAM 권한
Cloud Firestore에서 색인을 만들려면 먼저 다음 역할 중 하나를 할당받아야 합니다.
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
역할을 부여하려면 단일 역할 부여를 참조하세요. Cloud Firestore 역할 및 관련 권한에 대한 자세한 내용은 사전 정의된 역할을 참조하세요.
커스텀 역할을 정의한 경우 다음 권한을 모두 할당하여 색인을 만듭니다.
datastore.indexes.createdatastore.indexes.deletedatastore.indexes.getdatastore.indexes.listdatastore.indexes.update
텍스트 쿼리 실행
텍스트 쿼리는 필터 내에서 $text 연산자를 사용합니다.
$search 인수에 쿼리된 문자열을 지정합니다.
일반 텍스트 쿼리 실행
일반 쿼리를 실행하려면 다음 쿼리를 실행합니다.
# Find query
db.cities.find({ $text: { $search: "french bread" } })
# Aggregation query
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 query
db.cities.find({ $text: { $search: "\"best french bread\"" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "\"best french bread\"" } } },
]);
용어 조합 쿼리
쿼리를 더 정확하게 만들려면 용어 체인을 지정합니다. 예를 들어 다음 쿼리는 best AND french AND ("bread" OR "is") 조합과 일치하는 문서를 반환합니다.
# Find query
db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
]);
용어 제외
쿼리에서 용어를 제외하려면 용어 앞에 하이픈 (-)을 붙입니다.
# Find query
db.cities.find({ $text: { $search: "best bread -french"} })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "best bread -french" } } },
]);
관련성 점수 계산
{$meta: "textScore"} 표현식을 사용하여 텍스트 쿼리와 일치하는 문서의 관련성 점수를 계산합니다. 점수 내림차순으로 결과를 정렬하려면 정렬 표현식에서 $meta를 사용합니다. 다음 예를 참고하세요.
SCORE_FIELD는 점수 값을 저장하는 데 사용되는 필드의 이름입니다.
# Find query
db.cities
.find({ $text: { $search: "best french bread" } })
.sort({ SCORE_FIELD: { $meta: "textScore" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
]);
프로젝션 표현식에서 텍스트 점수를 사용할 수도 있습니다. 예를 들면 다음과 같습니다.
# Find query
db.cities
.find({ $text: { $search: "best french bread" } })
.project({ score: { $meta: "textScore" } })
# Aggregation query
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로 정렬할 수 없습니다.