텍스트 검색
개요
이 가이드에서는 Rust 드라이버를 사용하여 텍스트 검색을 실행하는 방법을 배울 수 있습니다. 텍스트 검색을 사용하면 문자열 값이 있는 필드를 효율적으로 쿼리할 수 있습니다.
중요
MongoDB 텍스트 Atlas Search는 보다 강력한 Atlas Search 기능과 다릅니다. 자세히 알아보려면 Atlas Search 설명서를 참조하세요.
이 가이드에는 다음 섹션이 포함되어 있습니다.
예제용 샘플 데이터는 Atlas Search 예제 텍스트에서 사용되는 샘플 데이터를 제공합니다.
텍스트 인덱스 는 문자열 값 필드 에 텍스트 인덱스 를 만드는 방법을 설명합니다.
텍스트 Atlas Search 는 다양한 Atlas Search 기준으로 텍스트 검색을 수행하는 방법을 설명합니다.
집계 는 집계 파이프라인을 사용하여 텍스트 검색을 수행하는 방법을 설명합니다.
추가 정보에서 이 가이드에 언급된 유형 및 메소드에 대한 리소스 및 API 문서 링크를 찾을 수 있습니다.
예시용 샘플 데이터
이 가이드의 예시에서는 다음 Dish
구조체를 menu
collection의 문서 모델로 사용합니다.
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." }
Text Index
텍스트 검색을 수행하기 전에 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"
이라는 용어가 포함된 문서 검색을 수행합니다.텍스트 점수에서 내림차순으로 결과 정렬
출력에
name
및score
필드만 포함합니다.
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"
이라는 용어가 포함된 문서 검색을 수행합니다.텍스트 점수에서 내림차순으로 결과 정렬
출력에
name
및score
필드만 포함합니다.
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 문서
이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 문서를 참조하세요.