span
定義
注意
span
演算子は非推奨です。 代わりに、 フレーズ演算子を使用してください。
span
span
演算子は、テキストフィールドのリージョン内に一致するテキスト検索を検索します。 これを使用して、指定された精度で相互に近い文字列を検索できます。span
演算子は、クエリが位置情報を追跡する必要があるため、他の演算子よりも計算が集中しています。span
はタームレベルの演算子であり、query
フィールドは分析されないことを意味します。 タームレベルの演算子はキーワード アナライザと連携します。query
フィールドは特殊文字を含む 1 つのタームとして扱われるためです。span
クエリはスコアによってランク付けされません。
構文
span
の構文は次のとおりです。
{ $search: { "index": <index name>, // optional, defaults to "default" "span": { "term" | <positional-operator>": { <operator-specification> } } } }
注意
span
検索クエリでは、複合演算子を使用できません。
ターム演算子
検索するタームを指定するには、 term
演算子を使用します。 term
演算子は必須であり、 span
位置演算子とともに使用する場合は、位置演算子の最も遠い子である必要があります。
構文
term
演算子の構文は次のとおりです。
"term": { "path": "<path-to-field>", "query": "<terms-to-search>" }
フィールド
term
演算子は次のフィールドを取ります。
オプション | タイプ | 必須 | 説明 |
---|---|---|---|
| string | はい | 検索するインデックス付きフィールド。 |
| string | はい | 検索するタームまたはフレーズ。 |
位置演算子
位置演算子 を使用して、ターム演算子 で検索するタームの位置を指定できます。 位置演算子はdocument
型です。 span
演算子クエリでは少なくとも 1 つの位置演算子を指定する必要があります。 位置演算子は、他のspan
位置演算子を再帰的に受け入れることができます。
注意
例について
このページの例では、 sample_mflix.movies
コレクションを使用しています。 サンプル データをロード default
し、 映画コレクション に という名前の$search
動的 インデックスを 作成 すると、コレクションに対して次の サンプル クエリを実行できます。サンプル クエリでは、 $limit
ステージを使用して結果を5
ドキュメントに制限し、 $project
ステージを使用して結果のtitle
フィールドを除くすべてのフィールドを除外します。
span
では、次の任意の位置演算子があります。
contains
contains
の位置演算子は、他のタームに含まれるタームと一致します。 検索タームを指定するには、位置演算子を再帰的に使用することも、 contains
内のターム演算子のみを使用することもできます。
構文
contains
の位置演算子は、次の構文をとります。
{ "$search": { "span": { "contains": { "spanToReturn": "inner"|"outer", "little": { <positional-or-term-operator-specification> }, "big": { <positional-or-term-operator-specification> } } } } }
フィールド
位置演算子contains
は次のフィールドを取ります。
フィールド | タイプ | 必須 | 説明 |
---|---|---|---|
| ドキュメント | はい | |
| ドキュメント | はい | |
| ドキュメント | no | この検索の結果に適用する スコア 。 |
| string | はい | 実行するクエリのタイプと、返される一致する結果のタイプ。 値は次のいずれかになります。
|
例
次のクエリの例では、 span.contains
を使用して、用語train
が用語great
とrobbery
とともに表示されるドキュメントを検索します。ここで、 great
とrobbery
は最大title
5の位置にある可能性があり、 フィールド
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "span": { 5 "contains": { 6 "spanToReturn": "outer", 7 "little": { 8 "term": { 9 "path": "title", 10 "query": "train" 11 } 12 }, 13 "big": { 14 "near": { 15 "clauses": [ 16 { 17 "term": { 18 "path": "title", 19 "query": "great" 20 } 21 }, 22 { 23 "term": { 24 "path": "title", 25 "query": "robbery" 26 } 27 } 28 ], 29 "slop": 5 30 } 31 } 32 } 33 } 34 } 35 }, 36 { 37 "$limit": 5 38 }, 39 { 40 "$project": { 41 "_id": 0, 42 "title": 1 43 } 44 } 45 ])
[ { title: 'The Great Train Robbery' }, { title: 'The Great Train Robbery' }, { title: "The Great St. Trinian's Train Robbery" } ]
Atlas Search では、 great
とrobbery
というターム( big
を使用して指定)内にタームtrain
( little
を使用して指定)を含むドキュメントが返されます。 を spanToReturn
6inner
に設定すると、Atlas Search は同じドキュメントを返します。これは、 というターム(train
little
を使用して指定)が とgreat
robbery
というターム(big
を使用して指定)に出現するため です 。 )。
first
位置演算子first
は、指定された数値を使用して検索タームの位置を識別します。 検索タームは、位置演算子を使用して再帰的に指定することも、ターム演算子のみを使用することもできます。 span
は、検索タームの位置が指定された数以下のドキュメントに一致します。
構文
first
の位置演算子は、次の構文をとります。
{ "$search": { "span": { "first": { "endPositionLte": <term-position>, "operator": { <span-positional-or-term-operator-specification> }, "score": { <score-options> } } } } }
フィールド
位置演算子first
は次のフィールドを取ります。
例
次のクエリの例では、 span.first
を使用して、指定された string がtitle
フィールドに表示されるドキュメントを検索します。 endPositionLte
パラメータの値は2
です。つまり、 term
演算子を使用して指定される検索タームは、 フィールドの最初または 2 番目の単語である必要があります。
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "span": { 5 "first": { 6 "endPositionLte": 2, 7 "operator": { 8 "term": { 9 "path": "title", 10 "query": "dance" 11 } 12 } 13 } 14 } 15 } 16 }, 17 { 18 "$limit": 5 19 }, 20 { 21 "$project": { 22 "_id": 0, 23 "title": 1 24 } 25 } 26 ])
[ { title: 'Dance Program' }, { title: 'Slam Dance' }, { title: 'Last Dance' }, { title: 'War Dance' }, { title: 'Delhi Dance' } ]
Atlas Search では、 title
フィールドの最初または 2 番目の位置に検索単語dance
が含まれるドキュメントが返されます。
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "span": { 5 "first": { 6 "endPositionLte": 2, 7 "operator": { 8 "or": { 9 "clauses": [ 10 { "term": { "path": "title", "query": "man" } }, 11 { "term": { "path": "title", "query": "woman" } } 12 ] 13 } 14 } 15 } 16 } 17 } 18 }, 19 { 20 "$limit": 5 21 }, 22 { 23 "$project": { 24 "_id": 0, 25 "title": 1 26 } 27 } 28 ])
[ { title: "Everybody's Woman" }, { title: 'Marked Woman' }, { title: 'Wonder Man' }, { title: 'Designing Woman' }, { title: 'Watermelon Man' } ]
Atlas Search では、 title
フィールドの最初または 2 番目の位置に検索単語man
またはwoman
が含まれるドキュメントが返されます。 Atlas Search では、検索タームを指定するためにor
演算子clauses
が含まれているため、同じtitle
内の両方の検索タームは返されません。
near
near
は、検索タームを含む 2 つ以上の句と一致します。 検索タームは、位置演算子のリストを再帰的に使用することも、ターム演算子のみを使用して指定することもできます。
構文
near
の位置演算子は、次の構文をとります。
{ "$search": { "span": { "near": { "clauses": [ { <span-positional-or-term-operator-specification> }, ... ], "slop": <distance-number>, "inOrder": true|false } } } }
フィールド
位置演算子near
は次のフィールドを取ります。
フィールド | タイプ | 必須 | 説明 |
---|---|---|---|
| ドキュメントの配列 | はい | |
| ブール値 | no | 句内のタームの検索が指定された順序に従い、重複してはなりませんという条件を指定するフラグ。 値は次のいずれかになります。
省略した場合、デフォルトは |
| ドキュメント | no | この検索の結果に適用する スコア 。 |
| integer | no | 句内のターム間の許容距離。 値が低いほどターム間の位置的距離が短くなり、値が大きいとクエリを満たす単語間の距離が長くなります。 デフォルトは |
例
次のクエリ例では、 span.near
を使用して、string prince
とpauper
が相互に近くで見つかったドキュメントを検索します。 inOrder
パラメータはfalse
に設定されているため、検索タームは任意の順序で使用できます。 slop
パラメータは4
に設定されているため、検索タームは最大 4 単語のみで区切ることができます。
1 db.movies.aggregate([ 2 { 3 "$search" : { 4 "span": { 5 "near": { 6 "clauses": [ 7 { "term": { "path": "title", "query": "prince" } }, 8 { "term": { "path": "title", "query": "pauper" } } 9 ], 10 "slop": 4, 11 "inOrder": false 12 } 13 } 14 } 15 }, 16 { 17 "$limit": 5 18 }, 19 { 20 "$project": { 21 "_id": 0, 22 "title": 1 23 } 24 } 25 ])
[ { title: 'The Prince and the Pauper' } ]
Atlas Search では、検索単語「 prince
」と「 pauper
」を含むドキュメントが 4 単語未満で区切られたドキュメントがtitle
フィールドに返されます。
or
or
は、2 つ以上の 句のいずれかに一致します。 検索タームは、位置演算子のリストを再帰的に使用することも、ターム演算子のみを使用して指定することもできます。
構文
or
の位置演算子は、次の構文をとります。
{ "$search": { "span": { "or": { "clauses": [ { <span-positional-or-term-operator-specification> }, ... ], "score": { <scoring-options> } } } } }
フィールド
位置演算子or
は次のフィールドを取ります。
例
次のクエリの例では、 span.or
句を使用して、 title
フィールドにcity
またはcountry
のいずれかがあるドキュメントを検索する 2タームの演算子クエリを指定します。
1 db.movies.aggregate([ 2 { 3 "$search" : { 4 "span": { 5 "or": { 6 "clauses": [ 7 { "term": { "path": "title", "query": "city" } }, 8 { "term": { "path": "title", "query": "country" } } 9 ], 10 } 11 } 12 } 13 }, 14 { 15 "$limit": 5 16 }, 17 { 18 "$project": { 19 "_id": 0, 20 "title": 1 21 } 22 } 23 ])
[ { title: 'Country' }, { title: 'City Lights' }, { title: 'King & Country' }, { title: 'Fat City' }, { title: 'Atlantic City' } ]
Atlas Search では、検索単語city
またはcountry
を含むドキュメントがtitle
フィールドに返されますが、同じtitle
には両方とも返されません。
subtract
subtract
の位置演算子は、別の一致と重複する一致を削除します。 検索タームは、位置演算子のリストを再帰的に使用することも、ターム演算子のみを使用して指定することもできます。 subtract
句を使用すると、検索結果から特定の文字列を除外できます。
構文
subtract
の位置演算子は、次の構文をとります。
{ "$search": { "span": { "subtract": { "include": { <span-positional-or-term-operator-specification> }, "exclude": { <span-positional-or-term-operator-specification> } } } } }
フィールド
位置演算子subtract
は次のフィールドを取ります。
例
次のクエリ例では、 span.subtract
を使用して、 title
フィールドにfather
とson
という単語が含まれているドキュメントを、相互に3単語以内に任意の順序で検索します。 ただし、 father
とson
の間に単語like
が出現するドキュメントは除外されます。
1 db.movies.aggregate([ 2 { 3 "$search" : { 4 "span": { 5 "subtract": { 6 "include": { 7 "near": { 8 "clauses": [ 9 { "term": { "path": "title", "query": "father" } }, 10 { "term": { "path": "title", "query": "son" } } 11 ], 12 "inOrder": false, 13 "slop": 3 14 } 15 }, 16 "exclude": { "term": { "path": "title", "query": "like" } } 17 } 18 } 19 } 20 }, 21 { 22 "$limit": 5 23 }, 24 { 25 "$project": { 26 "_id": 0, 27 "title": 1 28 } 29 } 30 ])
[ { title: 'Father, Son & Holy Cow' }, { title: 'My Father and My Son' }, { title: 'Jimmy Rosenberg: The Father, the Son & the Talent' } ]
Atlas SearchLike Father Like
Son
title
father
son
like
exclude
では次のドキュメントが返されません:クエリを実行します。