텍스트 검색 사용

Cloud Firestore의 텍스트 검색 기능을 사용하여 컬렉션 내에서 특정 문자열을 검색합니다.

시작하기 전에

텍스트 쿼리를 사용하기 전에 다음을 수행하세요.

  1. 기존 MongoDB 호환 작업 데이터베이스에 액세스할 수 있는지 확인하거나 데이터베이스를 만들고 연결합니다.

  2. 텍스트 색인이 있는지 확인하거나 텍스트 색인을 만듭니다.

IAM 권한

Cloud Firestore에서 색인을 만들려면 먼저 다음 역할 중 하나를 할당받아야 합니다.

  • roles/datastore.owner
  • roles/datastore.indexAdmin
  • roles/editor
  • roles/owner

역할을 부여하려면 단일 역할 부여를 참조하세요. Cloud Firestore 역할 및 관련 권한에 대한 자세한 내용은 사전 정의된 역할을 참조하세요.

커스텀 역할을 정의한 경우 다음 권한을 모두 할당하여 색인을 만듭니다.

  • datastore.indexes.create
  • datastore.indexes.delete
  • datastore.indexes.get
  • datastore.indexes.list
  • datastore.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로 정렬할 수 없습니다.