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

텍스트 검색

이 페이지의 내용

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

이 가이드에서는 텍스트 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)

각 문서에는 레스토랑 메뉴에 있는 요리의 namedescription이 포함되어 있습니다.

존재하지 않는 데이터베이스 및 collection

쓰기 작업을 수행할 때 필요한 데이터베이스 및 collection이 없는 경우 서버는 이를 암시적으로 생성합니다.

텍스트 검색을 실행하기 전에 텍스트 인덱스를 만들어야 합니다. 텍스트 인덱스는 텍스트 검색을 실행할 문자열 또는 문자열 배열 필드를 지정합니다.

다음 섹션의 예시에서는 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))
}
{"name":"Kale Tabbouleh","description":"A bright, herb-based salad. A perfect starter for vegetarians and vegans."}
{"name":"Herbed Whole Branzino","description":"Grilled whole fish stuffed with herbs and pomegranate seeds. Serves 3-4."}

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))
}
{"name":"Shepherd's Pie","description":"A vegetarian take on the classic dish that uses lentils as a base. Serves 2."}
{"name":"Garlic Butter Trout","description":"Baked trout seasoned with garlic, lemon, dill, and, of course, butter. Serves 2."}

텍스트 검색에서 제외하려는 각 용어 또는 구문의 경우, 쿼리 필터에서 마이너스 기호가 앞에 붙은 용어 또는 구문을 문자열로 지정합니다.

중요

검색에서 용어를 제외하려면 하나 이상의 용어를 검색해야 합니다. 용어를 검색하지 않으면 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))
}
{"name":"Kale Tabbouleh","description":"A bright, herb-based salad. A perfect starter for vegetarians and vegans."}

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

다음 예시에서는 다음 작업을 수행합니다:

  • 'vegetarian'이라는 용어가 포함된 설명에 대한 텍스트 검색을 실행합니다."

  • 텍스트 점수를 기준으로 결과를 내림차순으로 정렬합니다.

  • 최종 출력 문서에 namescore 필드만 포함합니다.

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))
}
{"name":"Green Curry","score":0.8999999999999999}
{"name":"Kale Tabbouleh","score":0.5625}
{"name":"Shepherd's Pie","score":0.5555555555555556}

$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))
}
{"name":"Kale Tabbouleh","description":"A bright, herb-based salad. A perfect starter for vegetarians and vegans."}
{"name":"Herbed Whole Branzino","description":"Grilled whole fish stuffed with herbs and pomegranate seeds. Serves 3-4."}

다음 예시에서는 다음 작업을 수행합니다:

  • 'vegetarian'이라는 용어가 포함된 설명에 대한 텍스트 검색을 실행합니다."

  • 텍스트 점수를 기준으로 결과를 내림차순으로 정렬합니다.

  • 최종 출력 문서에 namescore 필드만 포함합니다.

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))
}
{"name":"Green Curry","score":0.8999999999999999}
{"name":"Kale Tabbouleh","score":0.5625}
{"name":"Shepherd's Pie","score":0.5555555555555556}

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

  • 쿼리 지정

  • 결과 정렬

  • 반환할 필드 지정

  • Text Indexes

  • $text

  • $meta

  • 집계

  • Indexes

이 가이드에서 설명하는 메서드나 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.

돌아가기

반환할 필드 지정