Docs Menu
Docs Home
/ / /
Rust 드라이버
/ / /

텍스트 검색

이 페이지의 내용

  • 개요
  • 예시용 샘플 데이터
  • Text Index
  • 텍스트 검색
  • 용어 검색
  • 구문 검색
  • 검색에서 텀 제외
  • 관련성 기준 정렬
  • 집계
  • 검색어 일치
  • 관련성 기준 정렬
  • 추가 정보
  • API 문서

이 가이드에서는 Rust 드라이버를 사용하여 텍스트 검색을 실행하는 방법을 배울 수 있습니다. 텍스트 검색을 사용하면 문자열 값이 있는 필드를 효율적으로 쿼리할 수 있습니다.

중요

MongoDB 텍스트 Atlas Search는 보다 강력한 Atlas Search 기능과 다릅니다. 자세히 알아보려면 Atlas Search 설명서를 참조하세요.

이 가이드에는 다음 섹션이 포함되어 있습니다.

  • 예제용 샘플 데이터는 Atlas Search 예제 텍스트에서 사용되는 샘플 데이터를 제공합니다.

  • 텍스트 인덱스 는 문자열 값 필드 에 텍스트 인덱스 를 만드는 방법을 설명합니다.

  • 텍스트 Atlas Search 는 다양한 Atlas Search 기준으로 텍스트 검색을 수행하는 방법을 설명합니다.

  • 집계 는 집계 파이프라인을 사용하여 텍스트 검색을 수행하는 방법을 설명합니다.

  • 추가 정보에서 이 가이드에 언급된 유형 및 메소드에 대한 리소스 및 API 문서 링크를 찾을 수 있습니다.

이 가이드의 예시에서는 다음 Dish 구조체를 menu collection의 문서 모델로 사용합니다.

#[derive(Serialize, Deserialize, Debug)]
struct Dish {
name: String,
description: String,
}

이 예제에서는 레스토랑에서 주문할 수 있는 요리를 설명하는 다음 샘플 문서를 사용합니다.

{ "name": "Shepherd’s Pie", "description": "A vegetarian take on the classic dish that uses lentils as a base. Serves 2." },
{ "name": "Green Curry", "description": "A flavorful Thai curry, made vegetarian with tofu. Vegetarian and vegan friendly." },
{ "name": "Herbed Branzino", "description": "Grilled whole fish stuffed with herbs and pomegranate seeds. Serves 3-4." },
{ "name": "Kale Tabbouleh", "description": "A bright, herb-based salad. A perfect starter for vegetarians and vegans." },
{ "name": "Garlic Butter Trout", "description": "Baked trout seasoned with garlic, lemon, dill, and, of course, butter. Serves 2." }

텍스트 검색을 수행하기 전에 collection에 텍스트 인덱스 를 생성해야 합니다. 텍스트 인덱스는 텍스트 검색을 수행할 수 있는 문자열 또는 문자열 배열 필드를 지정합니다.

이 가이드의 예제에서는 collection에 있는 문서의 필드에서 텍스트 검색을 수행합니다.description menu description 필드에서 텍스트 검색을 활성화하려면 다음 코드에 표시된 대로 텍스트 인덱스를 만듭니다.

let index = IndexModel::builder()
.keys(doc! { "description": "text" })
.build();
let idx_res = my_coll.create_index(index).await?;

텍스트 검색은 인덱스된 필드의 값에 지정된 가 포함된 문서를 조회합니다. 텀은 공백 문자를 제외한 일련의 문자입니다. 구문은 임의의 수의 공백 문자가 있는 일련의 텀입니다.

텍스트 검색을 수행하려면 쿼리 필터에 $text 평가 쿼리 연산자를 포함하고 그 뒤에 $search 필드를 포함합니다. $text 연산자는 텍스트 인덱스 필드에서 텍스트 검색을 수행하도록 지정합니다. $search 필드는 텍스트 인덱스 필드에서 검색할 용어나 구를 지정합니다.

텍스트 검색을 위한 쿼리 필터는 다음 형식을 사용합니다.

let filter = doc! { "$text": { "$search": "<search term or phrase>" } };

텀을 검색하려면 쿼리 필터에서 해당 텀을 문자열로 지정합니다. 여러 텀을 검색하려면 각 텀을 공백으로 구분합니다.

참고

여러 텀을 검색할 때 find() 메서드는 텍스트 인덱스 필드 또는 필드에 텀 중 하나 이상이 포함된 문서를 반환합니다.

예를 들어 검색어가 "one two three" 인 경우 MongoDB는 인덱싱된 필드에 "one", "two", "three" 또는 이러한 용어 중 하나 이상이 포함된 문서를 반환합니다.

다음 예에서는 description 필드에 "herb" 텀이 포함된 문서 검색을 수행합니다.

let filter = doc! { "$text": { "$search": "herb" } };
let mut cursor = my_coll.find(filter).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Dish { name: "Kale Tabbouleh", description: "A bright, herb-based salad. A perfect starter for vegetarians and vegans." }
Dish { name: "Herbed Branzino", description: "Grilled whole fish stuffed with herbs and pomegranate seeds. Serves 3-4." }

검색 가 "herb" 인 텀 에도 텍스트 검색 은 description 필드 에 "herbs" 가 포함된 문서와도 일치합니다. 이는 MongoDB 텍스트 인덱스 가 유사한 단어를 일치시키기 위해 접미사 형태소 분석을 사용하기 때문입니다. MongoDB 가 용어를 일치시키는 방법에 학습 보려면 서버 매뉴얼의 인덱스 항목 을 참조하세요.

