텍스트 검색 사용

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로 정렬할 수 없습니다.