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 は、正確な文字列を指定しない限り、タームに対して論理的なOR クエリを実行します。詳細については、「 動作 」を参照してください。

$language

string

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

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

$caseSensitive

ブール値

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

$diacriticSensitive

ブール値

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

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

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

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

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

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

  • クエリに$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 をエスケープされた二重引用符(\")で囲みます。

"\"ssl certificate\""

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

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

"\"ssl certificate\" authority key"

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

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

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

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

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

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

大文字と小文字、発音区別符号を区別せず、$text 語幹のある 単語全体をマッチングします。ドキュメントフィールドにblueberry が含まれている場合、$searchblue タームは一致しません。ただし、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 }
] )

この例では、$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 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 }
]

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

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

$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 }
  • { $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 named score for the expression and the sort() uses the field named ignoredName.
    db.articles.find(
    { $text: { $search: "cake" } } ,
    { score: { $meta: "textScore" } }
    ).sort( { ignoredName: { $meta: "textScore" } } )

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

この例では coffee をクエリし、スコアの降順でソートし、結果を上位 2 つのドキュメントに制限します。

db.articles.find(
{ $text: { $search: "coffee" } },
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } ).limit(2)

この例では、 author"xyz" で、かつ subjectcoffee または bake が含まれるドキュメントが一致します。 date の昇順でソートし、次に関連性スコアの降順でソートします。

db.articles.find(
{ author: "xyz", $text: { $search: "coffee bake" } },
{ score: { $meta: "textScore" } }
).sort( { date: 1, score: { $meta: "textScore" } } )

戻る

テキスト検索演算子(自己管理型配置)

項目一覧