Docs Menu
Docs Home
/ /

$text(クエリ述語演算子)

注意

このページでは、自己管理型(Atlas以外)デプロイメントのテキスト クエリ機能について説明します。 MongoDB Atlasでホストされているデータに対して、 MongoDB は改良された全文クエリ ソリューションである Atlas Search とベクトル検索ソリューションである Atlas ベクトル検索 を提供します。

このページでは、自己管理型配置の $text演算子について説明します。

$text

$text テキストインデックスでインデックス付けされたフィールドに対してテキスト クエリを実行します。

次の環境でホストされる配置には $text を使用できます。

  • MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです

  • MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン

  • MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン

$text式の構文は次のとおりです。

{
$text: {
$search: <string>,
$language: <string>,
$caseSensitive: <boolean>,
$diacriticSensitive: <boolean>
}
}

$text 演算子は次のフィールドを受け入れます。

フィールド
タイプ
説明

$search

string

MongoDB が解析し、テキストインデックスをクエリするために使用するタームのstring。MongoDB は、正確な string を指定しない限り、タームに対して論理的な OR クエリを実行します。「動作」を参照してください。

$language

string

任意.ストップワード、ステマー、トークナイザのルールを決定する言語。デフォルトはインデックス言語です。サポートされている言語については、自己管理型配置のテキスト検索言語 を参照してください。

none の値に default_language を指定すると、テキストインデックスはストップワードを含むフィールド内の各単語を解析し、接尾辞の語幹を無視します。

$caseSensitive

ブール値

任意.大文字と小文字の区別を有効にします。デフォルトは false です。「大文字と小文字を区別する」を参照してください。

$diacriticSensitive

ブール値

任意.バージョン 3 テキスト インデックスの発音区別符号の区別を有効にします。デフォルトは false です。以前のテキストインデックスバージョンでは、常に発音区別符号が区別されます。「 発音区別符号を区別しない 」を参照してください。

デフォルトでは 、$text は結果をスコア別にソートしません。スコア並べ替えの詳細については、テキスト スコアを参照してください。

  • クエリでは、 $text式を 1 つだけ指定できます。

  • $text$nor 式には使用できません。

  • $text $elemMatch は、クエリまたはプロジェクション式には使用できません。

  • $text を使用するには、すべての $or 句をインデックス化する必要があります。

  • クエリに$text式が含まれている場合、 hint()を使用してクエリに使用するインデックスを指定することはできません。

  • $text を含むクエリでは $natural 並べ替えを使用できません。

  • 特殊なテキストインデックスを必要とする $text 式と、別のタイプの特殊インデックスを必要とするクエリ 演算子を組み合わせることはできません。たとえば、 $text 式を $near 演算子と組み合わせることはできません。

  • ビュー$textをサポートしていません。

  • Stable API V1 はインデックス作成用の $text をサポートしていません。

集計で $text 演算子を使う場合、以下の制限も適用されます。

  • $textを含む$matchステージは、パイプラインの最初のステージである必要があります。

  • $text演算子は ステージ内で 1 回のみ発生できます。

  • $text演算子式は、 $orまたは$not式には使用できません。

  • $textは、デフォルトでは、で一致したドキュメントを一致スコアの順序で返すことはありません。スコアの降順で並べ替えるには、$sort ステージで $meta 集計式を使用します。

$searchフィールドに、 MongoDB がテキストインデックスをクエリするのに使用する単語を指定します。

注意

$searchフィールドはMongoDB Atlas $search集計ステージとは異なります。$search ステージは全文検索を提供し、 MongoDB Atlasでのみ利用できます。

