Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ / /
Rust 드라이버
/ / /

쿼리 텍스트

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

중요

MongoDB 텍스트 쿼리는 더 강력한 Atlas Search 기능 과는 다릅니다. 자세히 학습 Atlas Search 설명서를 참조하세요.

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

이 가이드의 예시에서는 다음 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." }

텍스트 쿼리 수행하기 전에 컬렉션 에 텍스트 인덱스 만들어야 합니다. 텍스트 인덱스 텍스트 쿼리를 수행할 수 있는 문자열 또는 문자열 배열 필드 지정합니다.

이 가이드 의 예제에서는 menu 컬렉션 에 있는 문서의 description 필드 에 대한 텍스트 쿼리를 수행합니다. 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 열기

이 페이지의 내용