텍스트 검색 사용

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

시작하기 전에

텍스트 검색을 사용하기 전에 다음을 실행하세요.

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

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

텍스트 검색은 필터 내에서 $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로 정렬할 수 없습니다.