Docs Menu

Docs HomeGo

検索テキスト

項目一覧

  • Overview
  • サンプル データ
  • Text Index
  • テキスト検索
  • タームで検索
  • フレーズで検索
  • タームを除外した検索
  • 関連性でソート
  • 集計
  • ターム検索の例
  • テキスト スコアの例
  • 詳細情報
  • API ドキュメント

このガイドでは、 テキスト検索を実行する方法を説明します。

重要

MongoDB テキスト検索はAtlas Search と異なります。

このガイドの例を実行するには、次のスニペットを使用してサンプルデータを marvel.moviesコレクションにロードします。

coll := client.Database("marvel").Collection("movies")
docs := []interface{}{
bson.D{{"title", "Captain America: Civil War"}, {"year", 2016}},
bson.D{{"title", "The Avengers"}, {"year", 2012}},
bson.D{{"title", "Captain America: The Winter Soldier"}, {"year", 2014}},
bson.D{{"title", "Avengers: Infinity War"}, {"year", 2018}},
bson.D{{"title", "Captain America: The First Avenger"}, {"year", 2011}},
}
result, err := coll.InsertMany(context.TODO(), docs)
if err != nil {
panic(err)
}
fmt.Printf("Number of documents inserted: %d\n", len(result.InsertedIDs))

Tip

存在しないデータベースとコレクション

書き込み操作を実行するときに必要なデータベースとコレクションが存在しない場合は、サーバーが暗黙的にそれらを作成します。

各ドキュメントには、 フィールドとtitle yearフィールドに対応するマージ映画の名前と公開年が含まれています。

注意

各例ではObjectID値が切り捨てられます。この値はドライバーが個別に生成するためです。

テキスト検索を実行する前に、テキストインデックスを作成する必要があります。 テキストインデックスは、テキスト検索を実行する string または string 配列フィールドを指定します。

次のセクションの例では、 moviesコレクションのtitleフィールドでテキスト検索を実行します。 titleフィールドでテキスト検索を有効にするには、次のスニペットを使用して テキスト インデックス を作成します。

model := mongo.IndexModel{Keys: bson.D{{"title", "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>"}}}}

タームを検索するには、クエリフィルターでタームを string として指定します。 複数のタームを検索するには、string 内にスペースで各タームを区切ります。

注意

複数のタームを検索する場合、 Find()メソッドは、テキスト インデックス フィールドに少なくとも 1 つのタームを含むドキュメントを返します。

次の例では、"警告" というタームを含むタイトルのテキスト検索を実行します。

filter := bson.D{{"$text", bson.D{{"$search", "War"}}}}
cursor, err := coll.Find(context.TODO(), filter)
if err != nil {
panic(err)
}
var results []bson.D
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
fmt.Println(result)
}

フレーズを検索するには、クエリフィルターの string として、エスケープされた引用符を含むフレーズを指定します。 フレーズの前後にエスケープされた引用符を追加しない場合、 Find()メソッドはターム検索を実行します。

Tip

エスケープされた引用符は、バックスラッシュ文字とそれに続くdouble引用符文字です。

次の例では、「Infinity」というフレーズを含むタイトルのテキスト検索を実行します。

filter := bson.D{{"$text", bson.D{{"$search", "\"Infinity War\""}}}}
cursor, err := coll.Find(context.TODO(), filter)
if err != nil {
panic(err)
}
var results []bson.D
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
fmt.Println(result)
}

テキスト検索から除外する用語またはフレーズごとに、クエリ フィルターの string としてマイナス記号を先頭に付けた用語またはフレーズを指定します。

重要

検索からタームを除外する場合は、少なくとも 1 つのタームを検索する必要があります。 タームを検索しない場合、 Find()メソッドはドキュメントを返しません。

次の例では、"Avenger" というタームを含むが、"Captain University" というフレーズは含まないタイトルのテキスト検索を実行します。

filter := bson.D{{"$text", bson.D{{"$search", "Avenger -\"Captain America\""}}}}
cursor, err := coll.Find(context.TODO(), filter)
if err != nil {
panic(err)
}
var results []bson.D
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
fmt.Println(result)
}

テキスト検索では、数値テキスト スコアが割り当てられ、各結果がクエリフィルター内の string にどの程度一致するかを示します。 出力にテキスト スコアを表示するには、プロジェクションを使用してtextScoreメタデータを取得します。 textScoreメタデータで並べ替えを指定すると、テキスト スコアを降順で並べ替えることができます。

次の例では、次のアクションが実行されます。

  • "Avenger" というタームを含むタイトルのテキスト検索を実行します

  • テキスト スコアに基づいて、結果を降順で並べ替えます

  • 結果のtitle フィールドと フィールドを含みますscore

filter := bson.D{{"$text", bson.D{{"$search", "Avenger"}}}}
sort := bson.D{{"score", bson.D{{"$meta", "textScore"}}}}
projection := bson.D{{"title", 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 {
fmt.Println(result)
}

Tip

検索用語は「Avenger」でしたが、MongoDB テキストインデックスでは類似単語を一致させるために接尾辞の語幹が使用されるため、 メソッドは「Avengers」を含むタイトルにも一致します。 MongoDB がタームを一致させる方法の詳細については、「インデックス エントリ 」を参照してください。

また、集計パイプラインでテキスト検索を実行するには、 $matchステージに$text評価クエリ演算子を含めます。

次の例では、「winter」というタームを含むタイトルのテキスト検索を実行します。

matchStage := bson.D{{"$match", bson.D{{"$text", bson.D{{"$search", "Winter"}}}}}}
cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{matchStage})
if err != nil {
panic(err)
}
var results []bson.D
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
fmt.Println(result)
}

次の例では、次のアクションが実行されます。

  • "Avenger" というタームを含むタイトルのテキスト検索を実行します

  • テキスト スコアに基づいて、結果を降順で並べ替えます

  • 結果のtitle フィールドと フィールドを含みますscore

matchStage := bson.D{{"$match", bson.D{{"$text", bson.D{{"$search", "Avenger"}}}}}}
sortStage := bson.D{{"$sort", bson.D{{"score", bson.D{{ "$meta", "textScore" }}}}}}
projectStage := bson.D{{"$project", bson.D{{"title", 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 {
fmt.Println(result)
}

Tip

検索用語は「Avenger」でしたが、MongoDB テキストインデックスでは類似単語を一致させるために接尾辞の語幹が使用されるため、 メソッドは「Avengers」を含むタイトルにも一致します。 MongoDB がタームを一致させる方法の詳細については、「インデックス エントリ 」を参照してください。

上記で説明されている操作の詳細については、次のガイドを参照してください。

このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。

←  返すフィールドを指定する変更の監視 →
フィードバックを送る
© 2022 MongoDB, Inc.

会社概要

© 2022 MongoDB, Inc.