구문을 검색하려면 쿼리 필터에 이스케이프 따옴표가 포함된 구문을 지정합니다.

let filter = doc! { "$text": { "$search": "\"<some phrase>\"" } };

문구 주위에 이스케이프 따옴표를 추가하지 않으면 Atlas Search는 용어 Atlas Search를 수행합니다.

다음 예에서는 description 필드에 "serves 2" 구문이 포함된 문서 검색을 수행합니다.

let filter = doc! { "$text": { "$search": "\"serves 2\"" } };
let mut cursor = my_coll.find(filter).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Dish { name: "Shepherd’s Pie", description: "A vegetarian take on the classic dish that uses lentils as a base. Serves 2." }
Dish { name: "Garlic Butter Trout", description: "Baked trout seasoned with garlic, lemon, dill, and, of course, butter. Serves 2." }

텍스트 검색에서 제외하려는 텀이나 구를 지정하려면 쿼리 필터에서 빼기 기호 접두사를 붙입니다.

let filter = doc! { "$text": { "$search": "<term> -<excluded term>" } };

중요

검색에서 다른 용어를 제외하려면 하나 이상의 용어 또는 구를 검색해야 합니다. 텀만 제외하면 검색 시 어떤 문서도 반환되지 않습니다.

다음 예에서는 description 필드에 "vegan" 라는 용어가 포함되어 있지만 "tofu" 라는 용어는 포함되어 있지 않은 문서를 검색합니다.

let filter = doc! { "$text": { "$search": "vegan -tofu" } };
let mut cursor = my_coll.find(filter).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Dish { name: "Kale Tabbouleh", description: "A bright, herb-based salad. A perfect starter for vegetarians and vegans." }

텍스트 검색은 각 결과가 쿼리 필터의 문자열과 얼마나 일치하는지를 나타내기 위해 숫자 텍스트 점수를 할당합니다. 텍스트 점수가 높을수록 결과가 쿼리와 더 관련성이 있음을 나타냅니다. 출력에 텍스트 점수를 표시하려면 프로젝션을 사용하여 메타데이터에서 textScore 필드를 조회합니다. textScore 메타데이터 필드에 정렬을 지정하여 텍스트 점수를 내림차순으로 정렬할 수 있습니다.

이 예에서는 다음 조치를 수행합니다.

  • description 필드에 "vegetarian"이라는 용어가 포함된 문서 검색을 수행합니다.

  • 텍스트 점수에서 내림차순으로 결과 정렬

  • 출력에 namescore 필드만 포함합니다.

let filter = doc! { "$text": { "$search": "vegetarian" } };
let sort = doc! { "score": { "$meta": "textScore" } };
let projection =
doc! {
"_id": 0,
"name": 1,
"score": { "$meta": "textScore" }
};
let doc_coll: Collection<Document> = my_coll.clone_with_type();
let mut cursor = doc_coll.find(filter)
.sort(sort)
.projection(projection)
.await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Document({"name": String("Green Curry"), "score": Double(0.9166666666666667)})
Document({"name": String("Kale Tabbouleh"), "score": Double(0.5625)})
Document({"name": String("Shepherd’s Pie"), "score": Double(0.5555555555555556)})

$match 집계 단계에 $text 평가 쿼리 연산자 를 포함하여 집계 파이프라인 에서 텍스트 검색 을 수행할 수 있습니다.

다음 섹션에서는 find() 메서드 대신 집계 파이프라인을 사용하여 텍스트 검색을 수행하는 방법을 보여 줍니다.

다음 예에서는 애그리게이션을 사용하여 description 필드에 "herb" 텀이 포함된 문서를 검색합니다.

let match_stage = doc! { "$match": { "$text": { "$search": "herb" } } };
let mut cursor = my_coll.aggregate([match_stage]).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Document({"_id": ObjectId("..."), "name": String("Kale Tabbouleh"), "description": String("A bright, herb-based salad. A perfect starter for vegetarians and vegans.")})
Document({"_id": ObjectId("..."), "name": String("Herbed Branzino"), "description": String("Grilled whole fish stuffed with herbs and pomegranate seeds. Serves 3-4.")})

이 예에서는 애그리게이션을 사용하여 다음 조치를 수행합니다.

  • description 필드에 "vegetarian"이라는 용어가 포함된 문서 검색을 수행합니다.

  • 텍스트 점수에서 내림차순으로 결과 정렬

  • 출력에 namescore 필드만 포함합니다.

let match_stage = doc! { "$match": { "$text": { "$search": "vegetarian" } } };
let sort_stage = doc! { "$sort": { "score": { "$meta": "textScore" } } };
let proj_stage =
doc! { "$project": {
"_id": 0,
"name": 1,
"score": { "$meta": "textScore" }
} };
let pipeline = [match_stage, sort_stage, proj_stage];
let mut cursor = my_coll.aggregate(pipeline).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Document({"name": String("Green Curry"), "score": Double(0.9166666666666667)})
Document({"name": String("Kale Tabbouleh"), "score": Double(0.5625)})
Document({"name": String("Shepherd’s Pie"), "score": Double(0.5555555555555556)})

find() 메서드를 사용하는 실행 가능한 예시 는 여러 문서 찾기 사용 예시 참조하세요.

이 가이드의 작업에 대해 자세히 알아보려면 다음 문서를 참조하세요.

이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 문서를 참조하세요.

돌아가기

Change Streams 열기