個々の期間ではなく、複数の単語を含む正確なstringを照合するには、次のようにstringをエスケープされたdouble引用符(\")で囲みます。

"\"ssl certificate\""

$text 操作の $search 文字列に複数単語からなる文字列と個々の用語が含まれている場合、$text は複数単語からなる文字列を含むドキュメントのみと一致します。

例、この $search string は、正確な "ssl certificate" string を持つドキュメントを返します:

"\"ssl certificate\" authority key"

単語の前にハイフンマイナス (-) を付けて除外します。

  • 単語を除外すると、除外対象の単語を含めたドキュメントを検索結果から除外します。

  • 否定の単語のみを含む string はどのドキュメントとも一致しません。

  • pre-market のようなハイフン付きの単語は除外タームではありません。MongoDB はハイフンを区切り文字として扱います。market を除外するには、pre -market を使用します。

MongoDB は論理 AND の操作にすべての否定を適用します。

MongoDB、英語の theand などの言語固有のストップワードは無視されます。

大文字と小文字、発音区別符号を区別せず、$text語幹のある 単語全体をマッチングします。ドキュメントフィールドに blueberry が含まれている場合、blue$search期間は一致しません。ただし、blueberryまたは blueberries は一致します。

大文字と小文字の区別が有効になっている場合($caseSensitive: true)、接尾辞の語幹に大文字が含まれている場合、$text は正確な単語と一致します。

発音区別符号の区別が有効になっている場合($diacriticSensitive: true)、接尾辞の語幹に発音区別符号が含まれている場合、$text は正確な単語と一致します。

$textテキストインデックスの大文字と小文字を区別しないにデフォルト設定します。

  • バージョン 3 テキストインデックスでは、発音区別符号の有無にかかわらず、ラテン文字や、キリル文字など非ラテン文字では大文字と小文字が区別されません。

  • 以前のバージョンでは、発音区別符号のないラテン文字は大文字と小文字を区別しませんでした([A-z])。

テキストインデックスが大文字と小文字を区別しない場合に大文字と小文字の区別を有効にするには、 $caseSensitive: true を指定します。

$caseSensitive: true とテキストインデックスが大文字と小文字を区別しない場合、$text は次のようになります。

  • テキストインデックスのクエリで、大文字と小文字が区別されない、および発音区別符号が区別されない一致を探します。

  • 結果をフィルタリングして、指定された大文字と小文字に一致するドキュメントのみを返します。

$caseSensitive: true と接尾辞の語幹に大文字が含まれている場合、$text は正確な単語と一致します。

$caseSensitive: true を有効にすると、パフォーマンスが低下する可能性があります。

$textテキストインデックスの発音区別符号を区別せずにデフォルト設定されます。

  • バージョン 3 のテキストインデックスは、発音区別符号を区別しません。インデックスでは、発音区別符号付きの文字と含まない文字を区別しません(éêe)。

  • 以前のバージョンでは、発音区別符号が区別されます。

バージョン 3 の テキスト インデックスで発音区別符号の区別を有効にするには、$diacriticSensitive: true を指定します。

以前のテキストインデックスバージョンでは常に発音区別符号が区別されるため、$diacriticSensitive は効果がありません。

バージョン 3 のテキスト インデックスと $diacriticSensitive: true の場合、$text は次のようになります。

  • 発音区別符号を区別しないテキストインデックスをクエリします。

  • 指定されたタームの発音区別符号と一致するドキュメントのみを返すように結果をフィルタリングします。

$diacriticSensitive: true を有効にすると、パフォーマンスが低下する可能性があります。

以前のテキストインデックスバージョンでは、$diacriticSensitive: true はすでに発音区別符号を区別するテキストインデックスをクエリします。

$diacriticSensitive: true と接尾辞の語幹に発音区別符号が含まれている場合、$text は正確な単語と一致します。

Tip

$text 演算子は各結果ドキュメントにスコアを割り当てます。スコアは、特定のクエリに対するドキュメントの関連性を表します。スコアは、sort() メソッド仕様の一部だけでなく、プロジェクション式の一部にもなります。{ $meta: "textScore" } 式には $text 操作の処理に関する情報が含まれます。プロジェクションまたはソートのためのスコアへのアクセス方法の詳細については、$meta プロジェクション 演算子を参照してください。

このページの例では、sample_mflixサンプルデータセットのデータを使用します。このデータセットを自己管理型MongoDB配置にロードする方法の詳細については、サンプルデータセットをロードする を参照してください。サンプルデータベースに変更を加えた場合、このページの例を実行するには、データベースを削除して再作成する必要がある場合があります。

例では、title フィールドと fullplot フィールドに バージョン 3 のテキスト インデックスを使用することを想定しています。

db.movies.createIndex( { title: "text", fullplot: "text" } )

この例では、$searchstring に baseball を指定しています。クエリでは、インデックス付き title または fullplot フィールドに baseball の語幹付きバージョンを含むドキュメントが返されます。

db.movies.find(
{ $text: { $search: "baseball" }, runtime: { $gt: 1000 } },
{ _id: 0, title: 1, year: 1, runtime: 1 }
)
[ { title: 'Baseball', year: 1994, runtime: 1140 } ]

スペースで区切られた $search string は、各期間に対して論理 OR を実行します。MongoDB は、 期間 のいずれかを含むドキュメントを返します。

この例では、スペースで区切られた 2 つの期間を指定しています。クエリでは、インデックス付き title または fullplot フィールドに baseball または colorado の語幹付きバージョンを含むドキュメントが返されます。

db.movies.find(
{ $text: { $search: "baseball colorado" },
runtime: { $gt: 1000 } },
{ _id: 0, title: 1, year: 1, runtime: 1, fullplot: 1 }
)
[
{
runtime: 1140,
title: 'Baseball',
fullplot: 'Ken Burns relates the history of baseball in a fashion similar to that of his Civil War mini series. Old-time photos and illustrations depict the games early years, while newsreels and video clips highlight more recent developments. Players and participants speak in their own words, and sports writers and broadcasters offer commentary on the sport and events they witnessed.',
year: 1994
},
{
runtime: 1256,
title: 'Centennial',
fullplot: 'This is the story of the evolution of the town Centennial, Colorado. It follows the paths of dozens of people who come to the area for many reasons: money, freedom, or crime. It also shows the bigoted treatment of the Native Indians by the advancing US colonists. It is topped off with a murder mystery that takes 100 years to solve.',
year: 1978
}
]

複数単語を含む正確な文字列と一致するように引用符をエスケープします。

この例ではken burns というフレーズに完全に一致しています。

db.movies.find(
{ $text: { $search: "\"ken burns\"" },
runtime: { $gt: 1000 } },
{ _id: 0, title: 1, year: 1, runtime: 1, fullplot: 1 }
)
[
{
runtime: 1140,
title: 'Baseball',
fullplot: 'Ken Burns relates the history of baseball in a fashion similar to that of his Civil War mini series. Old-time photos and illustrations depict the games early years, while newsreels and video clips highlight more recent developments. Players and participants speak in their own words, and sports writers and broadcasters offer commentary on the sport and events they witnessed.',
year: 1994
}
]

この例では、2 つの正確な文字列の論理和を実行します。

db.movies.find(
{ $text: { $search: "\'ken burns\' \'centennial\'" },
runtime: { $gt: 1000 } },
{ _id: 0, title: 1, year: 1, runtime: 1, fullplot: 1 }
)
[
{
runtime: 1140,
title: 'Baseball',
fullplot: 'Ken Burns relates the history of baseball in a fashion similar to that of his Civil War mini series. Old-time photos and illustrations depict the games early years, while newsreels and video clips highlight more recent developments. Players and participants speak in their own words, and sports writers and broadcasters offer commentary on the sport and events they witnessed.',
year: 1994
},
{
runtime: 1256,
title: 'Centennial',
fullplot: 'This is the story of the evolution of the town Centennial, Colorado. It follows the paths of dozens of people who come to the area for many reasons: money, freedom, or crime. It also shows the bigoted treatment of the Native Indians by the advancing US colonists. It is topped off with a murder mystery that takes 100 years to solve.',
year: 1978
}
]

タームの前に - を付けると、そのタームを含むドキュメントを除外します。

この例では、 baseball または colorado を含むが sport は含まないドキュメントと一致します(ステミング バージョン)。

db.movies.find(
{ $text: { $search: "baseball colorado -sport" },
runtime: { $gt: 1000 } },
{ _id: 0, title: 1, year: 1, runtime: 1 }
)
[ { title: 'Centennial', year: 1978, runtime: 1256 } ]

この例ではbaseball をクエリし、$meta を使用して一致する各ドキュメントに関連性スコアを追加します。返されるドキュメントには、関連性スコアを持つ scoreフィールドが含まれています。

db.movies.find(
{ $text: { $search: "baseball" }, runtime: { $gt: 1000 } },
{ _id: 0, title: 1, year: 1,
score: { $meta: "textScore" } }
)
[
{
title: 'Baseball',
year: 1994,
score: ...
}
]

一致する上位のドキュメントを返すには、limit()sort() と併用します。

この例では、baseball または colorado を対象にクエリを実行し、スコアの降順で並べ替え、結果を上位 2 つのドキュメントに制限します。

db.movies.find(
{ $text: { $search: "baseball colorado" },
runtime: { $gt: 1000 } },
{ _id: 0, title: 1, year: 1,
score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } ).limit(2)
[
{ title: 'Baseball', year: 1994, score: ... },
{ title: 'Centennial', year: 1978, score: ... }
]

この例は、 runtime1000 より大きく、インデックス フィールドに baseball または colorado が含まれるドキュメントと一致します。year の昇順でソートし、次に関連性スコアの降順でソートします。

db.movies.find(
{ runtime: { $gt: 1000 },
$text: { $search: "baseball colorado" } },
{ _id: 0, title: 1, year: 1,
score: { $meta: "textScore" } }
).sort( { year: 1, score: { $meta: "textScore" } } )
[
{ title: 'Centennial', year: 1978, score: ... },
{ title: 'Baseball', year: 1994, score: ... }
]

このページの残りの例では、バージョン 3 テキストインデックスを持つ articlesコレクションをsubject 上で使用します。

db.articles.createIndex( { subject: "text" } )

コレクションには、次のドキュメントが含まれます。

db.articles.insertMany( [
{ _id: 1, subject: "coffee", author: "xyz", views: 50 },
{ _id: 2, subject: "Coffee Shopping", author: "efg", views: 5 },
{ _id: 3, subject: "Baking a cake", author: "abc", views: 90 },
{ _id: 4, subject: "baking", author: "xyz", views: 100 },
{ _id: 5, subject: "Café Con Leche", author: "abc", views: 200 },
{ _id: 6, subject: "Сырники", author: "jkl", views: 80 },
{ _id: 7, subject: "coffee and cream", author: "efg", views: 10 },
{ _id: 8, subject: "Cafe con Leche", author: "xyz", views: 10 }
] )

$language を使用して、$search string のストップワード、ステマー、トークナイザルールを決定する言語を指定します。

none の値に default_language を指定すると、テキストインデックスはストップワードを含むフィールド内の各単語を解析し、接尾辞の語幹を無視します。

この例では、言語として es(スペイン語)を指定しています。

db.articles.find(
{ $text: { $search: "leche", $language: "es" } }
)
[
{ _id: 5, subject: 'Café Con Leche', author: 'abc', views: 200 },
{ _id: 8, subject: 'Cafe con Leche', author: 'xyz', views: 10 }
]

spanish など、名前で言語を指定することもできます。サポートされている言語については、「自己管理型配置でのテキスト検索言語」を参照してください。

{ $meta: "textScore" }プロジェクションで式を指定せずに、 でsort() 式を指定できます。例:

db.articles.find(
{ $text: { $search: "cake" } }
).sort( { score: { $meta: "textScore" } } )

最終的に textScore を投影することなく、結果となるドキュメントを関連性で並べ替えることができます。

{ $meta: "textScore" }式をプロジェクションsort()の両方に含めると、プロジェクションとソート ドキュメントで式のフィールド名が異なる場合があります。例、次の操作では、プロジェクションは式に score という名前のフィールドを使用し、sort()ignoredName という名前のフィールドを使用します。

db.articles.find(
{ $text: { $search: "cake" } },
{ score: { $meta: "textScore" } }
).sort( { ignoredName: { $meta: "textScore" } } )

$text のデフォルトは テキストインデックスの大文字と小文字を区別せず、発音区別符号も区別しません。バージョン 3 の テキスト インデックスは、発音区別符号を持つラテン文字や、キリル文字のような非ラテン文字では、発音区別符号を区別せず、大文字と小文字を区別しません。「テキストインデックスの大文字と小文字を区別しない」および「テキストインデックスを発音区別符号を区別しない」を参照してください。

この例では、大文字と小文字を区別せず、発音区別符号も区別しないクエリを実行します。クエリは、バージョン 3 のテキスト インデックスを使用すると、次のように 語幹のある バージョンの検索タームを含むドキュメントと一致します。

db.articles.find( { $text: { $search: "сы́рники CAFÉS" } } )
[
{ _id: 6, subject: 'Сырники', author: 'jkl', views: 80 },
{ _id: 5, subject: 'Café Con Leche', author: 'abc', views: 200 },
{ _id: 8, subject: 'Cafe con Leche', author: 'xyz', views: 10 }
]

以前のテキストインデックスバージョンでは一致するドキュメントはありません。

$caseSensitive: true で大文字と小文字の区別を有効にします。これにより、パフォーマンスが低下する恐れがあります。

次の例では、Coffee に対して大文字と小文字を区別したクエリを実行します。

db.articles.find(
{ $text: { $search: "Coffee", $caseSensitive: true } }
)
[ { _id: 2, subject: 'Coffee Shopping', author: 'efg', views: 5 } ]

この例では、正確な複数単語の文字列に対して大文字と小文字を区別するクエリを実行します。

db.articles.find( {
$text: { $search: "\"Café Con Leche\"", $caseSensitive: true }
} )
[ { _id: 5, subject: 'Café Con Leche', author: 'abc', views: 200 } ]

除外するターム(-というプレフィックスが付いたターム)では大文字とユースケースできます。

次の例では、Coffee を含み、かつ shop は含まないドキュメントに対して大文字と小文字を区別するクエリを実行します(ステミング バージョン)。

db.articles.find(
{ $text: { $search: "Coffee -shop", $caseSensitive: true } }
)
[ { _id: 2, subject: 'Coffee Shopping', author: 'efg', views: 5 } ]

$diacriticSensitive: true を使用して、バージョン 3 テキスト インデックスで発音区別符号の区別を有効にします。これにより、パフォーマンスが低下する恐れがあります。

以下の例では、CAFÉ(ステミング バージョン)に対して発音区別符号を区別するクエリを実行します。

db.articles.find(
{ $text: { $search: "CAFÉ", $diacriticSensitive: true } }
)
[ { _id: 5, subject: 'Café Con Leche', author: 'abc', views: 200 } ]

除外するターム(-というプレフィックスが付いたターム)で発音区別符号を区別することができます。

以下の例では、leches を含み、かつ cafés は含まないドキュメント(ステミング バージョン)に対して、発音区別符号を区別するクエリを実行します。

db.articles.find(
{ $text: { $search: "leches -cafés", $diacriticSensitive: true } }
)
[ { _id: 8, subject: 'Cafe con Leche', author: 'xyz', views: 10 } ]

戻る

$text クエリ演算子

項目一覧