텍스트 검색
개요
이 가이드에서는 텍스트 Atlas Search를 실행하는 방법을 배울 수 있습니다.
중요
MongoDB 텍스트 Atlas Search는 Atlas Search와 다릅니다 Atlas Search
샘플 데이터
이 가이드의 예시에서는 다음 Dish
구조체를 menu
collection의 문서 모델로 사용합니다.
type Dish struct { Name string Description string }
이 가이드의 예시를 실행하려면 다음 스니펫을 사용하여 샘플 데이터를 db.menu
collection에 로드하세요.
coll := client.Database("db").Collection("menu") docs := []interface{}{ Dish{Name: "Shepherd’s Pie", Description: "A vegetarian take on the classic dish that uses lentils as a base. Serves 2."}, Dish{Name: "Green Curry", Description: "A flavorful Thai curry, made vegetarian with fried tofu. Vegetarian and vegan friendly."}, Dish{Name: "Herbed Whole Branzino", Description: "Grilled whole fish stuffed with herbs and pomegranate seeds. Serves 3-4."}, Dish{Name: "Kale Tabbouleh", Description: "A bright, herb-based salad. A perfect starter for vegetarians and vegans."}, Dish{Name: "Garlic Butter Trout", Description: "Baked trout seasoned with garlic, lemon, dill, and, of course, butter. Serves 2."}, } result, err := coll.InsertMany(context.TODO(), docs)
각 문서에는 레스토랑 메뉴에 있는 요리의 name
및 description
이 포함되어 있습니다.
팁
존재하지 않는 데이터베이스 및 collection
쓰기 작업을 수행할 때 필요한 데이터베이스 및 collection이 없는 경우 서버는 이를 암시적으로 생성합니다.
Text Index
텍스트 검색을 실행하기 전에 텍스트 인덱스를 만들어야 합니다. 텍스트 인덱스는 텍스트 검색을 실행할 문자열 또는 문자열 배열 필드를 지정합니다.
다음 섹션의 예시에서는 menu
컬렉션에 있는 문서의 description
필드에서 텍스트 검색을 실행합니다. description
필드에서 텍스트 검색을 활성화하려면 다음 스니펫을 사용하여 텍스트 인덱스를 만듭니다.
model := mongo.IndexModel{Keys: bson.D{{"description", "text"}}} name, err := coll.Indexes().CreateOne(context.TODO(), model) if err != nil { panic(err) } fmt.Println("Name of index created: " + name)
텍스트 검색
텍스트 검색은 인덱스된 텍스트 필드에 단어 또는 구문이 포함된 문서를 조회합니다. 용어는 공백 문자를 제외하는 일련의 문자입니다. 구문은 임의의 수의 공백 문자가 있는 일련의 용어입니다.
텍스트 검색을 수행하려면 $text
평가 쿼리 연산자를 사용한 후 쿼리 필터의 $search
필드를 사용합니다. $text
연산자는 인덱스된 텍스트 필드에서 텍스트 검색을 수행합니다. $search
필드는 인덱스된 텍스트 필드에서 검색할 텍스트를 지정합니다.
텍스트 검색을 위한 쿼리 필터는 다음 형식을 사용합니다.
filter := bson.D{{"$text", bson.D{{"$search", "<text to search>"}}}}
용어로 검색
용어를 검색하려면 쿼리 필터에서 해당 용어를 문자열로 지정합니다. 여러 용어를 검색하려면 문자열에서 각 용어를 공백으로 구분합니다.
참고
여러 용어를 검색하는 경우 Find()
메서드는 텍스트 인덱스 필드에 해당 용어가 하나 이상 포함된 문서를 반환합니다.
예시
다음 예에서는 'herb'라는 용어가 포함된 설명에 대한 텍스트 검색을 실행합니다.
filter := bson.D{{"$text", bson.D{{"$search", "herb"}}}} cursor, err := coll.Find(context.TODO(), filter) if err != nil { panic(err) } var results []Dish if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
팁
Atlas Search 용어는 'herb'였지만 MongoDB 텍스트 인덱스는 유사한 단어를 일치시키기 위해 접미사 어간을 사용하기 때문에 이 메서드는 'herb'가 포함된 설명도 일치시킵니다. MongoDB가 용어를 일치시키는 방법에 대해 자세히 알아보려면 인덱스 항목을 참조하세요.
구문으로 검색
구문을 검색하려면 이스케이프된 따옴표를 사용하여 구문을 쿼리 필터의 문자열로 지정합니다. 구문 주위에 이스케이프된 따옴표를 추가하지 않으면 Find()
메서드는 용어 검색을 실행합니다.
팁
이스케이프 따옴표는 백슬래시 문자 뒤에 큰따옴표 문자를 붙인 것입니다.
예시
다음 예에서는 'serves 2' 구문이 포함된 설명에 대한 텍스트 검색을 실행합니다.
filter := bson.D{{"$text", bson.D{{"$search", "\"serves 2\""}}}} cursor, err := coll.Find(context.TODO(), filter) if err != nil { panic(err) } var results []Dish if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
제외된 용어로 검색
텍스트 검색에서 제외하려는 각 용어 또는 구문의 경우, 쿼리 필터에서 마이너스 기호가 앞에 붙은 용어 또는 구문을 문자열로 지정합니다.
중요
검색에서 용어를 제외하려면 하나 이상의 용어를 검색해야 합니다. 용어를 검색하지 않으면 Find()
메서드는 어떤 문서도 반환하지 않습니다.
예시
다음 예에서는 'vegan'이라는 용어는 포함하지만 'tofu'라는 용어는 포함하지 않은 설명에 대한 텍스트 검색을 실행합니다.
filter := bson.D{{"$text", bson.D{{"$search", "vegan -tofu"}}}} cursor, err := coll.Find(context.TODO(), filter) if err != nil { panic(err) } var results []Dish if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
관련성 기준 정렬
텍스트 검색은 각 결과가 쿼리 필터의 문자열과 얼마나 일치하는지를 나타내기 위해 숫자 텍스트 점수를 할당합니다. 출력에 텍스트 점수를 표시하려면 프로젝션을 사용하여 textScore
메타데이터를 조회합니다. textScore
메타데이터에 정렬을 지정하여 텍스트 점수를 내림차순으로 정렬할 수 있습니다.
예시
다음 예시에서는 다음 작업을 수행합니다:
'vegetarian'이라는 용어가 포함된 설명에 대한 텍스트 검색을 실행합니다."
텍스트 점수를 기준으로 결과를 내림차순으로 정렬합니다.
최종 출력 문서에
name
및score
필드만 포함합니다.
filter := bson.D{{"$text", bson.D{{"$search", "vegetarian"}}}} sort := bson.D{{"score", bson.D{{"$meta", "textScore"}}}} projection := bson.D{{"name", 1}, {"score", bson.D{{"$meta", "textScore"}}}, {"_id", 0}} opts := options.Find().SetSort(sort).SetProjection(projection) cursor, err := coll.Find(context.TODO(), filter, opts) if err != nil { panic(err) } var results []bson.D if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
집계
$match 단계에 $text
평가 쿼리 연산자를 포함하여 집계 파이프라인에서 텍스트 Atlas Search를 수행할 수도 있습니다.
검색어 일치
다음 예에서는 'herb'라는 용어가 포함된 설명에 대한 텍스트 검색을 실행합니다.
matchStage := bson.D{{"$match", bson.D{{"$text", bson.D{{"$search", "herb"}}}}}} cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{matchStage}) if err != nil { panic(err) } var results []Dish if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
관련성 기준 정렬
다음 예시에서는 다음 작업을 수행합니다:
'vegetarian'이라는 용어가 포함된 설명에 대한 텍스트 검색을 실행합니다."
텍스트 점수를 기준으로 결과를 내림차순으로 정렬합니다.
최종 출력 문서에
name
및score
필드만 포함합니다.
matchStage := bson.D{{"$match", bson.D{{"$text", bson.D{{"$search", "vegetarian"}}}}}} sortStage := bson.D{{"$sort", bson.D{{"score", bson.D{{ "$meta", "textScore" }}}}}} projectStage := bson.D{{"$project", bson.D{{"name", 1}, {"score", bson.D{{ "$meta", "textScore" }}}, {"_id", 0}}}} cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{matchStage, sortStage, projectStage}) if err != nil { panic(err) } var results []bson.D if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
추가 정보
언급된 작업에 대해 자세히 알아보려면 다음 가이드를 참조하세요.
API 문서
이 가이드에서 설명하는 메서드나 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.