span
定义
注意
span
操作符已弃用。请改用 phrase 操作符。
span
span
操作符查找文本字段区域内的Atlas Search匹配文本。 您可以使用它以指定的精度查找彼此接近的字符串。 与其他操作符相比,span
操作符的计算量更大,因为查询必须跟踪位置信息。span
是术语级操作符,这意味着不分析query
字段。术语级操作符适用于关键字分析器,因为query
字段被视为包含特殊字符的单个术语。span
查询不按分数排名。
语法
span
通过以下语法实现:
{ $search: { "index": <index name>, // optional, defaults to "default" "span": { "term" | <positional-operator>": { <operator-specification> } } } }
注意
span
搜索查询不能使用复合操作符。
术语操作符
您可以使用 term
操作符将搜索词指定为Atlas Search 。 term
操作符是必需的,当您将其与span
位置操作符一起使用时,它必须是位置操作符的最内层子操作符。
语法
term
操作符的语法如下:
"term": { "path": "<path-to-field>", "query": "<terms-to-search>" }
字段
term
操作符采用以下字段:
选项 | 类型 | 必需? | 说明 |
---|---|---|---|
path | 字符串 | 是 | 要搜索的索引字段。 |
query | 字符串 | 是 | Atlas Search的术语或短语。 |
位置操作符
您可以使用位置操作符来指定要使用Atlas Search 术语 操作符在 中搜索的术语的位置。位置操作符的类型为document
。 您必须在span
操作符查询中指定至少一个位置操作符。 位置操作符可以递归地获取其他span
位置操作符。
注意
关于示例
span
采用以下可选位置操作符。
contains
contains
位置操作符匹配其他术语中包含的术语。 您可以递归使用位置操作符,也可以仅使用 contains
中的术语操作符来指定Atlas Search术语。
语法
contains
位置操作符采用以下语法:
{ "$search": { "span": { "contains": { "spanToReturn": "inner"|"outer", "little": { <positional-or-term-operator-specification> }, "big": { <positional-or-term-operator-specification> } } } } }
字段
contains
位置操作符采用以下字段:
字段 | 类型 | 必需? | 说明 |
---|---|---|---|
big | 文档 | 是 | |
little | 文档 | 是 | |
score | 文档 | no | 要应用于此Atlas Search结果的分数。 |
spanToReturn | 字符串 | 是 | 要执行的查询类型和要返回的匹配结果。 值可以是以下之一:
|
例子
以下示例查询使用span.contains
查找词语train
与词语great
和robbery
一起出现的文档,其中great
和robbery
5 title
字段。
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
行上的6 设置为inner
,Atlas Search 会返回相同的文档,因为词语train
(使用little
指定)出现 在 词语great
和robbery
(使用big
指定)中。 )。
first
first
位置操作符使用指定的数字标识Atlas Search词语的位置。 您可以使用Atlas Search 位置运算符 以递归方式指定 词语,也可以仅使用 词语 运算符。span
匹配Atlas Search词的位置小于或等于指定数字的文档。
语法
first
位置操作符采用以下语法:
{ "$search": { "span": { "first": { "endPositionLte": <term-position>, "operator": { <span-positional-or-term-operator-specification> }, "score": { <score-options> } } } } }
字段
first
位置操作符采用以下字段:
例子
以下示例查询使用 span.first
来查找 title
字段中出现指定string的文档。 endPositionLte
参数的值为 2
,这意味着使用 term
操作符指定的Atlas Search词语必须是该字段中的第一个或第二个单词。
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
字段的第一个或第二个位置中包含搜索词 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
字段的第一个或第二个位置中包含搜索词 man
或 woman
的文档。Atlas Search 不会在同一 title
返回两个搜索词,因为该示例包含 or
操作符 clauses
来指定搜索词。
near
near
位置操作符匹配两个或多个包含彼此相邻的Atlas Search词的子句。 您可以使用Atlas Search 位置操作符 列表以递归方式指定 术语,也可以仅使用 术语 操作符。
语法
near
位置操作符采用以下语法:
{ "$search": { "span": { "near": { "clauses": [ { <span-positional-or-term-operator-specification> }, ... ], "slop": <distance-number>, "inOrder": true|false } } } }
字段
near
位置操作符采用以下字段:
字段 | 类型 | 必需? | 说明 |
---|---|---|---|
clauses | 文档数组 | 是 | |
inOrder | 布尔 | no | 该标志指定Atlas Search是否必须按指定的顺序搜索子句中的术语并且不能重叠。 值可以是以下值之一:
如果省略,则默认值为 |
score | 文档 | no | 要应用于此Atlas Search结果的分数。 |
slop | 整型 | no | 子句中术语之间的允许距离。 较低的值允许词语之间的位置距离较小,较大的值允许词语之间的距离较大,以满足查询要求。 默认值为 0 ,这意味着不同子句中的单词必须相邻才能被视为匹配。 |
例子
以下示例查询使用 span.near
Atlas Search字符串 prince
和 pauper
彼此接近的文档。 inOrder
参数设置为 false
,因此Atlas Search词语可以按任意顺序排列。 slop
参数设置为 4
,因此Atlas Search术语最多只能用 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在 title
字段中返回包含Atlas Search单词 prince
和 pauper
的文档,这些单词之间的间隔少于四个单词。
or
or
位置操作符匹配两个或多个子句中的任何一个。 您可以使用Atlas Search 位置操作符 列表以递归方式指定 术语,也可以仅使用 术语 操作符。
语法
or
位置操作符采用以下语法:
{ "$search": { "span": { "or": { "clauses": [ { <span-positional-or-term-operator-specification> }, ... ], "score": { <scoring-options> } } } } }
字段
or
位置操作符采用以下字段:
例子
以下示例查询使用span.or
Atlas Searchtitle
子句指定 字段包含city
或 的文档的两个 词country
操作符查询。
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返回在 title
字段中包含Atlas Search词 city
或 country
的文档,但不会在同一 title
中包含这两个词。
subtract
subtract
位置操作符会删除与其他匹配项重叠的匹配项。 您可以使用Atlas Search 位置操作符 列表以递归方式指定 术语,也可以仅使用 术语 操作符。subtract
子句可用于从Atlas Search结果中排除某些字符串。
语法
subtract
位置操作符采用以下语法:
{ "$search": { "span": { "subtract": { "include": { <span-positional-or-term-operator-specification> }, "exclude": { <span-positional-or-term-operator-specification> } } } } }
字段
subtract
位置操作符采用以下字段:
例子
以下示例查询使用 span.subtract
Atlas Search以下文档: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 Search 不会返回标题为Like Father Like
Son
的文档,因为尽管title
字段包含单词father
和son
,但它们之间还有like
,位于以下内容的exclude
条件中:查询。