텍스트 쿼리 사용

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

시작하기 전에

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

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

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

IAM 권한

MongoDB 호환성을 갖춘 Firestore에서 색인을 만들려면 먼저 다음 역할 중 하나가 할당되어야 합니다.

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

역할을 부여하려면 단일 역할 부여를 참조하세요. 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로 정렬할 수 없습니다.