注意
このページでは、自己管理型(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 演算子は次のフィールドを受け入れます。
フィールド | タイプ | 説明 |
|---|---|---|
| string | MongoDB が解析し、テキストインデックスをクエリするために使用するタームのstring。 MongoDB は、正確な文字列を指定しない限り、タームに対して論理的な |
| string | 任意。ストップワード、ステマー、トークナイザのルールを決定する言語。デフォルトはインデックス言語です。サポートされている言語については、「 自己管理型配置のテキスト検索言語 」を参照してください。
|
| ブール値 | 任意。大文字と小文字の区別を有効にします。デフォルトは |
| ブール値 | 任意。バージョン 3テキスト インデックスの発音区別符号の区別を有効にします。デフォルトは です。以前のテキストインデックスバージョンでは、常に発音区別符号が区別されます。 |
デフォルトでは 、$text は結果をスコア別にソートしません。スコア並べ替えの詳細については、 テキスト スコア を参照してください。
動作
制限事項
クエリでは、
$text式を 1 つだけ指定できます。$textは$nor式には使用できません。$textは、$elemMatchクエリまたはプロジェクション式には使用できません。$or$textを使用するには、すべての 句をインデックス化する必要があります。クエリに
$text式が含まれている場合、hint()を使用してクエリに使用するインデックスを指定することはできません。を含むクエリでは
$text$natural並べ替えを使用できません。特殊なテキストインデックスを必要とする
$text式と、別のタイプの特殊インデックスを必要とするクエリ 演算子を組み合わせることはできません。たとえば、$text式を$near演算子と組み合わせることはできません。ビューは
$textをサポートしていません。Stable API V1 はインデックス作成用の
$textをサポートしていません。
集計で $text 演算子を使う場合、以下の制限も適用されます。
$search フィールド
$searchフィールドに、 MongoDB がテキストインデックスをクエリするのに使用する単語を指定します。
注意
$searchフィールドはMongoDB Atlas $search集計ステージとは異なります。 $searchステージは全文検索を提供し、 MongoDB Atlasでのみ利用できます。
正確な文字列
個々の用語ではなく、複数の単語を含む正確な文字列を照合するには、次のように string をエスケープされた二重引用符(\")で囲みます。
"\"ssl certificate\""
$text 操作の $search 文字列に複数単語からなる文字列と個々の用語が含まれている場合、$text は複数単語からなる文字列を含むドキュメントのみと一致します。
例、この$search string は、正確な string"ssl certificate" を持つドキュメントを返します:
"\"ssl certificate\" authority key"
除外
単語の前にハイフンマイナス (-) を付けて除外します。
単語を除外すると、除外対象の単語を含めたドキュメントを検索結果から除外します。
否定の単語のみを含む string はどのドキュメントとも一致しません。
pre-marketのようなハイフン付きの単語は除外タームではありません。 MongoDB はハイフンを区切り文字として扱います。marketを除外するには、pre -marketを使用します。
MongoDB は論理 AND の操作にすべての否定を適用します。
一致操作
ストップワード
MongoDB、英語の the や and などの言語固有のストップワードは無視されます。
語幹付き単語
大文字と小文字、発音区別符号を区別せず、$text は 語幹のある 単語全体をマッチングします。ドキュメントフィールドにblueberry が含まれている場合、$search のblue タームは一致しません。ただし、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 プロジェクション 演算子を参照してください。
例
次の例では、articles 上のバージョン テキストインデックスを持つ3 コレクションを使用します。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 } ] )
1 つの単語を検索
この例では、$search string に coffee を指定しています。
db.articles.find( { $text: { $search: "coffee" } } )
これにより、インデックスされた subjectフィールドに coffee の語幹付きバージョンを含むドキュメントが返されます。
{ _id: 1, subject: 'coffee', author: 'xyz', views: 50 }, { _id: 7, subject: 'coffee and cream', author: 'efg', views: 10 }, { _id: 2, subject: 'Coffee Shopping', author: 'efg', views: 5 }
任意の検索タームに一致する
スペースで区切られた $search string は、各タームに対して論理 OR を実行します。 MongoDB は、 ターム のいずれかを含むドキュメントを返します。
この例では、スペースで区切られた 3 つのタームを指定します。
db.articles.find( { $text: { $search: "bake coffee cake" } } )
これにより、インデックス付きbake coffeecakeフィールドに または またはsubject の語幹付きバージョンを含むドキュメントが返されます。
{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg", "views" : 5 } { "_id" : 7, "subject" : "coffee and cream", "author" : "efg", "views" : 10 } { "_id" : 1, "subject" : "coffee", "author" : "xyz", "views" : 50 } { "_id" : 3, "subject" : "Baking a cake", "author" : "abc", "views" : 90 } { "_id" : 4, "subject" : "baking", "author" : "xyz", "views" : 100 }
完全一致の string を検索
複数単語を含む正確な文字列と一致するように引用符をエスケープします。
この例ではstring coffee shop と完全に一致しています。
db.articles.find( { $text: { $search: "\"coffee shop\"" } } )
この操作は coffee shop という文字列を含むドキュメントを返します。
{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg", "views" : 5 }
この例では、2 つの正確な文字列の論理和を実行します。
db.articles.find( { $text: { $search: "\'coffee shop\' \'Cafe con Leche\'" } } )
これでは、両方の string のタームを持つドキュメントを含む、いずれかの string を含むドキュメントが返されます。
[ { _id: 8, subject: 'Cafe con Leche', author: 'xyz', views: 10 }, { _id: 5, subject: 'Café Con Leche', author: 'abc', views: 200 }, { _id: 1, subject: 'coffee', author: 'xyz', views: 50 }, { _id: 7, subject: 'coffee and cream', author: 'efg', views: 10 }, { _id: 2, subject: 'Coffee Shopping', author: 'efg', views: 5 } ]
Tip
タームを含むドキュメントを除外する
タームの前に - を付けると、そのタームを含むドキュメントを除外します。
この例では、 coffee を含むが shop は含まないドキュメント(ステミング バージョン)が一致します。
db.articles.find( { $text: { $search: "coffee -shop" } } )
この操作により、次のドキュメントが返されます。
{ "_id" : 7, "subject" : "coffee and cream", "author" : "efg", "views" : 10 } { "_id" : 1, "subject" : "coffee", "author" : "xyz", "views" : 50 }
異なる言語のクエリ
$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など、名前で言語を指定することもできます。サポートされている言語については、「 自己管理型配置でのテキスト検索言語 」を参照してください。
Tip
大文字と小文字、発音区別符号を区別しない
$text のデフォルトは テキストインデックスの大文字と小文字を区別せず、発音区別符号も区別しません。バージョン の テキスト3 インデックスは、発音区別符号を持つラテン文字や、キリル文字のような非ラテン文字では、発音区別符号を区別せず、大文字と小文字を区別しません。 「 テキストインデックスの大文字と小文字を区別しない 」および「 テキストインデックスを発音区別符号を区別しない 」を参照してください。
この例では、大文字と小文字を区別せず、発音区別符号も区別しないクエリを実行します。
db.articles.find( { $text: { $search: "сы́рники CAFÉS" } } )
バージョン 3 のテキスト インデックスを使用すると、これは次と一致します。
{ "_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" }
発音区別符号の区別
を使用して、バージョン テキスト インデックスで発音区別符号の区別を有効にします。これにより、パフォーマンスが低下する恐れがあります。3$diacriticSensitive: true
発音区別符号を区別するターム検索
以下の例では、CAFÉ(ステミング バージョン)に対して発音区別符号を区別するクエリを実行します。
db.articles.find( { $text: { $search: "CAFÉ", $diacriticSensitive: true } } )
これは次の場合にのみ一致します。
{ "_id" : 5, "subject" : "Café Con Leche", "author" : "abc" }
発音区別符号を区別する除外ターム検索
除外するターム(-というプレフィックスが付いたターム)で発音区別符号を区別することができます。
以下の例では、leches を含み、かつ cafés は含まないドキュメント(ステミング バージョン)に対して、発音区別符号を区別するクエリを実行します。
db.articles.find( { $text: { $search: "leches -cafés", $diacriticSensitive: true } } )
これは次と一致します。
{ "_id" : 8, "subject" : "Cafe con Leche", "author" : "xyz" }
関連性スコアの例え
関連性スコアを返す
この例ではcake をクエリし、$meta を使用して一致する各ドキュメントに関連性スコアを追加します。
db.articles.find( { $text: { $search: "cake" } }, { score: { $meta: "textScore" } } )
返されるドキュメントには、関連性スコアを持つ scoreフィールドが含まれています。
{ "_id" : 3, "subject" : "Baking a cake", "author" : "abc", "views" : 90, "score" : 0.75 }
Tip
関連性スコアによる並べ替え
{ $meta: "textScore" }プロジェクションで式を指定せずに、 でsort()式を指定できます。例:db.articles.find( { $text: { $search: "cake" } } ).sort( { score: { $meta: "textScore" } } ) 最終的に
textScoreを投影することなく、結果となるドキュメントを関連性で並べ替えることができます。{ $meta: "textScore" }式を投影とsort()の両方に含めると、投影ドキュメントとソート ドキュメントで式のフィールド名が異なる場合があります。For example, in the following operation, the projection uses a field namedscorefor the expression and thesort()uses the field namedignoredName.db.articles.find( { $text: { $search: "cake" } } , { score: { $meta: "textScore" } } ).sort( { ignoredName: { $meta: "textScore" } } )
Tip
一致するドキュメントの上位 2 件を返す
一致する上位 limit()sort()件のドキュメントを返すには、 を と併用します。
この例では coffee をクエリし、スコアの降順でソートし、結果を上位 2 つのドキュメントに制限します。
db.articles.find( { $text: { $search: "coffee" } }, { score: { $meta: "textScore" } } ).sort( { score: { $meta: "textScore" } } ).limit(2)
Tip
$text と他のクエリおよびソート操作との組み合わせ
この例では、 author が "xyz" で、かつ subject に coffee または bake が含まれるドキュメントが一致します。 date の昇順でソートし、次に関連性スコアの降順でソートします。
db.articles.find( { author: "xyz", $text: { $search: "coffee bake" } }, { score: { $meta: "textScore" } } ).sort( { date: 1, score: { $meta: "textScore" } } )