如何使用加权字段运行 Atlas Search 复合查询
本教程演示了如何为搜索字段添加权重,以提升或隐藏结果或结果类别中的文档。它演示了如何将一个或多个值分配给字段,以返回得分较高或较低的结果。
具体而言,本教程演示了如何在 sample_mflix.movies
集合上创建具有动态映射的索引。它展示了如何使用 constant
、function
和 boost
运行复合查询并更改分数。它将引导您完成以下步骤:
为
sample_mflix.movies
集合设置具有动态映射的 Atlas Search 索引。运行以下 Atlas Search 查询:
查询
year
字段,并使用title
字段中的特定单词更改分数,以提高文档在结果中的排名。查询
title
和plot
字段,并根据genres
字段中的特定类型更改分数,以隐藏该类型中的结果。
开始之前,请确保 Atlas 集群满足先决条件中所述的要求。
要创建 Atlas Search 索引,您必须拥有 Project Data Access Admin
或更高的项目访问权限。
使用动态映射创建 Atlas Search 索引
在本部分中,我们将创建一个 Atlas Search 索引,该索引使用动态映射为 sample_mflix.movies
集合的字段编制索引。
AtlasGoClusters在Atlas中,Go项目的 页面。
如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含所需项目的组织。
如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。
如果尚未出现,请单击侧边栏中的 Clusters(集群)。
显示 集群页面。
输入 Index Name(索引名称),然后设置 Database and Collection(数据库和集合)。
在 Index Name 字段中输入
compound-query-custom-score-tutorial
。如果将索引命名为
default
,则在使用 $search 管道阶段时无需指定index
参数。如果您为索引指定了自定义名称,则必须在index
参数中指定此名称。在 Database and Collection(数据库和集合)部分中找到
sample_mflix
数据库,然后选择movies
集合。
指定索引定义。
您可以创建使用动态映射或静态映射的 Atlas Search 索引。要了解有关动态和静态映射的更多信息,请参阅静态和动态映射。
以下索引定义对 movies
集合中的支持类型字段动态创建索引。您可以使用 Atlas Search Visual Editor 或 Atlas Search JSON Editor 在 Atlas 用户界面中创建索引。
可视化编辑器
单击 Next(连接)。
查看
movies
集合的"default"
索引定义。
JSON 编辑器
单击 Next(连接)。
查看索引定义。
索引定义应类似于以下内容:
{ "mappings": { "dynamic": true } } 上述索引定义对
movies
集合中每个文档中的支持类型字段动态创建索引。单击 Next(连接)。
运行复合查询
您可以使用复合操作符将两个或多个操作符组合成一个查询。Atlas Search 会根据相关性,按照从高分到低分的顺序,为查询返回的每个文档分配分数。这些查询演示了如何在结果中提升或隐藏文档。
➤ 使用选择语言下拉菜单设置本节中示例的语言。
提示
Atlas Search 提供一个包含指导的示例复合查询模板。要了解更多信息,请参阅查看查询指导模板。
运行复合查询以提升结果
在本节中,您将连接到 Atlas 集群,并使用复合操作符针对 sample_mflix.movies
集合中的 title
和 year
字段运行示例查询。示例查询使用自定义评分来更改 Atlas Search 对包含 snow
一词的电影标题返回的相关性分数。
AtlasGoClusters在Atlas中,Go项目的 页面。
如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含所需项目的组织。
如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。
如果尚未出现,请单击侧边栏中的 Clusters(集群)。
会显示集群页面。
使用 compound
操作符对 movies
集合运行以下 Atlas Search 查询。
将以下查询复制并粘贴到 Query Editor 中,然后点击 Query Editor 中的 Search 按钮。
以下示例使用带有子查询的 compound
操作符来搜索 2013
至 2015
年间且 title
字段中包含词语 snow
的电影。
以下查询:
使用以下
compound
操作符子句:指定突出显示选项,从
title
字段返回与查询匹配的代码段。这些代码段包含使用type: 'hit'
指定的匹配文本以及使用type: 'text'
指定的相邻文本。
[ { $search: { index: "compound-query-custom-score-tutorial", compound: { filter: [{ range: { path: "year", gte: 2013, lte: 2015 } }], should: [{ text: { query: "snow", path: "title", score: {constant: {value: 5}} } }] }, highlight:{ path: "title" } } } ]
SCORE: 5 _id: "573a13d7f29313caabda38ad" Snow in Paradise Matching fields: title SCORE: 5 _id: "573a13e2f29313caabdbeded" Dead Snow 2: red vs. Matching fields: title SCORE: 5 _id: "573a13e6f29313caabdc66c4" The Snow White Murder Case Matching fields: title SCORE: 5 _id: "573a13edf29313caabdd37bd" Snow on the Blades Matching fields: title SCORE: 0 _id: "573a13acf29313caabd29366" No highlights found. Matching fields: unknown SCORE: 0 _id: "573a13adf29313caabd2b765" No highlights found. Matching fields: unknown SCORE: 0 _id: "573a13b0f29313caabd333e7" No highlights found. Matching fields: unknown SCORE: 0 _id: "573a13b0f29313caabd3486a" No highlights found. Matching fields: unknown SCORE: 0 _id: "573a13b1f29313caabd3719d" No highlights found. Matching fields: unknown SCORE: 0 _id: "573a13b2f29313caabd3abb9" No highlights found. Matching fields: unknown
结果中列出的前四个文档评分较高,因为查询中的 should
子句将标题中包含 snow
的文档指定为首选项。should
子句还使用 constant
选项更改了查询词 snow
的分数。
以下查询:
使用以下
compound
操作符子句:指定突出显示选项,从
title
字段返回与查询匹配的代码段。这些代码段包含使用type: 'hit'
指定的匹配文本以及使用type: 'text'
指定的相邻文本。
[ { $search: { index: "compound-query-custom-score-tutorial", compound: { must: [{ range: { path: "year", gte: 2013, lte: 2015 } }], should: [{ text: { query: "snow", path: "title", score: {boost: {value: 2}} } }] }, highlight:{ path: "title" } } } ]
SCORE: 6.7722930908203125 _id: "573a13d7f29313caabda38ad" Snow in Paradise Matching fields: title SCORE: 6.063445568084717 _id: "573a13edf29313caabdd37bd" Snow on the Blades Matching fields: title SCORE: 5.509652137756348 _id: "573a13e6f29313caabdc66c4" The Snow White Murder Case Matching fields: title SCORE: 5.065053939819336 _id: "573a13e2f29313caabdbeded" Dead Snow 2: Red vs. Matching fields: title SCORE: 1 _id: "573a13acf29313caabd29366" No highlights found. Matching fields: unknown SCORE: 1 _id: "573a13adf29313caabd2b765" No highlights found. Matching fields: unknown SCORE: 1 _id: "573a13b0f29313caabd333e7" No highlights found. Matching fields: unknown SCORE: 1 _id: "573a13b0f29313caabd3486a" No highlights found. Matching fields: unknown SCORE: 1 _id: "573a13b1f29313caabd3719d" No highlights found. Matching fields: unknown SCORE: 1 _id: "573a13b2f29313caabd3abb9" No highlights found. Matching fields: unknown
结果中列出的前四个文档评分较高,因为查询中的 should
子句将标题中包含 snow
的文档指定为首选项。should
子句还使用 boost
选项更改了查询词 snow
的分数。
以下查询:
将以下
compound
操作符子句与boost
选项结合使用,使某些字段的优先级高于其他字段:must
带文本操作符的子句优先考虑comedy
类型,然后是title
字段中的术语snow
。boost
选项将权重应用于字段。should
带有范围操作符的子句,用于搜索2013
到2015
年之间的电影。
注意
boost
选项会对字段应用不同的权重,以确定字段的优先级。
[ { $search: { index: "compound-query-custom-score-tutorial", compound: { must: [{ text: { query: "comedy", path: "genres", score: {boost: {value: 9}} } }, { text: { query: "snow", path: "title", score: {boost: {value: 5}} } }], should: [{ range: { path: "year", gte: 2013, lte: 2015, score: {boost: {value: 3}} } }] } } } ]
SCORE: 21.872983932495117 _id: "573a13c2f29313caabd6874c" plot: "A ski vacation turns horrific for a group of medical students, as they…" genres: Array runtime: 91 SCORE: 21.043487548828125 _id: "573a139ff29313caabcffff8" fullplot: "When an entire town in upstate New York is closed down by an unexpecte…" imdb: Object year: 2000 SCORE: 21.043487548828125 _id: "573a13a6f29313caabd16b02" plot: "When a Miami dentist inherits a team of sled dogs, he's got to learn t…" genres: Array runtime: 99 SCORE: 19.523927688598633 _id: "573a13a1f29313caabd06765" fullplot: "Our two young lovers meet on a series of snowy days in high school. Ye…" imdb: Object runtime: 1999 SCORE: 17.426334381103516 _id: "573a13e2f29313caabdbeded" plot: "Still on the run from a group of Nazi zombies, a man seeks the aid of …" genres: Array runtime: 100 SCORE: 16.367326736450195 _id: "573a13c2f29313caabd6688e" countries: Array genres: Array runtime: 108 SCORE: 15.537829399108887 _id: "573a13b1f29313caabd36d7d" plot: "A love-struck Italian poet is stuck in Iraq at the onset of an America…" genres: Array runtime: 110 SCORE: 14.4263334274292 _id: "573a1395f29313caabce1925" plot: "An ice-skating Snow White finds refuge from the Wicked Queen with the …" genres: Array runtime: 107
以下查询:
使用以下
compound
操作符子句:指定突出显示选项,从
title
字段返回与查询匹配的代码段。这些代码段包含使用type: 'hit'
指定的匹配文本以及使用type: 'text'
指定的相邻文本。
[ { $search: { index: "compound-query-custom-score-tutorial", compound: { must: [{ range: { path: "year", gte: 2013, lte: 2015, } }], should: [{ text: { query: "snow", path: "title", score: { function: { add: [{ path: { value: "imdb.rating", undefined: 2 } }, { score: "relevance" }] } } } }] }, highlight: { path: "title" } } } ]
SCORE: 10.454826354980469 _id: "573a13e6f29313caabdc66c4" The Snow White Murder Case Matching fields: title SCORE: 10.3317232131958 _id: "573a13edf29313caabdd37bd" Snow on the Blades Matching fields: title SCORE: 10.032526969909668 _id: "573a13e2f29313caabdbeded" Dead Snow 2: Red vs. Matching fields: title SCORE: 8.386146545410156 _id: "573a13d7f29313caabda38ad" Snow in Paradise Matching fields: title SCORE: 1 _id: "573a13acf29313caabd29366" No highlights found. Matching fields: unknown SCORE: 1 _id: "573a13adf29313caabd2b765" No highlights found. Matching fields: unknown SCORE: 1 _id: "573a13b0f29313caabd333e7" No highlights found. Matching fields: unknown SCORE: 1 _id: "573a13b0f29313caabd3486a" No highlights found. Matching fields: unknown SCORE: 1 _id: "573a13b1f29313caabd3719d" No highlights found. Matching fields: unknown SCORE: 1 _id: "573a13b2f29313caabd3abb9" No highlights found. Matching fields: unknown
结果中列出的前四个文档评分较高,因为查询中的 should
子句将标题中包含 snow
的文档指定为首选项。should
子句还使用 function
选项更改了查询词 snow
的分数。
展开查询结果。
Search Tester 可能不会显示其所返回文档的所有字段。要查看所有字段,包括在查询路径中指定的字段,请展开结果中的文档。
通过 mongosh
连接到您的集群。
在终端窗口中打开mongosh
并连接到集群。 有关连接的详细说明,请参阅通过mongosh
连接。
使用 sample_mflix
数据库。
在 mongosh
提示符下运行以下命令:
use sample_mflix
使用 compound
操作符对 movies
集合运行以下 Atlas Search 查询。
以下示例使用带有子查询的 compound
操作符来搜索 2013
至 2015
年间且 title
字段中包含词语 snow
的电影。
此查询使用以下管道阶段:
db.movies.aggregate([ { "$search": { "index": "compound-query-custom-score-tutorial", "compound": { "filter": [{ "range": { "path": "year", "gte": 2013, "lte": 2015 } }], "should": [{ "text": { "query": "snow", "path": "title", "score": {"constant": {"value": 5}} } }] }, "highlight": { "path": "title" } } }, { "$limit": 10 }, { "$project": { "_id": 0, "title": 1, "year": 1, "score": { "$meta": "searchScore" }, "highlights": { "$meta": "searchHighlights" } } } ])
Atlas Search 返回 constant
的结果如下:
[ { title: 'Snow in Paradise', year: 2014, score: 5, highlights: [ { score: 1.382846713066101, path: 'title', texts: [ { value: 'Snow', type: 'hit' }, { value: ' in Paradise', type: 'text' } ] } ] }, { title: 'Dead Snow 2: Red vs. Dead', year: 2014, score: 5, highlights: [ { score: 1.3924485445022583, path: 'title', texts: [ { value: 'Dead ', type: 'text' }, { value: 'Snow', type: 'hit' }, { value: ' 2: Red vs. ', type: 'text' } ] } ] }, { title: 'The Snow White Murder Case', year: 2014, score: 5, highlights: [ { score: 1.3525336980819702, path: 'title', texts: [ { value: 'The ', type: 'text' }, { value: 'Snow', type: 'hit' }, { value: ' White Murder Case', type: 'text' } ] } ] }, { title: 'Snow on the Blades', year: 2014, score: 5, highlights: [ { score: 1.3766303062438965, path: 'title', texts: [ { value: 'Snow', type: 'hit' }, { value: ' on the Blades', type: 'text' } ] } ] }, { year: 2013, title: 'The Secret Life of Walter Mitty', score: 0, highlights: [] }, { title: 'Jurassic World', year: 2015, score: 0, highlights: [] }, { title: 'Action Jackson', year: 2014, score: 0, highlights: [] }, { year: 2013, title: 'In Secret', score: 0, highlights: [] }, { title: 'The Stanford Prison Experiment', year: 2015, score: 0, highlights: [] }, { year: 2014, title: 'The Giver', score: 0, highlights: [] } ]
结果中列出的前四个文档评分较高,因为查询中的 should
子句将标题中包含 snow
的文档指定为首选项。should
子句还使用 constant
选项更改了查询词 snow
的分数。
此查询使用以下管道阶段:
db.movies.aggregate([ { "$search": { "index": "compound-query-custom-score-tutorial", "compound": { "must": [{ "range": { "path": "year", "gte": 2013, "lte": 2015 } }], "should": [{ "text": { "query": "snow", "path": "title", "score": {"boost": {"value": 2}} } }] }, "highlight": { "path": "title" } } }, { "$limit": 10 }, { "$project": { "_id": 0, "title": 1, "year": 1, "score": { "$meta": "searchScore" }, "highlights": { "$meta": "searchHighlights" } } } ])
Atlas Search 返回 boost
的结果如下:
[ { title: 'Snow in Paradise', year: 2014, score: 6.7722930908203125, highlights: [ { score: 1.382846713066101, path: 'title', texts: [ { value: 'Snow', type: 'hit' }, { value: ' in Paradise', type: 'text' } ] } ] }, { title: 'Snow on the Blades', year: 2014, score: 6.063445568084717, highlights: [ { score: 1.3766303062438965, path: 'title', texts: [ { value: 'Snow', type: 'hit' }, { value: ' on the Blades', type: 'text' } ] } ] }, { title: 'The Snow White Murder Case', year: 2014, score: 5.509652137756348, highlights: [ { score: 1.3525336980819702, path: 'title', texts: [ { value: 'The ', type: 'text' }, { value: 'Snow', type: 'hit' }, { value: ' White Murder Case', type: 'text' } ] } ] }, { title: 'Dead Snow 2: Red vs. Dead', year: 2014, score: 5.065053939819336, highlights: [ { score: 1.3924485445022583, path: 'title', texts: [ { value: 'Dead ', type: 'text' }, { value: 'Snow', type: 'hit' }, { value: ' 2: Red vs. ', type: 'text' } ] } ] }, { year: 2013, title: 'The Secret Life of Walter Mitty', score: 1, highlights: [] }, { title: 'Jurassic World', year: 2015, score: 1, highlights: [] }, { title: 'Action Jackson', year: 2014, score: 1, highlights: [] }, { year: 2013, title: 'In Secret', score: 1, highlights: [] }, { title: 'The Stanford Prison Experiment', year: 2015, score: 1, highlights: [] }, { year: 2014, title: 'The Giver', score: 1, highlights: [] } ]
结果中列出的前四个文档评分较高,因为查询中的 should
子句将标题中包含 snow
的文档指定为首选项。should
子句还使用 boost
选项更改了查询词 snow
的分数。
此查询使用以下管道阶段:
$search
查询集合。查询使用以下compound
操作符子句和boost
选项,使某些字段的优先级高于其他字段:must
带文本操作符的子句优先考虑comedy
类型,然后是title
字段中的术语snow
。boost
选项将权重应用于字段。should
带有范围操作符的子句,用于搜索2013
到2015
年之间的电影。
注意
boost
选项会对字段应用不同的权重,以确定字段的优先级。$limit
阶段将输出限制为10
个结果。$project
阶段到:排除
title
、year
和genres
以外的所有字段添加一个
score
字段
db.movies.aggregate([ { "$search": { "index": "compound-query-custom-score-tutorial", "compound": { "must": [{ "text": { "path": "genres", "query": "comedy", "score": {"boost": {"value": 9}} } }, { "text": { "path": "title", "query": "snow", "score": {"boost": {"value": 5}} } }], "should": [{ "range": { "path": "year", "gte": 2013, "lte": 2015, "score": {"boost": {"value": 3}} } }] } } }, { "$limit": 10 }, { "$project": { "_id": 0, "title": 1, "year": 1, "genres": 1, "score": { "$meta": "searchScore" } } } ])
[ { genres: [ 'Comedy', 'Horror' ], title: 'Dead Snow', year: 2009, score: 21.872983932495117 }, { year: 2000, genres: [ 'Adventure', 'Comedy', 'Family' ], title: 'Snow Day', score: 21.043487548828125 }, { genres: [ 'Adventure', 'Comedy', 'Family' ], title: 'Snow Dogs', year: 2002, score: 21.043487548828125 }, { year: 1999, genres: [ 'Comedy', 'Romance' ], title: 'Let It Snow', score: 19.523927688598633 }, { genres: [ 'Action', 'Comedy', 'Horror' ], title: 'Dead Snow 2: Red vs. Dead', year: 2014, score: 17.426334381103516 }, { genres: [ 'Comedy', 'Drama' ], title: 'Snow White and Russian Red', year: 2009, score: 16.367326736450195 }, { genres: [ 'Comedy', 'Drama', 'Romance' ], title: 'The Tiger and the Snow', year: 2005, score: 15.537829399108887 }, { genres: [ 'Adventure', 'Comedy', 'Family' ], title: 'Snow White and the Three Stooges', year: 1961, score: 14.4263334274292 } ]
此查询使用以下管道阶段:
$search
来查询集合。查询:使用以下
compound
操作符子句:指定突出显示选项,从
title
字段返回与查询匹配的代码段。这些代码段包含使用type: 'hit'
指定的匹配文本以及使用type: 'text'
指定的相邻文本。
$limit
阶段将输出限制为10
个结果。$project
阶段到:排除
title
和year
之外的所有字段添加一个
score
字段
db.movies.aggregate([ { "$search": { "index": "compound-query-custom-score-tutorial", "compound": { "must": [{ "range": { "path": "year", "gte": 2013, "lte": 2015 } }], "should": [{ "text": { "query": "snow", "path": "title", "score": { "function": { "add": [{ "path": { "value": "imdb.rating", "undefined": 2 } }, { "score": "relevance" }] } } } }] }, "highlight": { "path": "title" } } }, { "$limit": 10 }, { "$project": { "_id": 0, "title": 1, "year": 1, "score": { "$meta": "searchScore" }, "highlights": { "$meta": "searchHighlights" } } } ])
Atlas Search 返回 function
的结果如下:
[ { title: 'The Snow White Murder Case', year: 2014, score: 10.454826354980469, highlights: [ { score: 1.3525336980819702, path: 'title', texts: [ { value: 'The ', type: 'text' }, { value: 'Snow', type: 'hit' }, { value: ' White Murder Case', type: 'text' } ] } ] }, { title: 'Snow on the Blades', year: 2014, score: 10.3317232131958, highlights: [ { score: 1.3766303062438965, path: 'title', texts: [ { value: 'Snow', type: 'hit' }, { value: ' on the Blades', type: 'text' } ] } ] }, { title: 'Dead Snow 2: Red vs. Dead', year: 2014, score: 10.032526969909668, highlights: [ { score: 1.3924485445022583, path: 'title', texts: [ { value: 'Dead ', type: 'text' }, { value: 'Snow', type: 'hit' }, { value: ' 2: Red vs. ', type: 'text' } ] } ] }, { title: 'Snow in Paradise', year: 2014, score: 8.386146545410156, highlights: [ { score: 1.382846713066101, path: 'title', texts: [ { value: 'Snow', type: 'hit' }, { value: ' in Paradise', type: 'text' } ] } ] }, { year: 2013, title: 'The Secret Life of Walter Mitty', score: 1, highlights: [] }, { title: 'Jurassic World', year: 2015, score: 1, highlights: [] }, { title: 'Action Jackson', year: 2014, score: 1, highlights: [] }, { year: 2013, title: 'In Secret', score: 1, highlights: [] }, { title: 'The Stanford Prison Experiment', year: 2015, score: 1, highlights: [] }, { year: 2014, title: 'The Giver', score: 1, highlights: [] } ]
结果中列出的前四个文档评分较高,因为查询中的 should
子句将标题中包含 snow
的文档指定为首选项。should
子句还使用 function
选项更改了查询词 snow
的分数。
在 MongoDB Compass 中连接到您的集群。
打开 MongoDB Compass 并连接到您的集群。有关连接的详细说明,请参阅通过 Compass 连接。
运行 Atlas Search 复合查询,使用 constant
选项更改分数。
该查询将执行以下任务:
使用以下
compound
操作符子句:指定突出显示选项,从
title
字段返回与查询匹配的代码段。这些代码段包含使用type: 'hit'
指定的匹配文本以及使用type: 'text'
指定的相邻文本。使用以下管道阶段:
若要在 MongoDB Compass 中运行此查询:
单击 Aggregations 标签页。
单击 Select...,然后从下拉菜单中选择阶段并为该阶段添加查询,以配置以下每个管道阶段。单击 Add Stage 以添加其他阶段。
管道阶段查询$search
{ "index": "compound-query-custom-score-tutorial", "compound": { "filter": [{ "range": { "path": "year", "gte": 2013, "lte": 2015 } }], "should": [{ "text": { "query": "snow", "path": "title", "score": {"constant": {"value": 5}} } }] }, "highlight": { "path": "title" } } $limit
10 $project
{ "_id": 0, "title": 1, "year": 1, "score": { "$meta": "searchScore" }, "highlights": { "$meta": "searchHighlights" } } 如果已启用 Auto Preview,则 MongoDB Compass 将在
$project
管道阶段旁边显示以下文档:{ title: 'Snow in Paradise', year: 2014, score: 5, highlights: [{ score: 1.382846713066101, path: 'title', texts: [ { value: 'Snow', type: 'hit' }, { value: ' in Paradise', type: 'text' } ] }] }, { title: 'Dead Snow 2: Red vs. Dead', year: 2014, score: 5, highlights: [{ score: 1.3924485445022583, path: 'title', texts: [ { value: 'Dead ', type: 'text' }, { value: 'Snow', type: 'hit' }, { value: ' 2: Red vs. ', type: 'text' } ] }] }, { title: 'The Snow White Murder Case', year: 2014, score: 5, highlights: [{ score: 1.3525336980819702, path: 'title', texts: [ { value: 'The ', type: 'text' }, { value: 'Snow', type: 'hit' }, { value: ' White Murder Case', type: 'text' } ] }] }, { title: 'Snow on the Blades', year: 2014, score: 5, highlights: [{ score: 1.3766303062438965, path: 'title', texts: [ { value: 'Snow', type: 'hit' }, { value: ' on the Blades', type: 'text' } ] }] }, { year: 2013, title: 'The Secret Life of Walter Mitty', score: 0, highlights: [] }, { title: 'Jurassic World', year: 2015, score: 0, highlights: [] }, { title: 'Action Jackson', year: 2014, score: 0, highlights: [] }, { year: 2013, title: 'In Secret', score: 0, highlights: [] }, { title: 'The Stanford Prison Experiment', year: 2015, score: 0, highlights: [] }, { year: 2014, title: 'The Giver', score: 0, highlights: [] } 结果中列出的前四个文档评分较高,因为查询中的
should
子句将标题中包含snow
的文档指定为首选项。should
子句还使用constant
选项更改了查询词snow
的分数。
运行 Atlas Search 复合查询,使用 boost
选项更改分数。
单击 Aggregations 标签页。
单击 Select...,然后从下拉菜单中选择阶段并为该阶段添加查询,以配置以下每个管道阶段。单击 Add Stage 以添加其他阶段。
查询使用了下列管道阶段:
$search
执行以下任务:
管道阶段查询$search
{ "index": "compound-query-custom-score-tutorial", "compound": { "must": [{ "range": { "path": "year", "gte": 2013, "lte": 2015 } }], "should": [{ "text": { "query": "snow", "path": "title", "score": {"boost": {"value": 2}} } }] }, "highlight": { "path": "title" } } $limit
10 $project
{ "_id": 0, "title": 1, "year": 1, "score": { "$meta": "searchScore" }, "highlights": { "$meta": "searchHighlights" } } 此查询使用以下管道阶段:
$search
执行以下任务:
must
带文本操作符的子句优先考虑comedy
类型,然后是title
字段中的术语snow
。boost
选项将权重应用于字段。should
带有范围操作符的子句,用于搜索2013
到2015
年之间的电影。
注意
boost
选项会对字段应用不同的权重,以确定字段的优先级。管道阶段查询$search
{ "index": "compound-query-custom-score-tutorial", "compound": { "must": [{ "text": { "path": "genres", "query": "comedy", "score": {"boost": {"value": 9}} } }, { "text": { "path": "title", "query": "snow", "score": {"boost": {"value": 5}} } }], "should": [{ "range": { "path": "year", "gte": 2013, "lte": 2015, "score": {"boost": {"value": 3}} } }] } } $limit
10 $project
{ "_id": 0, "title": 1, "year": 1, "genres": 1, "score": { "$meta": "searchScore" } } 如果已启用 Auto Preview,则 MongoDB Compass 将在
$project
管道阶段旁边显示以下文档:{ title: 'Snow in Paradise', year: 2014, score: 6.7722930908203125, highlights: [{ score: 1.382846713066101, path: 'title', texts: [ { value: 'Snow', type: 'hit' }, { value: ' in Paradise', type: 'text' } ] }] }, { title: 'Snow on the Blades', year: 2014, score: 6.063445568084717, highlights: [{ score: 1.3766303062438965, path: 'title', texts: [ { value: 'Snow', type: 'hit' }, { value: ' on the Blades', type: 'text' } ] }] }, { title: 'The Snow White Murder Case', year: 2014, score: 5.509652137756348, highlights: [{ score: 1.3525336980819702, path: 'title', texts: [ { value: 'The ', type: 'text' }, { value: 'Snow', type: 'hit' }, { value: ' White Murder Case', type: 'text' } ] }] }, { title: 'Dead Snow 2: Red vs. Dead', year: 2014, score: 5.065053939819336, highlights: [{ score: 1.3924485445022583, path: 'title', texts: [ { value: 'Dead ', type: 'text' }, { value: 'Snow', type: 'hit' }, { value: ' 2: Red vs. ', type: 'text' } ] }] }, { year: 2013, title: 'The Secret Life of Walter Mitty',score: 1, highlights: [] }, { title: 'Jurassic World', year: 2015, score: 1, highlights: [] }, { title: 'Action Jackson', year: 2014, score: 1, highlights: [] }, { year: 2013, title: 'In Secret', score: 1, highlights: [] }, { title: 'The Stanford Prison Experiment', year: 2015, score: 1, highlights: [] }, { year: 2014, title: 'The Giver', score: 1, highlights: [] } 结果中列出的前四个文档评分较高,因为查询中的
should
子句将标题中包含snow
的文档指定为首选项。should
子句还使用boost
选项更改了查询词snow
的分数。[ { genres: [ 'Comedy', 'Horror' ], title: 'Dead Snow', year: 2009, score: 21.872983932495117 }, { year: 2000, genres: [ 'Adventure', 'Comedy', 'Family' ], title: 'Snow Day', score: 21.043487548828125 }, { genres: [ 'Adventure', 'Comedy', 'Family' ], title: 'Snow Dogs', year: 2002, score: 21.043487548828125 }, { year: 1999, genres: [ 'Comedy', 'Romance' ], title: 'Let It Snow', score: 19.523927688598633 }, { genres: [ 'Action', 'Comedy', 'Horror' ], title: 'Dead Snow 2: Red vs. Dead', year: 2014, score: 17.426334381103516 }, { genres: [ 'Comedy', 'Drama' ], title: 'Snow White and Russian Red', year: 2009, score: 16.367326736450195 }, { genres: [ 'Comedy', 'Drama', 'Romance' ], title: 'The Tiger and the Snow', year: 2005, score: 15.537829399108887 }, { genres: [ 'Adventure', 'Comedy', 'Family' ], title: 'Snow White and the Three Stooges', year: 1961, score: 14.4263334274292 } ]
运行 Atlas Search 复合查询,使用 function
选项更改分数。
查询使用了下列管道阶段:
$search
阶段将执行以下任务:查询使用以下
compound
操作符子句:指定突出显示选项,从
title
字段返回与查询匹配的代码段。这些代码段包含使用type: 'hit'
指定的匹配文本以及使用type: 'text'
指定的相邻文本。
若要在 MongoDB Compass 中运行此查询:
单击 Aggregations 标签页。
单击 Select...,然后从下拉菜单中选择阶段并为该阶段添加查询,以配置以下每个管道阶段。单击 Add Stage 以添加其他阶段。
管道阶段查询$search
{ "index": "compound-query-custom-score-tutorial", "compound": { "must": [{ "range": { "path": "year", "gte": 2013, "lte": 2015 } }], "should": [{ "text": { "query": "snow", "path": "title", "score": { "function": { "add": [{ "path": { "value": "imdb.rating", "undefined": 2 } }, { "score": "relevance" }] } } } }]}, "highlight":{ "path": "title" } } $limit
10 $project
{ "_id": 0, "title": 1, "year": 1, "score": { "$meta": "searchScore" }, "highlights": { "$meta": "searchHighlights" } } 如果已启用 Auto Preview,则 MongoDB Compass 将在
$project
管道阶段旁边显示以下文档:{ title: 'The Snow White Murder Case', year: 2014, score: 10.454826354980469, highlights: [{ score: 1.3525336980819702, path: 'title', texts: [ { value: 'The ', type: 'text' }, { value: 'Snow', type: 'hit' }, { value: ' White Murder Case', type: 'text' } ] }] }, { title: 'Snow on the Blades', year: 2014, score: 10.3317232131958, highlights: [{ score: 1.3766303062438965, path: 'title', texts: [ { value: 'Snow', type: 'hit' }, { value: ' on the Blades', type: 'text' } ] }] }, { title: 'Dead Snow 2: Red vs. Dead', year: 2014, score: 10.032526969909668, highlights: [{ score: 1.3924485445022583, path: 'title', texts: [ { value: 'Dead ', type: 'text' }, { value: 'Snow', type: 'hit' }, { value: ' 2: Red vs. ', type: 'text' } ] }] }, { title: 'Snow in Paradise', year: 2014, score: 8.386146545410156, highlights: [{ score: 1.382846713066101, path: 'title', texts: [ { value: 'Snow', type: 'hit' }, { value: ' in Paradise', type: 'text' } ] }] }, { year: 2013, title: 'The Secret Life of Walter Mitty', score: 1, highlights: [] }, { title: 'Jurassic World', year: 2015, score: 1, highlights: [] }, { title: 'Action Jackson', year: 2014, score: 1, highlights: [] }, { year: 2013, title: 'In Secret', score: 1, highlights: [] }, { title: 'The Stanford Prison Experiment', year: 2015, score: 1, highlights: [] }, { year: 2014, title: 'The Giver', score: 1, highlights: [] } 结果中列出的前四个文档评分较高,因为查询中的
should
子句将标题中包含snow
的文档指定为首选项。should
子句还使用function
选项更改了查询词snow
的分数。
运行 Atlas Search 复合查询,使用 constant
选项更改分数。
创建一个名为
compound-constant-example
的新目录,并使用dotnet new
命令初始化项目。mkdir compound-constant-example cd compound-constant-example dotnet new console 将 .NET/C# 驱动程序作为依赖项添加到项目中。
dotnet add package MongoDB.Driver 将
Program.cs
文件的内容替换为以下代码。此代码示例将执行以下任务:
导入
mongodb
包和依赖项。建立与您的 Atlas 集群的连接。
使用以下复合子句查询集合:
指定突出显示选项,从
title
字段返回与查询匹配的代码段。这些代码段包含使用type: 'hit'
指定的匹配文本以及使用type: 'text'
指定的相邻文本。使用以下管道阶段:
遍历游标以打印与查询匹配的文档。
1 using MongoDB.Bson; 2 using MongoDB.Bson.Serialization.Attributes; 3 using MongoDB.Bson.Serialization.Conventions; 4 using MongoDB.Driver; 5 using MongoDB.Driver.Search; 6 7 public class CompoundConstantExample 8 { 9 private const string MongoConnectionString = "<connection-string>"; 10 11 public static void Main(string[] args) 12 { 13 // allow automapping of the camelCase database fields to our MovieDocument 14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; 15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true); 16 17 // connect to your Atlas cluster 18 var mongoClient = new MongoClient(MongoConnectionString); 19 var mflixDatabase = mongoClient.GetDatabase("sample_mflix"); 20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies"); 21 22 // define and run pipeline 23 var results = moviesCollection.Aggregate() 24 .Search(Builders<MovieDocument>.Search.Compound() 25 .Filter(Builders<MovieDocument>.Search.Range(movie => movie.Year, SearchRangeBuilder.Gte(2013).Lte(2015))) 26 .Should(Builders<MovieDocument>.Search.Text(movie => movie.Title, "snow", score: new SearchScoreDefinitionBuilder<MovieDocument>().Constant(5))), 27 new SearchHighlightOptions<MovieDocument>(movie => movie.Title), 28 indexName: "compound-query-custom-score-tutorial") 29 .Project<MovieDocument>(Builders<MovieDocument>.Projection 30 .Include(movie => movie.Title) 31 .Include(movie => movie.Year) 32 .Exclude(movie => movie.Id) 33 .MetaSearchScore(movie => movie.Score) 34 .MetaSearchHighlights("highlights")) 35 .Limit(10) 36 .ToList(); 37 38 // print results 39 foreach (var movie in results) 40 { 41 Console.WriteLine(movie.ToJson()); 42 } 43 } 44 } 45 46 [ ]47 public class MovieDocument 48 { 49 [ ]50 public ObjectId Id { get; set; } 51 public string Title { get; set; } 52 public int Year { get; set; } 53 [ ]54 public List<SearchHighlight> Highlights { get; set; } 55 public double Score { get; set; } 56 } 在运行示例之前,请将
<connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。编译并运行
Program.cs
文件。dotnet run compound-constant-example.csproj { "title" : "Snow in Paradise", "year" : 2014, "highlights" : [{ "path" : "title", "score" : 1.3828467130661011, "texts" : [{ "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " in Paradise" }] }], "score" : 5.0 } { "title" : "Dead Snow 2: Red vs. Dead", "year" : 2014, "highlights" : [{ "path" : "title", "score" : 1.3924485445022583, "texts" : [{ "type" : "Text", "value" : "Dead " }, { "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " 2: Red vs. " }] }], "score" : 5.0 } { "title" : "The Snow White Murder Case", "year" : 2014, "highlights" : [{ "path" : "title", "score" : 1.3525336980819702, "texts" : [{ "type" : "Text", "value" : "The " }, { "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " White Murder Case" }] }], "score" : 5.0 } { "title" : "Snow on the Blades", "year" : 2014, "highlights" : [{ "path" : "title", "score" : 1.3766303062438965, "texts" : [{ "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " on the Blades" }] }], "score" : 5.0 } { "title" : "The Secret Life of Walter Mitty", "year" : 2013, "highlights" : [], "score" : 0.0 } { "title" : "Jurassic World", "year" : 2015, "highlights" : [], "score" : 0.0 } { "title" : "Action Jackson", "year" : 2014, "highlights" : [], "score" : 0.0 } { "title" : "In Secret", "year" : 2013, "highlights" : [], "score" : 0.0 } { "title" : "The Stanford Prison Experiment", "year" : 2015, "highlights" : [], "score" : 0.0 } { "title" : "The Giver", "year" : 2014, "highlights" : [], "score" : 0.0 } 结果中列出的前四个文档评分较高,因为查询中的
should
子句将标题中包含snow
的文档指定为首选项。should
子句还使用constant
选项更改了查询词snow
的分数。
运行 Atlas Search 复合查询,使用 boost
选项更改分数。
创建一个名为
compound-boost-example
的新目录,并使用dotnet new
命令初始化项目。mkdir compound-boost-example cd compound-boost-example dotnet new console 将 .NET/C# 驱动程序作为依赖项添加到项目中。
dotnet add package MongoDB.Driver 将
Program.cs
文件的内容替换为以下代码。此代码示例将执行以下任务:
导入
mongodb
包和依赖项。建立与您的 Atlas 集群的连接。
遍历游标以打印与查询匹配的文档。
查询使用了下列管道阶段:
$search
查询集合阶段。查询:使用以下
compound
操作符子句:
指定突出显示选项,从
title
字段返回与查询匹配的代码段。这些代码段包含使用type: 'hit'
指定的匹配文本以及使用type: 'text'
指定的相邻文本。
1 using MongoDB.Bson; 2 using MongoDB.Bson.Serialization.Attributes; 3 using MongoDB.Bson.Serialization.Conventions; 4 using MongoDB.Driver; 5 using MongoDB.Driver.Search; 6 7 public class CompoundBoostSingleExample 8 { 9 private const string MongoConnectionString = "<connection-string>"; 10 11 public static void Main(string[] args) 12 { 13 // allow automapping of the camelCase database fields to our MovieDocument 14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; 15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true); 16 17 // connect to your Atlas cluster 18 var mongoClient = new MongoClient(MongoConnectionString); 19 var mflixDatabase = mongoClient.GetDatabase("sample_mflix"); 20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies"); 21 22 // define and run pipeline 23 var results = moviesCollection.Aggregate() 24 .Search(Builders<MovieDocument>.Search.Compound() 25 .Must(Builders<MovieDocument>.Search.Range(movie => movie.Year, SearchRangeBuilder.Gte(2013).Lte(2015))) 26 .Should(Builders<MovieDocument>.Search.Text(movie => movie.Title, "snow", score: new SearchScoreDefinitionBuilder<MovieDocument>().Boost(2))), 27 new SearchHighlightOptions<MovieDocument>(movie => movie.Title), 28 indexName: "compound-query-custom-score-tutorial") 29 .Project<MovieDocument>(Builders<MovieDocument>.Projection 30 .Include(movie => movie.Title) 31 .Include(movie => movie.Year) 32 .Exclude(movie => movie.Id) 33 .MetaSearchScore(movie => movie.Score) 34 .MetaSearchHighlights("highlights")) 35 .Limit(10) 36 .ToList(); 37 38 // print results 39 foreach (var movie in results) 40 { 41 Console.WriteLine(movie.ToJson()); 42 } 43 } 44 } 45 46 [ ]47 public class MovieDocument 48 { 49 [ ]50 public ObjectId Id { get; set; } 51 public string Title { get; set; } 52 public int Year { get; set; } 53 [ ]54 public List<SearchHighlight> Highlights { get; set; } 55 public double Score { get; set; } 56 } 此查询使用以下带有
boost
选项的compound
操作符子句,使某些字段的优先级高于其他字段:must
带文本操作符的子句优先考虑comedy
类型,然后是title
字段中的术语snow
。boost
选项将权重应用于字段。should
带有范围操作符的子句,用于搜索2013
到2015
年之间的电影。
注意
boost
选项会对字段应用不同的权重,以确定字段的优先级。1 using MongoDB.Bson; 2 using MongoDB.Bson.Serialization.Attributes; 3 using MongoDB.Bson.Serialization.Conventions; 4 using MongoDB.Driver; 5 using MongoDB.Driver.Search; 6 7 public class CompoundBoostMultipleExample 8 { 9 private const string MongoConnectionString = "<connection-string>"; 10 11 public static void Main(string[] args) 12 { 13 // allow automapping of the camelCase database fields to our MovieDocument 14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; 15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true); 16 17 // connect to your Atlas cluster 18 var mongoClient = new MongoClient(MongoConnectionString); 19 var mflixDatabase = mongoClient.GetDatabase("sample_mflix"); 20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies"); 21 22 // define and run pipeline 23 var results = moviesCollection.Aggregate() 24 .Search(Builders<MovieDocument>.Search.Compound() 25 .Must(Builders<MovieDocument>.Search.Text(movie => movie.Genres, "comedy", score: new SearchScoreDefinitionBuilder<MovieDocument>().Boost(9))) 26 .Must(Builders<MovieDocument>.Search.Text(movie => movie.Title, "snow", score: new SearchScoreDefinitionBuilder<MovieDocument>().Boost(5))) 27 .Should(Builders<MovieDocument>.Search.Range(movie => movie.Year, SearchRangeBuilder.Gte(2013).Lte(2015), score: new SearchScoreDefinitionBuilder<MovieDocument>().Boost(3))), 28 indexName: "compound-query-custom-score-tutorial") 29 .Project<MovieDocument>(Builders<MovieDocument>.Projection 30 .Include(movie => movie.Genres) 31 .Include(movie => movie.Title) 32 .Include(movie => movie.Year) 33 .Exclude(movie => movie.Id) 34 .MetaSearchScore(movie => movie.Score)) 35 .Limit(10) 36 .ToList(); 37 38 // print results 39 foreach (var movie in results) 40 { 41 Console.WriteLine(movie.ToJson()); 42 } 43 } 44 } 45 46 [ ]47 public class MovieDocument 48 { 49 [ ]50 public ObjectId Id { get; set; } 51 public string [] Genres { get; set; } 52 public string Title { get; set; } 53 public int Year { get; set; } 54 public double Score { get; set; } 55 } 在运行示例之前,请将
<connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。编译并运行
Program.cs
文件。dotnet run compound-boost-example.csproj { "title" : "Snow in Paradise", "year" : 2014, "highlights" : [{ "path" : "title", "score" : 1.3828467130661011, "texts" : [{ "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " in Paradise" }] }], "score" : 6.7722930908203125 } { "title" : "Snow on the Blades", "year" : 2014, "highlights" : [{ "path" : "title", "score" : 1.3766303062438965, "texts" : [{ "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " on the Blades" }] }], "score" : 6.0634455680847168 } { "title" : "The Snow White Murder Case", "year" : 2014, "highlights" : [{ "path" : "title", "score" : 1.3525336980819702, "texts" : [{ "type" : "Text", "value" : "The " }, { "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " White Murder Case" }] }], "score" : 5.5096521377563477 } { "title" : "Dead Snow 2: Red vs. Dead", "year" : 2014, "highlights" : [{ "path" : "title", "score" : 1.3924485445022583, "texts" : [{ "type" : "Text", "value" : "Dead " }, { "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " 2: Red vs. " }] }], "score" : 5.0650539398193359 } { "title" : "The Secret Life of Walter Mitty", "year" : 2013, "highlights" : [], "score" : 1.0 } { "title" : "Jurassic World", "year" : 2015, "highlights" : [], "score" : 1.0 } { "title" : "Action Jackson", "year" : 2014, "highlights" : [], "score" : 1.0 } { "title" : "In Secret", "year" : 2013, "highlights" : [], "score" : 1.0 } { "title" : "The Stanford Prison Experiment", "year" : 2015, "highlights" : [], "score" : 1.0 } { "title" : "The Giver", "year" : 2014, "highlights" : [], "score" : 1.0 } 结果中列出的前四个文档评分较高,因为查询中的
should
子句将标题中包含snow
的文档指定为首选项。should
子句还使用boost
选项更改了查询词snow
的分数。dotnet run compound-boost-example.csproj { "genres" : ["Comedy", "Horror"], "title" : "Dead Snow", "year" : 2009, "score" : 21.872983932495117 } { "genres" : ["Adventure", "Comedy", "Family"], "title" : "Snow Day", "year" : 2000, "score" : 21.043487548828125 } { "genres" : ["Adventure", "Comedy", "Family"], "title" : "Snow Dogs", "year" : 2002, "score" : 21.043487548828125 } { "genres" : ["Comedy", "Romance"], "title" : "Let It Snow", "year" : 1999, "score" : 19.523927688598633 } { "genres" : ["Action", "Comedy", "Horror"], "title" : "Dead Snow 2: Red vs. Dead", "year" : 2014, "score" : 17.426334381103516 } { "genres" : ["Comedy", "Drama"], "title" : "Snow White and Russian Red", "year" : 2009, "score" : 16.367326736450195 } { "genres" : ["Comedy", "Drama", "Romance"], "title" : "The Tiger and the Snow", "year" : 2005, "score" : 15.537829399108887 } { "genres" : ["Adventure", "Comedy", "Family"], "title" : "Snow White and the Three Stooges", "year" : 1961, "score" : 14.426333427429199 }
运行 Atlas Search 复合查询,使用 function
选项更改分数。
创建一个名为
compound-function-example
的新目录,并使用dotnet new
命令初始化项目。mkdir compound-function-example cd compound-function-example dotnet new console 将 .NET/C# 驱动程序作为依赖项添加到项目中。
dotnet add package MongoDB.Driver 将
Program.cs
文件的内容替换为以下代码。此代码示例将执行以下任务:
导入
mongodb
包和依赖项。建立与您的 Atlas 集群的连接。
使用以下管道阶段来查询集合:
使用以下管道阶段:
指定突出显示选项,从
title
字段返回与查询匹配的代码段。这些代码段包含使用type: 'hit'
指定的匹配文本以及使用type: 'text'
指定的相邻文本。遍历游标以打印与查询匹配的文档。
1 using MongoDB.Bson; 2 using MongoDB.Bson.Serialization.Attributes; 3 using MongoDB.Bson.Serialization.Conventions; 4 using MongoDB.Driver; 5 using MongoDB.Driver.Search; 6 7 public class CompoundFunctionExample 8 { 9 private const string MongoConnectionString = "<connection-string>"; 10 11 public static void Main(string[] args) 12 { 13 // allow automapping of the camelCase database fields to our MovieDocument 14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; 15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true); 16 17 // connect to your Atlas cluster 18 var mongoClient = new MongoClient(MongoConnectionString); 19 var mflixDatabase = mongoClient.GetDatabase("sample_mflix"); 20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies"); 21 22 var scoreFunction = Builders<MovieDocument>.SearchScore.Function(Builders<MovieDocument>.SearchScoreFunction.Add(Builders<MovieDocument>.SearchScoreFunction.Path(movie => movie.Imdb.Rating, 2), Builders<MovieDocument>.SearchScoreFunction.Relevance())); 23 // define and run pipeline 24 var results = moviesCollection.Aggregate() 25 .Search(Builders<MovieDocument>.Search.Compound() 26 .Must(Builders<MovieDocument>.Search.Range(movie => movie.Year, SearchRangeBuilder.Gte(2013).Lte(2015))) 27 .Should(Builders<MovieDocument>.Search.Text(movie => movie.Title, "snow", score: scoreFunction)), 28 new SearchHighlightOptions<MovieDocument>(movie => movie.Title), 29 indexName: "compound-query-custom-score-tutorial") 30 .Project<MovieDocument>(Builders<MovieDocument>.Projection 31 .Include(movie => movie.Genres) 32 .Include(movie => movie.Title) 33 .Include(movie => movie.Year) 34 .Exclude(movie => movie.Id) 35 .MetaSearchScore(movie => movie.Score) 36 .MetaSearchHighlights("highlights")) 37 .Limit(10) 38 .ToList(); 39 40 // print results 41 foreach (var movie in results) 42 { 43 Console.WriteLine(movie.ToJson()); 44 } 45 } 46 } 47 48 [ ]49 public class MovieDocument 50 { 51 [ ]52 public ObjectId Id { get; set; } 53 public string [] Genres { get; set; } 54 public IMDB Imdb { get; set; } 55 public string Title { get; set; } 56 public int Year { get; set; } 57 [ ]58 public List<SearchHighlight> Highlights { get; set; } 59 public double Score { get; set; } 60 } 61 62 [ ]63 public class IMDB 64 { 65 public double Rating { get; set; } 66 } 在运行示例之前,请将
<connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。编译并运行
Program.cs
文件。dotnet run compound-function-example.csproj { "genres" : ["Drama", "Mystery"], "title" : "The Snow White Murder Case", "year" : 2014, "highlights" : [{ "path" : "title", "score" : 1.3525336980819702, "texts" : [{ "type" : "Text", "value" : "The " }, { "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " White Murder Case" }] }], "score" : 10.454826354980469 } { "genres" : ["Action", "Drama", "History"], "title" : "Snow on the Blades", "year" : 2014, "highlights" : [{ "path" : "title", "score" : 1.3766303062438965, "texts" : [{ "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " on the Blades" }] }], "score" : 10.331723213195801 } { "genres" : ["Action", "Comedy", "Horror"], "title" : "Dead Snow 2: Red vs. Dead", "year" : 2014, "highlights" : [{ "path" : "title", "score" : 1.3924485445022583, "texts" : [{ "type" : "Text", "value" : "Dead " }, { "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " 2: Red vs. " }] }], "score" : 10.032526969909668 } { "genres" : ["Thriller"], "title" : "Snow in Paradise", "year" : 2014, "highlights" : [{ "path" : "title", "score" : 1.3828467130661011, "texts" : [{ "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " in Paradise" }] }], "score" : 8.3861465454101562 } { "genres" : ["Adventure", "Comedy", "Drama"], "title" : "The Secret Life of Walter Mitty", "year" : 2013, "highlights" : [], "score" : 1.0 } { "genres" : ["Action", "Adventure", "Sci-Fi"], "title" : "Jurassic World", "year" : 2015, "highlights" : [], "score" : 1.0 } { "genres" : ["Action", "Comedy", "Drama"], "title" : "Action Jackson", "year" : 2014, "highlights" : [], "score" : 1.0 } { "genres" : ["Crime", "Drama", "Thriller"], "title" : "In Secret", "year" : 2013, "highlights" : [], "score" : 1.0 } { "genres" : ["Drama", "Thriller"], "title" : "The Stanford Prison Experiment", "year" : 2015, "highlights" : [], "score" : 1.0 } { "genres" : ["Drama", "Sci-Fi"], "title" : "The Giver", "year" : 2014, "highlights" : [], "score" : 1.0 } 结果中列出的前四个文档评分较高,因为查询中的
should
子句将标题中包含snow
的文档指定为首选项。should
子句还使用function
选项更改了查询词snow
的分数。
运行 Atlas Search 复合查询,使用 constant
选项更改分数。
创建一个名为
compound-constant-query.go
的文件。将代码示例复制并粘贴到
compound-constant-query.go
文件中。此代码示例将执行以下任务:
导入
mongodb
包和依赖项。建立与您的 Atlas 集群的连接。
使用以下复合子句查询集合:
指定突出显示选项,从
title
字段返回与查询匹配的代码段。这些代码段包含使用type: 'hit'
指定的匹配文本以及使用type: 'text'
指定的相邻文本。使用以下管道阶段:
遍历游标以打印与查询匹配的文档。
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 "time" 7 8 "go.mongodb.org/mongo-driver/bson" 9 "go.mongodb.org/mongo-driver/mongo" 10 "go.mongodb.org/mongo-driver/mongo/options" 11 ) 12 13 func main() { 14 // connect to your Atlas cluster 15 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("<connection-string>")) 16 if err != nil { 17 panic(err) 18 } 19 defer client.Disconnect(context.TODO()) 20 21 // set namespace 22 collection := client.Database("sample_mflix").Collection("movies") 23 24 // define pipeline stages 25 searchStage := bson.D{{"$search", bson.M{ 26 "index": "compound-query-custom-score-tutorial", 27 "compound": bson.M{ 28 "filter": bson.M{ 29 "range": bson.M{ 30 "path": "year", "gte": 2013, "lte": 2015, 31 }, 32 }, 33 "should": bson.D{ 34 {"text", bson.M{ 35 "path": "title", "query": "snow", "score": bson.M{ 36 "constant": bson.D{{"value", 5}}, 37 }}}}, 38 }, 39 "highlight": bson.D{{"path", "title"}}, 40 }}} 41 limitStage := bson.D{{"$limit", 10}} 42 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"year", 1}, {"_id", 0}, {"score", bson.D{{"$meta", "searchScore"}}}, {"highlights", bson.D{{"$meta", "searchHighlights"}}}}}} 43 44 // specify the amount of time the operation can run on the server 45 opts := options.Aggregate().SetMaxTime(5 * time.Second) 46 47 // run pipeline 48 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, limitStage, projectStage}, opts) 49 if err != nil { 50 panic(err) 51 } 52 53 // print results 54 var results []bson.D 55 if err = cursor.All(context.TODO(), &results); err != nil { 56 panic(err) 57 } 58 for _, result := range results { 59 fmt.Println(result) 60 } 61 } 在运行示例之前,请将
<connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。运行以下命令来查询您的集合:
go run compound-constant-query.go [{title Snow in Paradise} {year 2014} {score 5} {highlights [[{score 1.382846713066101} {path title} {texts [[{value Snow} {type hit}] [{value in Paradise} {type text}]]}]]}] [{title Dead Snow 2: Red vs. Dead} {year 2014} {score 5} {highlights [[{score 1.3924485445022583} {path title} {texts [[{value Dead } {type text}] [{value Snow} {type hit}] [{value 2: Red vs. } {type text}]]}]]}] [{title The Snow White Murder Case} {year 2014} {score 5} {highlights [[{score 1.3525336980819702} {path title} {texts [[{value The } {type text}] [{value Snow} {type hit}] [{value White Murder Case} {type text}]]}]]}] [{title Snow on the Blades} {year 2014} {score 5} {highlights [[{score 1.3766303062438965} {path title} {texts [[{value Snow} {type hit}] [{value on the Blades} {type text}]]}]]}] [{year 2013} {title The Secret Life of Walter Mitty} {score 0} {highlights []}] [{title Jurassic World} {year 2015} {score 0} {highlights []}] [{title Action Jackson} {year 2014} {score 0} {highlights []}] [{year 2013} {title In Secret} {score 0} {highlights []}] [{title The Stanford Prison Experiment} {year 2015} {score 0} {highlights []}] [{year 2014} {title The Giver} {score 0} {highlights []}] 结果中列出的前四个文档评分较高,因为查询中的
should
子句将标题中包含snow
的文档指定为首选项。should
子句还使用constant
选项更改了查询词snow
的分数。
运行 Atlas Search 复合查询,使用 boost
选项更改分数。
创建一个名为
compound-boost-query.go
的文件。将代码示例复制并粘贴到
compound-boost-query.go
文件中。这些代码示例执行以下任务:
导入
mongodb
包和依赖项。建立与您的 Atlas 集群的连接。
遍历游标以打印与查询匹配的文档。
查询使用了下列管道阶段:
$search
查询集合阶段。查询:
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 "time" 7 8 "go.mongodb.org/mongo-driver/bson" 9 "go.mongodb.org/mongo-driver/mongo" 10 "go.mongodb.org/mongo-driver/mongo/options" 11 ) 12 13 // define structure of movies collection 14 type MovieCollection struct { 15 title string `bson:"Title,omitempty"` 16 } 17 18 func main() { 19 var err error 20 // connect to the Atlas cluster 21 ctx := context.Background() 22 client, err := mongo.Connect(ctx, options.Client().ApplyURI("<connection-string>")) 23 if err != nil { 24 panic(err) 25 } 26 defer client.Disconnect(ctx) 27 // set namespace 28 collection := client.Database("sample_mflix").Collection("movies") 29 // define pipeline 30 searchStage := bson.D{{"$search", bson.M{ 31 "index": "compound-query-custom-score-tutorial", 32 "compound": bson.M{ 33 "must": bson.M{ 34 "range": bson.M{ 35 "path": "year", "gte": 2013, "lte": 2015, 36 }, 37 }, 38 "should": bson.D{ 39 {"text", bson.M{ 40 "path": "title", "query": "snow", "score": bson.M{ 41 "boost": bson.D{{"value", 2}}, 42 }, 43 }}, 44 }, 45 }, 46 }}} 47 limitStage := bson.D{{"$limit", 10}} 48 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"year", 1}, {"_id", 0}, {"score", bson.D{{"$meta", "searchScore"}}}}}} 49 // specify the amount of time the operation can run on the server 50 opts := options.Aggregate().SetMaxTime(5 * time.Second) 51 // run pipeline 52 cursor, err := collection.Aggregate(ctx, mongo.Pipeline{searchStage, limitStage, projectStage}, opts) 53 if err != nil { 54 panic(err) 55 } 56 // print results 57 var results []bson.D 58 if err = cursor.All(context.TODO(), &results); err != nil { 59 panic(err) 60 } 61 for _, result := range results { 62 fmt.Println(result) 63 } 64 } 此查询使用以下管道阶段:
$search
查询集合阶段。查询:
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 "time" 7 8 "go.mongodb.org/mongo-driver/bson" 9 "go.mongodb.org/mongo-driver/mongo" 10 "go.mongodb.org/mongo-driver/mongo/options" 11 ) 12 13 // define structure of movies collection 14 type MovieCollection struct { 15 title string `bson:"Title,omitempty"` 16 } 17 18 func main() { 19 var err error 20 // connect to the Atlas cluster 21 ctx := context.Background() 22 client, err := mongo.Connect(ctx, options.Client().ApplyURI("<connection-string>")) 23 if err != nil { 24 panic(err) 25 } 26 defer client.Disconnect(ctx) 27 // set namespace 28 collection := client.Database("sample_mflix").Collection("movies") 29 // define pipeline 30 searchStage := bson.D{{"$search", bson.M{ 31 "index": "compound-query-custom-score-tutorial", 32 "compound": bson.M{ 33 "must": bson.A{ 34 bson.M{ 35 "text": bson.M{ 36 "path": "genres", "query": "comedy", "score": bson.M{ 37 "boost": bson.D{{"value", 9}}, 38 }, 39 }, 40 }, 41 bson.M{ 42 "text": bson.M{ 43 "path": "title", "query": "snow", "score": bson.M{ 44 "boost": bson.D{{"value", 5}}, 45 }, 46 }, 47 }, 48 }, 49 "should": bson.M{ 50 "range": bson.M{ 51 "path": "year", "gte": 2013, "lte": 2015, "score": bson.M{ 52 "boost": bson.D{{"value", 3}}, 53 }, 54 }, 55 }, 56 }, 57 }}} 58 limitStage := bson.D{{"$limit", 10}} 59 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"year", 1}, {"genres", 1}, {"_id", 0}, {"score", bson.D{{"$meta", "searchScore"}}}}}} 60 // specify the amount of time the operation can run on the server 61 opts := options.Aggregate().SetMaxTime(5 * time.Second) 62 // run pipeline 63 cursor, err := collection.Aggregate(ctx, mongo.Pipeline{searchStage, limitStage, projectStage}, opts) 64 if err != nil { 65 panic(err) 66 } 67 // print results 68 var results []bson.D 69 if err = cursor.All(context.TODO(), &results); err != nil { 70 panic(err) 71 } 72 for _, result := range results { 73 fmt.Println(result) 74 } 75 } 在运行示例之前,请将
<connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。运行以下命令来查询您的集合:
go run compound-boost-query.go [{title Snow in Paradise} {year 2014} {score 6.7722930908203125} {highlights [[{score 1.382846713066101} {path title} {texts [[{value Snow} {type hit}] [{value in Paradise} {type text}]]}]]}] [{title Snow on the Blades} {year 2014} {score 6.063445568084717} {highlights [[{score 1.3766303062438965} {path title} {texts [[{value Snow} {type hit}] [{value on the Blades} {type text}]]}]]}] [{title The Snow White Murder Case} {year 2014} {score 5.509652137756348} {highlights [[{score 1.3525336980819702} {path title} {texts [[{value The } {type text}] [{value Snow} {type hit}] [{value White Murder Case} {type text}]]}]]}] [{title Dead Snow 2: Red vs. Dead} {year 2014} {score 5.065053939819336} {highlights [[{score 1.3924485445022583} {path title} {texts [[{value Dead } {type text}] [{value Snow} {type hit}] [{value 2: Red vs. } {type text}]]}]]}] [{year 2013} {title The Secret Life of Walter Mitty} {score 1} {highlights []}] [{title Jurassic World} {year 2015} {score 1} {highlights []}] [{title Action Jackson} {year 2014} {score 1} {highlights []}] [{year 2013} {title In Secret} {score 1} {highlights []}] [{title The Stanford Prison Experiment} {year 2015} {score 1} {highlights []}] [{year 2014} {title The Giver} {score 1} {highlights []}] 结果中列出的前四个文档评分较高,因为查询中的
should
子句将标题中包含snow
的文档指定为首选项。should
子句还使用boost
选项更改了查询词snow
的分数。go run compound-boost-query.go [ { genres: [ 'Comedy', 'Horror' ], title: 'Dead Snow', year: 2009, score: 21.872983932495117 }, { year: 2000, genres: [ 'Adventure', 'Comedy', 'Family' ], title: 'Snow Day', score: 21.043487548828125 }, { genres: [ 'Adventure', 'Comedy', 'Family' ], title: 'Snow Dogs', year: 2002, score: 21.043487548828125 }, { year: 1999, genres: [ 'Comedy', 'Romance' ], title: 'Let It Snow', score: 19.523927688598633 }, { genres: [ 'Action', 'Comedy', 'Horror' ], title: 'Dead Snow 2: Red vs. Dead', year: 2014, score: 17.426334381103516 }, { genres: [ 'Comedy', 'Drama' ], title: 'Snow White and Russian Red', year: 2009, score: 16.367326736450195 }, { genres: [ 'Comedy', 'Drama', 'Romance' ], title: 'The Tiger and the Snow', year: 2005, score: 15.537829399108887 }, { genres: [ 'Adventure', 'Comedy', 'Family' ], title: 'Snow White and the Three Stooges', year: 1961, score: 14.4263334274292 } ]
运行 Atlas Search 复合查询,使用 function
选项更改分数。
创建一个名为
compound-boost-query.go
的文件。将代码示例复制并粘贴到
compound-function-query.go
文件中。此代码示例将执行以下任务:
导入
mongodb
包和依赖项。建立与您的 Atlas 集群的连接。
使用以下
compound
操作符子句:指定突出显示选项,从
title
字段返回与查询匹配的代码段。这些代码段包含使用type: 'hit'
指定的匹配文本以及使用type: 'text'
指定的相邻文本。使用以下管道阶段:
遍历游标以打印与查询匹配的文档。
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 "time" 7 8 "go.mongodb.org/mongo-driver/bson" 9 "go.mongodb.org/mongo-driver/mongo" 10 "go.mongodb.org/mongo-driver/mongo/options" 11 ) 12 13 func main() { 14 // connect to your Atlas cluster 15 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("<connection-string>")) 16 if err != nil { 17 panic(err) 18 } 19 defer client.Disconnect(context.TODO()) 20 21 // set namespace 22 collection := client.Database("sample_mflix").Collection("movies") 23 24 // define pipeline 25 searchStage := bson.D{{"$search", bson.M{ 26 "index": "compound-query-custom-score-tutorial", 27 "compound": bson.M{ 28 "must": bson.M{ 29 "range": bson.M{ 30 "path": "year", "gte": 2013, "lte": 2015, 31 }, 32 }, 33 "should": bson.D{ 34 {"text", bson.M{ 35 "path": "title", "query": "snow", "score": bson.M{ 36 "function": bson.D{{"add", bson.A{ 37 bson.D{{"path", bson.D{ 38 {"value", "imdb.rating"}, {"undefined", 2}, 39 }}}, 40 bson.D{{"score", "relevance"}}, 41 }}}, 42 }}}}, 43 }, 44 "highlight": bson.D{{"path", "title"}}, 45 }}} 46 limitStage := bson.D{{"$limit", 10}} 47 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"year", 1}, {"_id", 0}, {"score", bson.D{{"$meta", "searchScore"}}}, {"highlights", bson.D{{"$meta", "searchHighlights"}}}}}} 48 49 // specify the amount of time the operation can run on the server 50 opts := options.Aggregate().SetMaxTime(5 * time.Second) 51 52 // run pipeline 53 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, limitStage, projectStage}, opts) 54 if err != nil { 55 panic(err) 56 } 57 58 // print results 59 var results []bson.D 60 if err = cursor.All(context.TODO(), &results); err != nil { 61 panic(err) 62 } 63 for _, result := range results { 64 fmt.Println(result) 65 } 66 } 在运行示例之前,请将
<connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。运行以下命令来查询您的集合:
go run compound-function-query.go [{title The Snow White Murder Case} {year 2014} {score 10.454826354980469} {highlights [[{score 1.3525336980819702} {path title} {texts [[{value The } {type text}] [{value Snow} {type hit}] [{value White Murder Case} {type text}]]}]]}] [{title Snow on the Blades} {year 2014} {score 10.3317232131958} {highlights [[{score 1.3766303062438965} {path title} {texts [[{value Snow} {type hit}] [{value on the Blades} {type text}]]}]]}] [{title Dead Snow 2: Red vs. Dead} {year 2014} {score 10.032526969909668} {highlights [[{score 1.3924485445022583} {path title} {texts [[{value Dead } {type text}] [{value Snow} {type hit}] [{value 2: Red vs. } {type text}]]}]]}] [{title Snow in Paradise} {year 2014} {score 8.386146545410156} {highlights [[{score 1.382846713066101} {path title} {texts [[{value Snow} {type hit}] [{value in Paradise} {type text}]]}]]}] [{year 2013} {title The Secret Life of Walter Mitty} {score 1} {highlights []}] [{title Jurassic World} {year 2015} {score 1} {highlights []}] [{title Action Jackson} {year 2014} {score 1} {highlights []}] [{year 2013} {title In Secret} {score 1} {highlights []}] [{title The Stanford Prison Experiment} {year 2015} {score 1} {highlights []}] [{year 2014} {title The Giver} {score 1} {highlights []}] 结果中列出的前四个文档评分较高,因为查询中的
should
子句将标题中包含snow
的文档指定为首选项。should
子句还使用function
选项更改了查询词snow
的分数。
运行 Atlas Search 复合查询,使用 constant
选项更改分数。
创建一个名为
CompoundConstantQuery.java
的文件。将以下代码复制并粘贴到该文件中。
此代码示例将执行以下任务:
导入
mongodb
包和依赖项。建立与您的 Atlas 集群的连接。
使用以下复合子句查询集合:
指定突出显示选项,从
title
字段返回与查询匹配的代码段。这些代码段包含使用type: 'hit'
指定的匹配文本以及使用type: 'text'
指定的相邻文本。使用以下管道阶段:
遍历游标以打印与查询匹配的文档。
1 import java.util.Arrays; 2 import java.util.List; 3 4 import static com.mongodb.client.model.Aggregates.limit; 5 import static com.mongodb.client.model.Aggregates.project; 6 import static com.mongodb.client.model.Projections.*; 7 import com.mongodb.client.MongoClient; 8 import com.mongodb.client.MongoClients; 9 import com.mongodb.client.MongoCollection; 10 import com.mongodb.client.MongoDatabase; 11 12 import org.bson.Document; 13 14 public class CompoundConstantQuery { 15 public static void main( String[] args ) { 16 // define clauses 17 List<Document> mustClauses = 18 List.of( 19 new Document( 20 "range", new Document("path", "year") 21 .append("gte", 2013) 22 .append("lte", 2015))); 23 List<Document> shouldClauses = 24 List.of( 25 new Document("text", 26 new Document("query", "snow") 27 .append("path", "title") 28 .append("score", new Document("constant", new Document("value", 5))))); 29 Document highlightOption = new Document("path", "title"); 30 // define query 31 Document agg = 32 new Document("$search", 33 new Document("index", "compound-query-custom-score-tutorial") 34 .append("compound", 35 new Document("must", mustClauses).append("should", shouldClauses)) 36 .append("highlight", highlightOption)); 37 // specify connection 38 String uri = "<connection-string>"; 39 // establish connection and set namespace 40 try (MongoClient mongoClient = MongoClients.create(uri)) { 41 MongoDatabase database = mongoClient.getDatabase("sample_mflix"); 42 MongoCollection<Document> collection = database.getCollection("movies"); 43 // run query and print results 44 collection.aggregate(Arrays.asList(agg, 45 limit(10), 46 project(fields( 47 excludeId(), 48 include("title", "year"), 49 computed("score", new Document("$meta", "searchScore")), 50 computed("highlights", new Document("$meta", "searchHighlights")))))) 51 .forEach(doc -> System.out.println(doc.toJson())); 52 } 53 } 54 } 注意
要在 Maven 环境中运行示例代码,请在文件中的 import 语句上方添加以下内容。
package com.mongodb.drivers; 在运行示例之前,请将
<connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。编译并运行
CompoundConstantQuery.java
文件。javac CompoundConstantQuery.java java CompoundConstantQuery {"title": "Snow in Paradise", "year": 2014, "score": 5.0, "highlights": [{"score": 1.382846713066101, "path": "title", "texts": [{"value": "Snow", "type": "hit"}, {"value": " in Paradise", "type": "text"}]}]} {"title": "Dead Snow 2: Red vs. Dead", "year": 2014, "score": 5.0, "highlights": [{"score": 1.3924485445022583, "path": "title", "texts": [{"value": "Dead ", "type": "text"}, {"value": "Snow", "type": "hit"}, {"value": " 2: Red vs. ", "type": "text"}]}]} {"title": "The Snow White Murder Case", "year": 2014, "score": 5.0, "highlights": [{"score": 1.3525336980819702, "path": "title", "texts": [{"value": "The ", "type": "text"}, {"value": "Snow", "type": "hit"}, {"value": " White Murder Case", "type": "text"}]}]} {"title": "Snow on the Blades", "year": 2014, "score": 5.0, "highlights": [{"score": 1.3766303062438965, "path": "title", "texts": [{"value": "Snow", "type": "hit"}, {"value": " on the Blades", "type": "text"}]}]} {"year": 2013, "title": "The Secret Life of Walter Mitty", "score": 0.0, "highlights": []} {"title": "Jurassic World", "year": 2015, "score": 0.0, "highlights": []} {"title": "Action Jackson", "year": 2014, "score": 0.0, "highlights": []} {"year": 2013, "title": "In Secret", "score": 0.0, "highlights": []} {"title": "The Stanford Prison Experiment", "year": 2015, "score": 0.0, "highlights": []} {"year": 2014, "title": "The Giver", "score": 0.0, "highlights": []} 结果中列出的前四个文档评分较高,因为查询中的
should
子句将标题中包含snow
的文档指定为首选项。should
子句还使用constant
选项更改了查询词snow
的分数。
运行 Atlas Search 复合查询,使用 boost
选项更改分数。
创建一个名为
CompoundBoostQuery.java
的文件。将以下代码复制并粘贴到该文件中。
此代码示例将执行以下任务:
导入
mongodb
包和依赖项。建立与您的 Atlas 集群的连接。
遍历游标以打印与查询匹配的文档。
查询使用了下列管道阶段:
$search
查询集合阶段。查询:使用以下
compound
操作符子句:
指定突出显示选项,从
title
字段返回与查询匹配的代码段。这些代码段包含使用type: 'hit'
指定的匹配文本以及使用type: 'text'
指定的相邻文本。
1 import java.util.Arrays; 2 import java.util.List; 3 4 import static com.mongodb.client.model.Aggregates.limit; 5 import static com.mongodb.client.model.Aggregates.project; 6 import static com.mongodb.client.model.Projections.*; 7 import com.mongodb.client.MongoClient; 8 import com.mongodb.client.MongoClients; 9 import com.mongodb.client.MongoCollection; 10 import com.mongodb.client.MongoDatabase; 11 import org.bson.Document; 12 13 public class CompoundBoostQuery { 14 public static void main( String[] args ) { 15 // define clauses 16 List<Document> mustClauses = 17 List.of( 18 new Document( 19 "range", new Document("path", "year") 20 .append("gte", 2013) 21 .append("lte", 2015))); 22 List<Document> shouldClauses = 23 List.of( 24 new Document( 25 "text", 26 new Document("query", "snow") 27 .append("path", "title") 28 .append("score", new Document("boost", new Document("value", 2))))); 29 Document highlightOption = new Document("path", "title"); 30 // define query 31 Document agg = 32 new Document("$search", 33 new Document("index", "compound-query-custom-score-tutorial") 34 .append("compound", 35 new Document("must", mustClauses).append("should", shouldClauses)) 36 .append("highlight", highlightOption)); 37 // specify connection 38 String uri = "<connection-string>"; 39 // establish connection and set namespace 40 try (MongoClient mongoClient = MongoClients.create(uri)) { 41 MongoDatabase database = mongoClient.getDatabase("sample_mflix"); 42 MongoCollection<Document> collection = database.getCollection("movies"); 43 // run query and print results 44 collection.aggregate(Arrays.asList(agg, 45 limit(10), 46 project(fields( 47 excludeId(), 48 include("title", "year"), 49 computed("score", new Document("$meta", "searchScore")), 50 computed("highlights", new Document("$meta", "searchHighlights")))))) 51 .forEach(doc -> System.out.println(doc.toJson())); 52 } 53 } 54 } 此查询使用以下带有
boost
选项的compound
操作符子句,使某些字段的优先级高于其他字段:must
带文本操作符的子句优先考虑comedy
类型,然后是title
字段中的术语snow
。boost
选项将权重应用于字段。should
带有范围操作符的子句,用于搜索2013
到2015
年之间的电影。
注意
boost
选项会对字段应用不同的权重,以确定字段的优先级。1 import java.util.Arrays; 2 import static com.mongodb.client.model.Filters.eq; 3 import static com.mongodb.client.model.Aggregates.limit; 4 import static com.mongodb.client.model.Aggregates.project; 5 import static com.mongodb.client.model.Projections.computed; 6 import static com.mongodb.client.model.Projections.excludeId; 7 import static com.mongodb.client.model.Projections.fields; 8 import static com.mongodb.client.model.Projections.include; 9 import com.mongodb.client.MongoClient; 10 import com.mongodb.client.MongoClients; 11 import com.mongodb.client.MongoCollection; 12 import com.mongodb.client.MongoDatabase; 13 import org.bson.Document; 14 15 public class CompoundBoostQuery { 16 public static void main( String[] args ) { 17 Document agg = new Document("index", "compound-query-custom-score-tutorial") 18 .append("must", Arrays.asList(new Document("text", 19 new Document("path", "genres") 20 .append("query", "comedy") 21 .append("score", 22 new Document("boost", 23 new Document("value", 9)))), 24 new Document("text", 25 new Document("path", "title") 26 .append("query", "snow") 27 .append("score", 28 new Document("boost", 29 new Document("value", 5)))))) 30 .append("should", Arrays.asList(new Document("range", 31 new Document("path", "year") 32 .append("gte", 2013) 33 .append("lte", 2015) 34 .append("score", 35 new Document("boost", 36 new Document("value", 3)))))); 37 38 String uri = "<connection-string>"; 39 40 try (MongoClient mongoClient = MongoClients.create(uri)) { 41 MongoDatabase database = mongoClient.getDatabase("sample_mflix"); 42 MongoCollection<Document> collection = database.getCollection("movies"); 43 44 collection.aggregate(Arrays.asList( 45 eq("$search", eq("compound", agg)), 46 limit(10), 47 project(fields(excludeId(), include("title", "year","genres"), computed("score", new Document("$meta", "searchScore"))))) 48 ).forEach(doc -> System.out.println(doc.toJson())); 49 } 50 } 51 } 注意
要在 Maven 环境中运行示例代码,请在文件中的 import 语句上方添加以下内容。
package com.mongodb.drivers; 在运行示例之前,请将
<connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。编译并运行
CompoundBoostQuery.java
文件。javac CompoundBoostQuery.java java CompoundBoostQuery {"title": "Snow in Paradise", "year": 2014, "score": 6.7722930908203125, "highlights": [{"score": 1.382846713066101, "path": "title", "texts": [{"value": "Snow", "type": "hit"}, {"value": " in Paradise", "type": "text"}]}]} {"title": "Snow on the Blades", "year": 2014, "score": 6.063445568084717, "highlights": [{"score": 1.3766303062438965, "path": "title", "texts": [{"value": "Snow", "type": "hit"}, {"value": " on the Blades", "type": "text"}]}]} {"title": "The Snow White Murder Case", "year": 2014, "score": 5.509652137756348, "highlights": [{"score": 1.3525336980819702, "path": "title", "texts": [{"value": "The ", "type": "text"}, {"value": "Snow", "type": "hit"}, {"value": " White Murder Case", "type": "text"}]}]} {"title": "Dead Snow 2: Red vs. Dead", "year": 2014, "score": 5.065053939819336, "highlights": [{"score": 1.3924485445022583, "path": "title", "texts": [{"value": "Dead ", "type": "text"}, {"value": "Snow", "type": "hit"}, {"value": " 2: Red vs. ", "type": "text"}]}]} {"year": 2013, "title": "The Secret Life of Walter Mitty", "score": 1.0, "highlights": []} {"title": "Jurassic World", "year": 2015, "score": 1.0, "highlights": []} {"title": "Action Jackson", "year": 2014, "score": 1.0, "highlights": []} {"year": 2013, "title": "In Secret", "score": 1.0, "highlights": []} {"title": "The Stanford Prison Experiment", "year": 2015, "score": 1.0, "highlights": []} {"year": 2014, "title": "The Giver", "score": 1.0, "highlights": []} 结果中列出的前四个文档评分较高,因为查询中的
should
子句将标题中包含snow
的文档指定为首选项。should
子句还使用boost
选项更改了查询词snow
的分数。javac CompoundBoostQuery.java java CompoundBoostQuery { "genres": ["Comedy", "Horror"], "title": "Dead Snow", "year": 2009, "score": 21.872983932495117 } { "year": 2000, "genres": ["Adventure", "Comedy", "Family"], "title": "Snow Day", "score": 21.043487548828125 } { "genres": ["Adventure", "Comedy", "Family"], "title": "Snow Dogs", "year": 2002, "score": 21.043487548828125 } { "year": 1999, "genres": ["Comedy", "Romance"], "title": "Let It Snow", "score": 19.523927688598633 } { "genres": ["Action", "Comedy", "Horror"], "title": "Dead Snow 2: Red vs. Dead", "year": 2014, "score": 17.426334381103516 } { "genres": ["Comedy", "Drama"], "title": "Snow White and Russian Red", "year": 2009, "score": 16.367326736450195} { "genres": ["Comedy", "Drama", "Romance"], "title": "The Tiger and the Snow", "year": 2005, "score": 15.537829399108887 } { "genres": ["Adventure", "Comedy", "Family"], "title": "Snow White and the Three Stooges", "year": 1961, "score": 14.4263334274292 }
运行 Atlas Search 复合查询,使用 function
选项更改分数。
创建一个名为
CompoundFunctionQuery.java
的文件。将以下代码复制并粘贴到该文件中。
此代码示例将执行以下任务:
导入
mongodb
包和依赖项。建立与您的 Atlas 集群的连接。
使用以下管道阶段来查询集合:
使用以下管道阶段:
指定突出显示选项,从
title
字段返回与查询匹配的代码段。这些代码段包含使用type: 'hit'
指定的匹配文本以及使用type: 'text'
指定的相邻文本。遍历游标以打印与查询匹配的文档。
1 import java.util.Arrays; 2 import java.util.List; 3 4 import static com.mongodb.client.model.Aggregates.limit; 5 import static com.mongodb.client.model.Aggregates.project; 6 import static com.mongodb.client.model.Projections.*; 7 import com.mongodb.client.MongoClient; 8 import com.mongodb.client.MongoClients; 9 import com.mongodb.client.MongoCollection; 10 import com.mongodb.client.MongoDatabase; 11 import org.bson.Document; 12 13 public class CompoundFunctionQuery { 14 public static void main( String[] args ) { 15 // define clauses 16 List<Document> mustClauses = 17 List.of( 18 new Document("range", new Document("path", "year") 19 .append("gte", 2013) 20 .append("lte", 2015))); 21 List<Document> shouldClauses = 22 List.of( 23 new Document("text", 24 new Document("query", "snow") 25 .append("path", "title") 26 .append("score", new Document("function", 27 new Document("add", Arrays.asList( 28 new Document("path", new Document("value", "imdb.rating") 29 .append("undefined", 2)), new Document("score", "relevance"))))))); 30 Document highlightOption = new Document("path", "title"); 31 // define query 32 Document agg = 33 new Document("$search", 34 new Document("index", "compound-query-custom-score-tutorial") 35 .append("compound", 36 new Document("must", mustClauses).append("should", shouldClauses)) 37 .append("highlight", highlightOption)); 38 // specify connection 39 String uri = "<connection-string>"; 40 // establish connection and set namespace 41 try (MongoClient mongoClient = MongoClients.create(uri)) { 42 MongoDatabase database = mongoClient.getDatabase("sample_mflix"); 43 MongoCollection<Document> collection = database.getCollection("movies"); 44 // run query and print results 45 collection.aggregate(Arrays.asList(agg, 46 limit(10), 47 project(fields( 48 excludeId(), 49 include("title", "year"), 50 computed("score", new Document("$meta", "searchScore")), 51 computed("highlights", new Document("$meta", "searchHighlights")))))) 52 .forEach(doc -> System.out.println(doc.toJson())); 53 } 54 } 55 } 注意
要在 Maven 环境中运行示例代码,请在文件中的 import 语句上方添加以下内容。
package com.mongodb.drivers; 在运行示例之前,请将
<connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。编译并运行
CompoundFunctionQuery.java
文件。javac CompoundFunctionQuery.java java CompoundFunctionQuery {"title": "The Snow White Murder Case", "year": 2014, "score": 10.454826354980469, "highlights": [{"score": 1.3525336980819702, "path": "title", "texts": [{"value": "The ", "type": "text"}, {"value": "Snow", "type": "hit"}, {"value": " White Murder Case", "type": "text"}]}]} {"title": "Snow on the Blades", "year": 2014, "score": 10.3317232131958, "highlights": [{"score": 1.3766303062438965, "path": "title", "texts": [{"value": "Snow", "type": "hit"}, {"value": " on the Blades", "type": "text"}]}]} {"title": "Dead Snow 2: Red vs. Dead", "year": 2014, "score": 10.032526969909668, "highlights": [{"score": 1.3924485445022583, "path": "title", "texts": [{"value": "Dead ", "type": "text"}, {"value": "Snow", "type": "hit"}, {"value": " 2: Red vs. ", "type": "text"}]}]} {"title": "Snow in Paradise", "year": 2014, "score": 8.386146545410156, "highlights": [{"score": 1.382846713066101, "path": "title", "texts": [{"value": "Snow", "type": "hit"}, {"value": " in Paradise", "type": "text"}]}]} {"year": 2013, "title": "The Secret Life of Walter Mitty", "score": 1.0, "highlights": []} {"title": "Jurassic World", "year": 2015, "score": 1.0, "highlights": []} {"title": "Action Jackson", "year": 2014, "score": 1.0, "highlights": []} {"year": 2013, "title": "In Secret", "score": 1.0, "highlights": []} {"title": "The Stanford Prison Experiment", "year": 2015, "score": 1.0, "highlights": []} {"year": 2014, "title": "The Giver", "score": 1.0, "highlights": []} 结果中列出的前四个文档评分较高,因为查询中的
should
子句将标题中包含snow
的文档指定为首选项。should
子句还使用function
选项更改了查询词snow
的分数。
运行 Atlas Search 复合查询,使用 constant
选项更改分数。
创建一个名为
CompoundConstantQuery.kt
的文件。将以下代码复制并粘贴到该文件中。
此代码示例将执行以下任务:
导入
mongodb
包和依赖项。建立与您的 Atlas 集群的连接。
使用以下复合子句查询集合:
指定突出显示选项,从
title
字段返回与查询匹配的代码段。这些代码段包含使用type: 'hit'
指定的匹配文本以及使用type: 'text'
指定的相邻文本。使用以下管道阶段:
打印与
AggregateFlow
实例中的查询相匹配的文档。
1 import com.mongodb.client.model.Aggregates.limit 2 import com.mongodb.client.model.Aggregates.project 3 import com.mongodb.client.model.Projections.* 4 import com.mongodb.kotlin.client.coroutine.MongoClient 5 import kotlinx.coroutines.runBlocking 6 import org.bson.Document 7 8 fun main() { 9 // establish connection and set namespace 10 val uri = "<connection-string>" 11 val mongoClient = MongoClient.create(uri) 12 val database = mongoClient.getDatabase("sample_mflix") 13 val collection = database.getCollection<Document>("movies") 14 15 runBlocking { 16 // define clauses 17 val mustClauses = listOf( 18 Document( 19 "range", Document("path", "year") 20 .append("gte", 2013) 21 .append("lte", 2015) 22 ) 23 ) 24 25 val shouldClauses = listOf( 26 Document( 27 "text", 28 Document("query", "snow") 29 .append("path", "title") 30 .append("score", Document("constant", Document("value", 5))) 31 ) 32 ) 33 34 val highlightOption = Document("path", "title") 35 36 // define pipeline 37 val agg = Document( 38 "\$search", 39 Document("index", "compound-query-custom-score-tutorial") 40 .append( 41 "compound", 42 Document("must", mustClauses).append("should", shouldClauses) 43 ) 44 .append("highlight", highlightOption) 45 ) 46 47 val resultsFlow = collection.aggregate<Document>( 48 listOf( 49 agg, 50 limit(10), 51 project(fields( 52 excludeId(), 53 include("title", "year"), 54 computed("score", Document("\$meta", "searchScore")), 55 computed("highlights", Document("\$meta", "searchHighlights")) 56 )) 57 ) 58 ) 59 resultsFlow.collect { println(it) } 60 } 61 mongoClient.close() 62 } 在运行示例之前,请将
<connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。运行
CompoundConstantQuery.kt
文件。当你在 IDE 中运行
CompoundConstantQuery.kt
程序时,它会打印以下文档:Document{{title=Snow in Paradise, year=2014, score=6.0, highlights=[Document{{score=1.382846713066101, path=title, texts=[Document{{value=Snow, type=hit}}, Document{{value= in Paradise, type=text}}]}}]}} Document{{title=Dead Snow 2: Red vs. Dead, year=2014, score=6.0, highlights=[Document{{score=1.3924485445022583, path=title, texts=[Document{{value=Dead , type=text}}, Document{{value=Snow, type=hit}}, Document{{value= 2: Red vs. , type=text}}]}}]}} Document{{title=The Snow White Murder Case, year=2014, score=6.0, highlights=[Document{{score=1.3525336980819702, path=title, texts=[Document{{value=The , type=text}}, Document{{value=Snow, type=hit}}, Document{{value= White Murder Case, type=text}}]}}]}} Document{{title=Snow on the Blades, year=2014, score=6.0, highlights=[Document{{score=1.3766303062438965, path=title, texts=[Document{{value=Snow, type=hit}}, Document{{value= on the Blades, type=text}}]}}]}} Document{{year=2013, title=The Secret Life of Walter Mitty, score=1.0, highlights=[]}} Document{{title=Jurassic World, year=2015, score=1.0, highlights=[]}} Document{{title=Action Jackson, year=2014, score=1.0, highlights=[]}} Document{{year=2013, title=In Secret, score=1.0, highlights=[]}} Document{{title=The Stanford Prison Experiment, year=2015, score=1.0, highlights=[]}} Document{{year=2014, title=The Giver, score=1.0, highlights=[]}} 结果中列出的前四个文档评分较高,因为查询中的
should
子句将标题中包含snow
的文档指定为首选项。should
子句还使用constant
选项更改了查询词snow
的分数。
运行 Atlas Search 复合查询,使用 boost
选项更改分数。
创建一个名为
CompoundBoostQuery.kt
的文件。将以下代码复制并粘贴到该文件中。
此代码示例将执行以下任务:
导入
mongodb
包和依赖项。建立与您的 Atlas 集群的连接。
打印与
AggregateFlow
实例中的查询相匹配的文档。
查询使用了下列管道阶段:
$search
查询集合阶段。查询:使用以下
compound
操作符子句:
指定突出显示选项,从
title
字段返回与查询匹配的代码段。这些代码段包含使用type: 'hit'
指定的匹配文本以及使用type: 'text'
指定的相邻文本。
1 import com.mongodb.client.model.Aggregates.limit 2 import com.mongodb.client.model.Aggregates.project 3 import com.mongodb.client.model.Projections.* 4 import com.mongodb.kotlin.client.coroutine.MongoClient 5 import kotlinx.coroutines.runBlocking 6 import org.bson.Document 7 8 fun main() { 9 // establish connection and set namespace 10 val uri = "<connection-string>" 11 val mongoClient = MongoClient.create(uri) 12 13 val database = mongoClient.getDatabase("sample_mflix") 14 val collection = database.getCollection<Document>("movies") 15 16 runBlocking { 17 // define clauses 18 val mustClauses = listOf( 19 Document( 20 "range", Document("path", "year") 21 .append("gte", 2013) 22 .append("lte", 2015) 23 ) 24 ) 25 26 val shouldClauses = listOf( 27 Document( 28 "text", 29 Document("query", "snow") 30 .append("path", "title") 31 .append("score", Document("boost", Document("value", 2))) 32 ) 33 ) 34 35 val highlightOption = Document("path", "title") 36 37 // define pipeline 38 val agg = Document( 39 "\$search", 40 Document("index", "compound-query-custom-score-tutorial") 41 .append( 42 "compound", 43 Document("must", mustClauses).append("should", shouldClauses) 44 ) 45 .append("highlight", highlightOption) 46 ) 47 48 // run query and print results 49 val resultsFlow = collection.aggregate<Document>( 50 listOf( 51 agg, 52 limit(10), 53 project(fields( 54 excludeId(), 55 include("title", "year"), 56 computed("score", Document("\$meta", "searchScore")), 57 computed("highlights", Document("\$meta", "searchHighlights")) 58 )) 59 ) 60 ) 61 resultsFlow.collect { println(it) } 62 } 63 mongoClient.close() 64 } 此查询使用以下带有
boost
选项的compound
操作符子句,使某些字段的优先级高于其他字段:must
带文本操作符的子句优先考虑comedy
类型,然后是title
字段中的术语snow
。boost
选项将权重应用于字段。should
带有范围操作符的子句,用于搜索2013
到2015
年之间的电影。
注意
boost
选项会对字段应用不同的权重,以确定字段的优先级。1 import com.mongodb.client.model.Aggregates.limit 2 import com.mongodb.client.model.Aggregates.project 3 import com.mongodb.client.model.Projections.* 4 import com.mongodb.kotlin.client.coroutine.MongoClient 5 import kotlinx.coroutines.runBlocking 6 import org.bson.Document 7 8 fun main() { 9 // establish connection and set namespace 10 val uri = "<connection-string>" 11 val mongoClient = MongoClient.create(uri) 12 13 val database = mongoClient.getDatabase("sample_mflix") 14 val collection = database.getCollection<Document>("movies") 15 16 runBlocking { 17 // define pipeline 18 val agg = Document( 19 "\$search", 20 Document("index", "compound-query-custom-score-tutorial") 21 .append( 22 "compound", 23 Document( 24 "must", listOf( 25 Document( 26 "text", 27 Document("path", "genres") 28 .append("query", "comedy") 29 .append( 30 "score", 31 Document( 32 "boost", 33 Document("value", 9) 34 ) 35 ) 36 ), 37 Document( 38 "text", 39 Document("path", "title") 40 .append("query", "snow") 41 .append( 42 "score", 43 Document( 44 "boost", 45 Document("value", 5) 46 ) 47 ) 48 ) 49 ) 50 ) 51 .append( 52 "should", listOf( 53 Document( 54 "range", 55 Document("path", "year") 56 .append("gte", 2013) 57 .append("lte", 2015) 58 .append( 59 "score", 60 Document( 61 "boost", 62 Document("value", 3) 63 ) 64 ) 65 ) 66 ) 67 ) 68 ) 69 ) 70 71 // run query and print results 72 val resultsFlow = collection.aggregate<Document>( 73 listOf( 74 agg, 75 limit(10), 76 project(fields( 77 excludeId(), 78 include("title", "year","genres"), 79 computed("score", Document("\$meta", "searchScore")) 80 )) 81 ) 82 ) 83 resultsFlow.collect { println(it) } 84 } 85 mongoClient.close() 86 } 在运行示例之前,请将
<connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。运行
CompoundBoostQuery.kt
文件。当你在 IDE 中运行
CompoundBoostQuery.kt
程序时,它会打印以下文档:Document{{title=Snow in Paradise, year=2014, score=6.784297466278076, highlights=[Document{{score=1.382846713066101, path=title, texts=[Document{{value=Snow, type=hit}}, Document{{value= in Paradise, type=text}}]}}]}} Document{{title=Snow on the Blades, year=2014, score=6.073266506195068, highlights=[Document{{score=1.3766303062438965, path=title, texts=[Document{{value=Snow, type=hit}}, Document{{value= on the Blades, type=text}}]}}]}} Document{{title=The Snow White Murder Case, year=2014, score=5.517906188964844, highlights=[Document{{score=1.3525336980819702, path=title, texts=[Document{{value=The , type=text}}, Document{{value=Snow, type=hit}}, Document{{value= White Murder Case, type=text}}]}}]}} Document{{title=Dead Snow 2: Red vs. Dead, year=2014, score=5.072136878967285, highlights=[Document{{score=1.3924485445022583, path=title, texts=[Document{{value=Dead , type=text}}, Document{{value=Snow, type=hit}}, Document{{value= 2: Red vs. , type=text}}]}}]}} Document{{year=2013, title=The Secret Life of Walter Mitty, score=1.0, highlights=[]}} Document{{title=Jurassic World, year=2015, score=1.0, highlights=[]}} Document{{title=Action Jackson, year=2014, score=1.0, highlights=[]}} Document{{year=2013, title=In Secret, score=1.0, highlights=[]}} Document{{title=The Stanford Prison Experiment, year=2015, score=1.0, highlights=[]}} Document{{year=2014, title=The Giver, score=1.0, highlights=[]}} 结果中列出的前四个文档评分较高,因为查询中的
should
子句将标题中包含snow
的文档指定为首选项。should
子句还使用boost
选项更改了查询词snow
的分数。当你在 IDE 中运行
CompoundBoostQuery.kt
程序时,它会打印以下文档:Document{{year=2000, genres=[Adventure, Comedy, Family], title=Snow Day, score=20.998544692993164}} Document{{genres=[Adventure, Comedy, Family], title=Snow Dogs, year=2002, score=20.998544692993164}} Document{{year=1999, genres=[Comedy, Romance], title=Let It Snow, score=19.45327377319336}} Document{{genres=[Action, Comedy, Horror], title=Dead Snow 2: Red vs. Dead, year=2014, score=17.361087799072266}} Document{{genres=[Comedy, Drama], title=Snow White and Russian Red, year=2009, score=16.287294387817383}} Document{{genres=[Comedy, Drama, Romance], title=The Tiger and the Snow, year=2005, score=15.475509643554688}} Document{{genres=[Adventure, Comedy, Family], title=Snow White and the Three Stooges, year=1961, score=14.361087799072266}}
运行 Atlas Search 复合查询,使用 function
选项更改分数。
创建一个名为
CompoundFunctionQuery.kt
的文件。将以下代码复制并粘贴到该文件中。
此代码示例将执行以下任务:
导入
mongodb
包和依赖项。建立与您的 Atlas 集群的连接。
使用以下管道阶段来查询集合:
使用以下管道阶段:
指定突出显示选项,从
title
字段返回与查询匹配的代码段。这些代码段包含使用type: 'hit'
指定的匹配文本以及使用type: 'text'
指定的相邻文本。打印与
AggregateFlow
实例中的查询相匹配的文档。
1 import com.mongodb.client.model.Aggregates.limit 2 import com.mongodb.client.model.Aggregates.project 3 import com.mongodb.client.model.Projections.* 4 import com.mongodb.kotlin.client.coroutine.MongoClient 5 import kotlinx.coroutines.runBlocking 6 import org.bson.Document 7 8 fun main() { 9 // establish connection and set namespace 10 val uri = "<connection-string>" 11 val mongoClient = MongoClient.create(uri) 12 13 val database = mongoClient.getDatabase("sample_mflix") 14 val collection = database.getCollection<Document>("movies") 15 16 runBlocking { 17 // define clauses 18 val mustClauses = listOf( 19 Document( 20 "range", Document("path", "year") 21 .append("gte", 2013) 22 .append("lte", 2015) 23 ) 24 ) 25 26 val shouldClauses = listOf( 27 Document("text", Document("query", "snow") 28 .append("path", "title") 29 .append("score", 30 Document("function", Document("add", listOf( 31 Document("path", Document("value", "imdb.rating").append("undefined", 2)), 32 Document("score", "relevance") 33 ))) 34 ) 35 ) 36 ) 37 38 val highlightOption = Document("path", "title") 39 40 // define pipeline 41 val agg = Document( 42 "\$search", 43 Document("index", "compound-query-custom-score-tutorial") 44 .append( 45 "compound", 46 Document("must", mustClauses).append("should", shouldClauses) 47 ) 48 .append("highlight", highlightOption) 49 ) 50 51 // run query and print results 52 val resultsFlow = collection.aggregate<Document>( 53 listOf( 54 agg, 55 limit(10), 56 project(fields( 57 excludeId(), 58 include("title", "year"), 59 computed("score", Document("\$meta", "searchScore")), 60 computed("highlights", Document("\$meta", "searchHighlights")) 61 )) 62 ) 63 ) 64 resultsFlow.collect { println(it) } 65 } 66 mongoClient.close() 67 } 在运行示例之前,请将
<connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。运行
CompoundFunctionQuery.kt
文件。当你在 IDE 中运行
CompoundFunctionQuery.kt
程序时,它会打印以下文档:Document{{title=The Snow White Murder Case, year=2014, score=10.458952903747559, highlights=[Document{{score=1.3525336980819702, path=title, texts=[Document{{value=The , type=text}}, Document{{value=Snow, type=hit}}, Document{{value= White Murder Case, type=text}}]}}]}} Document{{title=Snow on the Blades, year=2014, score=10.336633682250977, highlights=[Document{{score=1.3766303062438965, path=title, texts=[Document{{value=Snow, type=hit}}, Document{{value= on the Blades, type=text}}]}}]}} Document{{title=Dead Snow 2: Red vs. Dead, year=2014, score=10.036067962646484, highlights=[Document{{score=1.3924485445022583, path=title, texts=[Document{{value=Dead , type=text}}, Document{{value=Snow, type=hit}}, Document{{value= 2: Red vs. , type=text}}]}}]}} Document{{title=Snow in Paradise, year=2014, score=8.392148971557617, highlights=[Document{{score=1.382846713066101, path=title, texts=[Document{{value=Snow, type=hit}}, Document{{value= in Paradise, type=text}}]}}]}} Document{{year=2013, title=The Secret Life of Walter Mitty, score=1.0, highlights=[]}} Document{{title=Jurassic World, year=2015, score=1.0, highlights=[]}} Document{{title=Action Jackson, year=2014, score=1.0, highlights=[]}} Document{{year=2013, title=In Secret, score=1.0, highlights=[]}} Document{{title=The Stanford Prison Experiment, year=2015, score=1.0, highlights=[]}} Document{{year=2014, title=The Giver, score=1.0, highlights=[]}} 结果中列出的前四个文档评分较高,因为查询中的
should
子句将标题中包含snow
的文档指定为首选项。should
子句还使用function
选项更改了查询词snow
的分数。
运行 Atlas Search 复合查询,使用 constant
选项更改分数。
创建一个名为
compound-constant-query.js
的文件。将代码示例复制并粘贴到
compound-constant-query.js
文件中。此代码示例将执行以下任务:
导入
mongodb
,即 MongoDB 的 Node.js 驱动程序。创建一个
MongoClient
类实例,以建立与 Atlas 集群的连接。使用以下复合子句查询集合:
指定突出显示选项,从
title
字段返回与查询匹配的代码段。这些代码段包含使用type: 'hit'
指定的匹配文本以及使用type: 'text'
指定的相邻文本。使用以下管道阶段:
遍历游标以打印与查询匹配的文档。
1 const MongoClient = require("mongodb").MongoClient; 2 const assert = require("assert"); 3 4 const agg = [ 5 { 6 '$search': { 7 'index': 'compound-query-custom-score-tutorial', 8 'compound': { 9 'filter': [ 10 { 11 'range': { 12 'path': 'year', 13 'gte': 2013, 14 'lte': 2015 15 } 16 } 17 ], 18 'should': [ 19 { 20 'text': { 21 'query': 'snow', 22 'path': 'title', 23 'score': { 24 'constant': { 25 'value': 5 26 } 27 } 28 } 29 } 30 ] 31 }, 32 'highlight': { 33 'path': 'title' 34 } 35 } 36 }, { 37 '$limit': 10 38 }, { 39 '$project': { 40 '_id': 0, 41 'title': 1, 42 'year': 1, 43 'score': { 44 '$meta': 'searchScore' 45 }, 46 'highlights': { 47 '$meta': 'searchHighlights' 48 } 49 } 50 } 51 ]; 52 53 MongoClient.connect( 54 "<connection-string>", 55 { useNewUrlParser: true, useUnifiedTopology: true }, 56 async function (connectErr, client) { 57 assert.equal(null, connectErr); 58 const coll = client.db("sample_mflix").collection("movies"); 59 let cursor = await coll.aggregate(agg); 60 await cursor.forEach((doc) => console.log(doc)); 61 client.close(); 62 } 63 ); 在运行示例之前,请将
<connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。运行以下命令来查询您的集合:
node compound-constant-query.js '{"title":"Snow in Paradise","year":2014,"score":5,"highlights":[{"score":1.382846713066101,"path":"title","texts":[{"value":"Snow","type":"hit"},{"value":" in Paradise","type":"text"}]}]}' '{"title":"Dead Snow 2: Red vs. Dead","year":2014,"score":5,"highlights":[{"score":1.3924485445022583,"path":"title","texts":[{"value":"Dead ","type":"text"},{"value":"Snow","type":"hit"},{"value":" 2: Red vs. ","type":"text"}]}]}' '{"title":"The Snow White Murder Case","year":2014,"score":5,"highlights":[{"score":1.3525336980819702,"path":"title","texts":[{"value":"The ","type":"text"},{"value":"Snow","type":"hit"},{"value":" White Murder Case","type":"text"}]}]}' '{"title":"Snow on the Blades","year":2014,"score":5,"highlights":[{"score":1.3766303062438965,"path":"title","texts":[{"value":"Snow","type":"hit"},{"value":" on the Blades","type":"text"}]}]}' '{"year":2013,"title":"The Secret Life of Walter Mitty","score":0,"highlights":[]}' '{"title":"Jurassic World","year":2015,"score":0,"highlights":[]}' '{"title":"Action Jackson","year":2014,"score":0,"highlights":[]}' '{"year":2013,"title":"In Secret","score":0,"highlights":[]}' '{"title":"The Stanford Prison Experiment","year":2015,"score":0,"highlights":[]}' '{"year":2014,"title":"The Giver","score":0,"highlights":[]}' 结果中列出的前四个文档评分较高,因为查询中的
should
子句将标题中包含snow
的文档指定为首选项。should
子句还使用constant
选项更改了查询词snow
的分数。
运行 Atlas Search 复合查询,使用 boost
选项更改分数。
创建一个名为
compound-boost-query.js
的文件。将代码示例复制并粘贴到
compound-boost-query.js
文件中。此代码示例将执行以下任务:
导入
mongodb
,即 MongoDB 的 Node.js 驱动程序。创建一个
MongoClient
类实例,以建立与 Atlas 集群的连接。遍历游标以打印与查询匹配的文档。
查询使用了下列管道阶段:
$search
查询集合阶段。查询:
1 const MongoClient = require("mongodb").MongoClient; 2 const assert = require("assert"); 3 4 const agg = [ 5 { 6 '$search': { 7 'index': 'compound-query-custom-score-tutorial', 8 'compound': { 9 'must': [ 10 { 11 'range': { 12 'path': 'year', 13 'gte': 2013, 14 'lte': 2015 15 } 16 } 17 ], 18 'should': [ 19 { 20 'text': { 21 'query': 'snow', 22 'path': 'title', 23 'score': { 24 'boost': { 25 'value': 2 26 } 27 } 28 } 29 } 30 ] 31 } 32 } 33 }, { 34 '$limit': 10 35 }, { 36 '$project': { 37 '_id': 0, 38 'title': 1, 39 'year': 1, 40 'score': { 41 '$meta': 'searchScore' 42 } 43 } 44 } 45 ]; 46 47 MongoClient.connect( 48 "<connection-string>", 49 { useNewUrlParser: true, useUnifiedTopology: true }, 50 async function (connectErr, client) { 51 assert.equal(null, connectErr); 52 const coll = client.db("sample_mflix").collection("movies"); 53 let cursor = await coll.aggregate(agg); 54 await cursor.forEach((doc) => console.log(doc)); 55 client.close(); 56 } 57 ); 查询使用了下列管道阶段:
$search
查询集合阶段。查询:
1 const MongoClient = require("mongodb").MongoClient; 2 const assert = require("assert"); 3 4 const agg = [ 5 { 6 '$search': { 7 'index': 'compound-query-custom-score-tutorial', 8 'compound': { 9 'must': [ 10 { 11 'text': { 12 'path': 'genres', 13 'query': 'comedy', 14 'score': { 15 'boost': { 16 'value': 9 17 } 18 } 19 } 20 }, { 21 'text': { 22 'path': 'title', 23 'query': 'snow', 24 'score': { 25 'boost': { 26 'value': 5 27 } 28 } 29 } 30 } 31 ], 32 'should': [ 33 { 34 'range': { 35 'path': 'year', 36 'gte': 2013, 37 'lte': 2015, 38 'score': { 39 'boost': { 40 'value': 3 41 } 42 } 43 } 44 } 45 ] 46 } 47 } 48 }, { 49 '$limit': 10 50 }, { 51 '$project': { 52 '_id': 0, 53 'title': 1, 54 'year': 1, 55 'genres': 1, 56 'score': { 57 '$meta': 'searchScore' 58 } 59 } 60 } 61 ]; 62 63 MongoClient.connect( 64 "<connection-string>", 65 { useNewUrlParser: true, useUnifiedTopology: true }, 66 async function (connectErr, client) { 67 assert.equal(null, connectErr); 68 const coll = client.db("sample_mflix").collection("movies"); 69 let cursor = await coll.aggregate(agg); 70 await cursor.forEach((doc) => console.log(doc)); 71 client.close(); 72 } 73 ); 在运行示例之前,请将
<connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。运行以下命令来查询您的集合:
node compound-boost-query.js '{"title":"Snow in Paradise","year":2014,"score":6.7722930908203125,"highlights":[{"score":1.382846713066101,"path":"title","texts":[{"value":"Snow","type":"hit"},{"value":" in Paradise","type":"text"}]}]}' '{"title":"Snow on the Blades","year":2014,"score":6.063445568084717,"highlights":[{"score":1.3766303062438965,"path":"title","texts":[{"value":"Snow","type":"hit"},{"value":" on the Blades","type":"text"}]}]}' '{"title":"The Snow White Murder Case","year":2014,"score":5.509652137756348,"highlights":[{"score":1.3525336980819702,"path":"title","texts":[{"value":"The ","type":"text"},{"value":"Snow","type":"hit"},{"value":" White Murder Case","type":"text"}]}]}' '{"title":"Dead Snow 2: Red vs. Dead","year":2014,"score":5.065053939819336,"highlights":[{"score":1.3924485445022583,"path":"title","texts":[{"value":"Dead ","type":"text"},{"value":"Snow","type":"hit"},{"value":" 2: Red vs. ","type":"text"}]}]}' '{"year":2013,"title":"The Secret Life of Walter Mitty","score":1,"highlights":[]}' '{"title":"Jurassic World","year":2015,"score":1,"highlights":[]}' '{"title":"Action Jackson","year":2014,"score":1,"highlights":[]}' '{"year":2013,"title":"In Secret","score":1,"highlights":[]}' '{"title":"The Stanford Prison Experiment","year":2015,"score":1,"highlights":[]}' '{"year":2014,"title":"The Giver","score":1,"highlights":[]}' 结果中列出的前四个文档评分较高,因为查询中的
should
子句将标题中包含snow
的文档指定为首选项。should
子句还使用boost
选项更改了查询词snow
的分数。node compound-boost-query.js { genres: [ 'Comedy', 'Horror' ], title: 'Dead Snow', year: 2009, score: 21.872983932495117 } { year: 2000, genres: [ 'Adventure', 'Comedy', 'Family' ], title: 'Snow Day', score: 21.043487548828125 } { genres: [ 'Adventure', 'Comedy', 'Family' ], title: 'Snow Dogs', year: 2002, score: 21.043487548828125 } { year: 1999, genres: [ 'Comedy', 'Romance' ], title: 'Let It Snow', score: 19.523927688598633 } { genres: [ 'Action', 'Comedy', 'Horror' ], title: 'Dead Snow 2: Red vs. Dead', year: 2014, score: 17.426334381103516 } { genres: [ 'Comedy', 'Drama' ], title: 'Snow White and Russian Red', year: 2009, score: 16.367326736450195 } { genres: [ 'Comedy', 'Drama', 'Romance' ], title: 'The Tiger and the Snow', year: 2005, score: 15.537829399108887 } { genres: [ 'Adventure', 'Comedy', 'Family' ], title: 'Snow White and the Three Stooges', year: 1961, score: 14.4263334274292 }
运行 Atlas Search 复合查询,使用 function
选项更改分数。
创建一个名为
compound-function-query.js
的文件。将代码示例复制并粘贴到
compound-function-query.js
文件中。此代码示例将执行以下任务:
导入
mongodb
,即 MongoDB 的 Node.js 驱动程序。创建一个
MongoClient
类实例,以建立与 Atlas 集群的连接。使用以下复合子句查询集合:
指定突出显示选项,从
title
字段返回与查询匹配的代码段。这些代码段包含使用type: 'hit'
指定的匹配文本以及使用type: 'text'
指定的相邻文本。使用以下管道阶段:
遍历游标以打印与查询匹配的文档。
1 const MongoClient = require("mongodb").MongoClient; 2 const assert = require("assert"); 3 4 const agg = [ 5 { 6 '$search': { 7 'index': 'compound-query-custom-score-tutorial', 8 'compound': { 9 'must': [ 10 { 11 'range': { 12 'path': 'year', 13 'gte': 2013, 14 'lte': 2015 15 } 16 } 17 ], 18 'should': [ 19 { 20 'text': { 21 'query': 'snow', 22 'path': 'title', 23 'score': { 24 'function': { 25 'add': [ 26 { 27 'path': { 28 'value': 'imdb.rating', 29 'undefined': 2 30 } 31 }, { 32 'score': 'relevance' 33 } 34 ] 35 } 36 } 37 } 38 } 39 ] 40 } 41 } 42 }, { 43 '$limit': 10 44 }, { 45 '$project': { 46 '_id': 0, 47 'title': 1, 48 'year': 1, 49 'score': { 50 '$meta': 'searchScore' 51 }, 52 'highlights': { 53 '$meta': 'searchHighlights' 54 } 55 } 56 } 57 ]; 58 59 MongoClient.connect( 60 "<connection-string>", 61 { useNewUrlParser: true, useUnifiedTopology: true }, 62 async function (connectErr, client) { 63 assert.equal(null, connectErr); 64 const coll = client.db("sample_mflix").collection("movies"); 65 let cursor = await coll.aggregate(agg); 66 await cursor.forEach((doc) => console.log(doc)); 67 client.close(); 68 } 69 ); 在运行示例之前,请将
<connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。运行以下命令来查询您的集合:
node compound-function-query.js '{"title":"The Snow White Murder Case","year":2014,"score":10.454826354980469,"highlights":[{"score":1.3525336980819702,"path":"title","texts":[{"value":"The ","type":"text"},{"value":"Snow","type":"hit"},{"value":" White Murder Case","type":"text"}]}]}' '{"title":"Snow on the Blades","year":2014,"score":10.3317232131958,"highlights":[{"score":1.3766303062438965,"path":"title","texts":[{"value":"Snow","type":"hit"},{"value":" on the Blades","type":"text"}]}]}' '{"title":"Dead Snow 2: Red vs. Dead","year":2014,"score":10.032526969909668,"highlights":[{"score":1.3924485445022583,"path":"title","texts":[{"value":"Dead ","type":"text"},{"value":"Snow","type":"hit"},{"value":" 2: Red vs. ","type":"text"}]}]}' '{"title":"Snow in Paradise","year":2014,"score":8.386146545410156,"highlights":[{"score":1.382846713066101,"path":"title","texts":[{"value":"Snow","type":"hit"},{"value":" in Paradise","type":"text"}]}]}' '{"year":2013,"title":"The Secret Life of Walter Mitty","score":1,"highlights":[]}' '{"title":"Jurassic World","year":2015,"score":1,"highlights":[]}' '{"title":"Action Jackson","year":2014,"score":1,"highlights":[]}' '{"year":2013,"title":"In Secret","score":1,"highlights":[]}' '{"title":"The Stanford Prison Experiment","year":2015,"score":1,"highlights":[]}' '{"year":2014,"title":"The Giver","score":1,"highlights":[]}' 结果中列出的前四个文档评分较高,因为查询中的
should
子句将标题中包含snow
的文档指定为首选项。should
子句还使用function
选项更改了查询词snow
的分数。
运行 Atlas Search 复合查询,使用 constant
选项更改分数。
创建一个名为
compound-constant-query.py
的文件。将代码示例复制并粘贴到
compound-constant.py
文件中。以下代码示例:
导入
pymongo
、MongoDB 的 Python 驱动程序和dns
模块,这是使用 DNS 种子列表连接字符串将pymongo
连接到Atlas
所必需的。创建一个
MongoClient
类实例,以建立与 Atlas 集群的连接。使用以下复合子句查询集合:
指定突出显示选项,从
title
字段返回与查询匹配的代码段。这些代码段包含使用type: 'hit'
指定的匹配文本以及使用type: 'text'
指定的相邻文本。使用以下管道阶段:
遍历游标以打印与查询匹配的文档。
1 import pymongo 2 3 # connect to your Atlas cluster 4 client = pymongo.MongoClient('<connection-string>') 5 6 # define pipeline 7 pipeline = [ 8 {'$search': { 9 'index': 'compound-query-custom-score-tutorial', 10 'compound': { 11 'filter': [{'range': {'path': 'year', 'gte': 2013, 'lte': 2015}}], 12 'should': [{'text': {'query': 'snow', 'path': 'title', 'score': {'constant': {'value': 5}}}}]}, 13 'highlight': {'path': 'title'}}}, 14 {'$limit': 10}, 15 {'$project': {'_id': 0, 'title': 1, 'year': 1, 16 'score': {'$meta': 'searchScore'}, "highlights": {"$meta": "searchHighlights"}}} 17 ] 18 19 # run pipeline 20 result = client['sample_mflix']['movies'].aggregate(pipeline) 21 22 # print results 23 for i in result: 24 print(i) 在运行示例之前,请将
<connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。运行以下命令来查询您的集合:
python compound-constant-query.py {'highlights': [{'path': 'title', 'score': 1.382846713066101, 'texts': [{'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' in Paradise'}]}], 'year': 2014, 'score': 5.0, 'title': 'Snow in Paradise'} {'highlights': [{'path': 'title', 'score': 1.3924485445022583, 'texts': [{'type': 'text', 'value': 'Dead '}, {'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' 2: Red vs. '}]}], 'year': 2014, 'score': 5.0, 'title': 'Dead Snow 2: Red vs. Dead'} {'highlights': [{'path': 'title', 'score': 1.3525336980819702, 'texts': [{'type': 'text', 'value': 'The '}, {'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' White Murder Case'}]}], 'year': 2014, 'score': 5.0, 'title': 'The Snow White Murder Case'} {'highlights': [{'path': 'title', 'score': 1.3766303062438965, 'texts': [{'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' on the Blades'}]}], 'year': 2014, 'score': 5.0, 'title': 'Snow on the Blades'} {'highlights': [], 'title': 'The Secret Life of Walter Mitty', 'score': 0.0, 'year': 2013} {'highlights': [], 'year': 2015, 'score': 0.0, 'title': 'Jurassic World'} {'highlights': [], 'year': 2014, 'score': 0.0, 'title': 'Action Jackson'} {'highlights': [], 'title': 'In Secret', 'score': 0.0, 'year': 2013} {'highlights': [], 'year': 2015, 'score': 0.0, 'title': 'The Stanford Prison Experiment'} {'highlights': [], 'title': 'The Giver', 'score': 0.0, 'year': 2014} 结果中列出的前四个文档评分较高,因为查询中的
should
子句将标题中包含snow
的文档指定为首选项。should
子句还使用constant
选项更改了查询词snow
的分数。
运行 Atlas Search 复合查询,使用 boost
选项更改分数。
创建一个名为
compound-boost-query.py
的文件。将代码示例复制并粘贴到
compound-boost-query.py
文件中。以下代码示例:
导入
pymongo
、MongoDB 的 Python 驱动程序和dns
模块,这是使用 DNS 种子列表连接字符串将pymongo
连接到Atlas
所必需的。创建一个
MongoClient
类实例,以建立与 Atlas 集群的连接。遍历游标以打印与查询匹配的文档。
查询使用了下列管道阶段:
$search
查询集合阶段。查询:
1 import pymongo 2 3 # connect to your Atlas cluster 4 client = pymongo.MongoClient('<connection-string>') 5 6 # define pipeline 7 pipeline = [ 8 {'$search': { 9 'index': 'compound-query-custom-score-tutorial', 10 'compound': { 11 'must': [{'range': {'path': 'year', 'gte': 2013, 'lte': 2015}}], 12 'should': [{'text': {'query': 'snow', 'path': 'title', 'score': {'boost': {'value': 2}}}}]}, 13 'highlight': {'path': 'title'}}}, 14 {'$limit': 10}, 15 {'$project': {'_id': 0, 'title': 1, 'year': 1, 'score': {'$meta': 'searchScore'}, "highlights": {"$meta": "searchHighlights"}}} 16 ] 17 18 # run pipeline 19 result = client['sample_mflix']['movies'].aggregate(pipeline) 20 21 # print results 22 for i in result: 23 print(i) 查询使用了下列管道阶段:
$search
阶段用于查询集合。查询使用以下compound
操作符子句和boost
选项,使某些字段的优先级高于其他字段:must
带文本操作符的子句优先考虑comedy
类型,然后是title
字段中的术语snow
。boost
选项将权重应用于字段。should
带有范围操作符的子句,用于搜索2013
到2015
年之间的电影。
注意
boost
选项会对字段应用不同的权重,以确定字段的优先级。$limit
阶段将输出限制为10
个结果。$project
阶段到:排除
title
、year
和genres
以外的所有字段添加字段
score
import pymongo import dns client = pymongo.MongoClient('<connection-string>') result = client['sample_mflix']['movies'].aggregate([ { '$search': { 'index': 'compound-query-custom-score-tutorial', 'compound': { 'must': [ { 'text': { 'path': 'genres', 'query': 'comedy', 'score': { 'boost': { 'value': 9 } } } }, { 'text': { 'path': 'title', 'query': 'snow', 'score': { 'boost': { 'value': 5 } } } } ], 'should': [ { 'range': { 'path': 'year', 'gte': 2013, 'lte': 2015, 'score': { 'boost': { 'value': 3 } } } } ] } } }, { '$limit': 10 }, { '$project': { '_id': 0, 'title': 1, 'year': 1, 'genres': 1, 'score': { '$meta': 'searchScore' } } } ]) for i in result: print(i) 在运行示例之前,请将
<connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。运行以下命令来查询您的集合:
python compound-boost-query.py {'highlights': [{'path': 'title', 'score': 1.382846713066101, 'texts': [{'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' in Paradise'}]}], 'year': 2014, 'score': 6.7722930908203125, 'title': 'Snow in Paradise'} {'highlights': [{'path': 'title', 'score': 1.3766303062438965, 'texts': [{'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' on the Blades'}]}], 'year': 2014, 'score': 6.063445568084717, 'title': 'Snow on the Blades'} {'highlights': [{'path': 'title', 'score': 1.3525336980819702, 'texts': [{'type': 'text', 'value': 'The '}, {'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' White Murder Case'}]}], 'year': 2014, 'score': 5.509652137756348, 'title': 'The Snow White Murder Case'} {'highlights': [{'path': 'title', 'score': 1.3924485445022583, 'texts': [{'type': 'text', 'value': 'Dead '}, {'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' 2: Red vs. '}]}], 'year': 2014, 'score': 5.065053939819336, 'title': 'Dead Snow 2: Red vs. Dead'} {'highlights': [], 'title': 'The Secret Life of Walter Mitty', 'score': 1.0, 'year': 2013} {'highlights': [], 'year': 2015, 'score': 1.0, 'title': 'Jurassic World'} {'highlights': [], 'year': 2014, 'score': 1.0, 'title': 'Action Jackson'} {'highlights': [], 'title': 'In Secret', 'score': 1.0, 'year': 2013} {'highlights': [], 'year': 2015, 'score': 1.0, 'title': 'The Stanford Prison Experiment'} {'highlights': [], 'title': 'The Giver', 'score': 1.0, 'year': 2014} 结果中列出的前四个文档评分较高,因为查询中的
should
子句将标题中包含snow
的文档指定为首选项。should
子句还使用boost
选项更改了查询词snow
的分数。python compound-boost-query.py { 'genres': ['Comedy', 'Horror'], 'title': 'Dead Snow', 'year': 2009, 'score': 21.872983932495117 } { 'year': 2000, 'genres': ['Adventure', 'Comedy', 'Family'], 'title': 'Snow Day', 'score': 21.043487548828125 } { 'genres': ['Adventure', 'Comedy', 'Family'], 'title': 'Snow Dogs', 'year': 2002, 'score': 21.043487548828125 } { 'year': 1999, 'genres': ['Comedy', 'Romance'], 'title': 'Let It Snow', 'score': 19.523927688598633 } { 'genres': ['Action', 'Comedy', 'Horror'], 'title': 'Dead Snow 2: Red vs. Dead', 'year': 2014, 'score': 17.426334381103516 } { 'genres': ['Comedy', 'Drama'], 'title': 'Snow White and Russian Red', 'year': 2009, 'score': 16.367326736450195 } { 'genres': ['Comedy', 'Drama', 'Romance'], 'title': 'The Tiger and the Snow', 'year': 2005, 'score': 15.537829399108887 } { 'genres': ['Adventure', 'Comedy', 'Family'], 'title': 'Snow White and the Three Stooges', 'year': 1961, 'score': 14.4263334274292 }
运行 Atlas Search 复合查询,使用 function
选项更改分数。
创建一个名为
compound-function-query.py
的文件。将代码示例复制并粘贴到
compound-function-query.py
文件中。以下代码示例:
导入
pymongo
、MongoDB 的 Python 驱动程序和dns
模块,这是使用 DNS 种子列表连接字符串将pymongo
连接到Atlas
所必需的。创建一个
MongoClient
类实例,以建立与 Atlas 集群的连接。使用以下复合子句查询集合:
指定突出显示选项,从
title
字段返回与查询匹配的代码段。这些代码段包含使用type: 'hit'
指定的匹配文本以及使用type: 'text'
指定的相邻文本。使用以下管道阶段:
遍历游标以打印与查询匹配的文档。
1 import pymongo 2 3 # connect to your Atlas cluster 4 client = pymongo.MongoClient('<connection-string>') 5 6 # define pipeline 7 pipeline = [ 8 {'$search': { 9 'index': 'compound-query-custom-score-tutorial', 10 'compound': { 11 'must': [{'range': {'path': 'year', 'gte': 2013, 'lte': 2015}}], 12 'should': [{'text': {'query': 'snow', 'path': 'title', 13 'score': {'function': { 14 'add': [{'path': {'value': 'imdb.rating','undefined': 2}}, {'score': 'relevance'}]}}}}]}, 15 'highlight': {'path': 'title'}}}, 16 {'$limit': 10}, 17 {'$project': {'_id': 0, 'title': 1, 'year': 1, 'score': {'$meta': 'searchScore'}, "highlights": {"$meta": "searchHighlights"}}} 18 ] 19 20 # run pipeline 21 result = client['sample_mflix']['movies'].aggregate(pipeline) 22 23 # print results 24 for i in result: 25 print(i) 在运行示例之前,请将
<connection-string>
替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。运行以下命令来查询您的集合:
python compound-function-query.py {'highlights': [{'path': 'title', 'score': 1.3525336980819702, 'texts': [{'type': 'text', 'value': 'The '}, {'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' White Murder Case'}]}], 'year': 2014, 'score': 10.454826354980469, 'title': 'The Snow White Murder Case'} {'highlights': [{'path': 'title', 'score': 1.3766303062438965, 'texts': [{'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' on the Blades'}]}], 'year': 2014, 'score': 10.3317232131958, 'title': 'Snow on the Blades'} {'highlights': [{'path': 'title', 'score': 1.3924485445022583, 'texts': [{'type': 'text', 'value': 'Dead '}, {'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' 2: Red vs. '}]}], 'year': 2014, 'score': 10.032526969909668, 'title': 'Dead Snow 2: Red vs. Dead'} {'highlights': [{'path': 'title', 'score': 1.382846713066101, 'texts': [{'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' in Paradise'}]}], 'year': 2014, 'score': 8.386146545410156, 'title': 'Snow in Paradise'} {'highlights': [], 'title': 'The Secret Life of Walter Mitty', 'score': 1.0, 'year': 2013} {'highlights': [], 'year': 2015, 'score': 1.0, 'title': 'Jurassic World'} {'highlights': [], 'year': 2014, 'score': 1.0, 'title': 'Action Jackson'} {'highlights': [], 'title': 'In Secret', 'score': 1.0, 'year': 2013} {'highlights': [], 'year': 2015, 'score': 1.0, 'title': 'The Stanford Prison Experiment'} {'highlights': [], 'title': 'The Giver', 'score': 1.0, 'year': 2014} 结果中列出的前四个文档评分较高,因为查询中的
should
子句将标题中包含snow
的文档指定为首选项。should
子句还使用function
选项更改了查询词snow
的分数。
运行复合查询以隐藏结果
在本部分中,您将连接到 Atlas 集群,并针对 sample_mflix
数据库中的 movies
集合中的 title
、plot
和 genres
字段运行示例查询。该示例查询使用嵌套的复合操作符子句执行以下搜索:
搜索所有包含“ghost”一词的电影,但将喜剧电影的分数降低 50%。
搜索包含单词“ghost”的所有电影,但将具有指定 ObjectId 的电影的分数降低 50%。
使用 compound
操作符对 movies
集合运行 Atlas Search 查询。
将以下查询复制并粘贴到 Query Editor。
该查询使用
$search
compound
操作符should
子句嵌套compound
操作符查询,以执行以下操作:搜索情节或标题(
must
子句)中包含一词ghost
且不属于comedy
类型(mustNot
子句)的电影。搜索情节或标题中包含
ghost
一词的电影(must
子句),但对于标题或情节中包含ghost
一词的comedy
类型的电影,将分数(boost
)降低 50%(0.5
)。
1 [ 2 { 3 "$search": { 4 "index": "compound-query-custom-score-tutorial", 5 "compound": { 6 "should":[ { 7 "compound":{ 8 "must":[ 9 { 10 "text": { 11 "query": "ghost", 12 "path": ["plot","title"] 13 } 14 } 15 ], 16 "mustNot":[ 17 { 18 "text": { 19 "query": "Comedy", 20 "path": ["genres"] 21 } 22 } 23 ] 24 } 25 }, 26 { 27 "compound":{ 28 "must":[ 29 { 30 "text": { 31 "query": "ghost", 32 "path": ["plot","title"] 33 } 34 } 35 ], 36 "filter":[ 37 { 38 "text": { 39 "query": "Comedy", 40 "path": ["genres"] 41 } 42 } 43 ], 44 "score":{ "boost": { "value": 0.5} } 45 } 46 } 47 ] 48 } 49 } 50 } 51 ] 该查询使用
$search
compound
操作符should
子句嵌套compound
操作符查询,以执行以下操作:搜索在情节或标题(
must
子句)中包含术语ghost
但未指定 ObjectId(mustNot
子句)的电影。搜索情节或标题(
must
子句)中包含一词ghost
的电影,但对于具有指定 ObjectIds(filter
子句)的电影,将分数(boost
)减少 50%(0.5
)。
1 [ 2 { 3 "$search": { 4 "index": "compound-query-custom-score-tutorial", 5 "compound": { 6 "should":[ 7 { 8 "compound":{ 9 "must":[ 10 { 11 "text": { 12 "query": "ghost", 13 "path": ["plot","title"] 14 } 15 } 16 ], 17 "mustNot":[ 18 { 19 "in": { 20 "value": [ObjectId('573a13cdf29313caabd83c08'), ObjectId('573a13cef29313caabd873a2')], 21 "path": "_id" 22 } 23 } 24 ] 25 } 26 }, 27 { 28 "compound":{ 29 "must":[ 30 { 31 "text": { 32 "query": "ghost", 33 "path": ["plot","title"] 34 } 35 } 36 ], 37 "filter":[ 38 { 39 "in": { 40 "value": [ObjectId('573a13cdf29313caabd83c08'), ObjectId('573a13cef29313caabd873a2')], 41 "path": "_id" 42 } 43 } 44 ], 45 "score":{ "boost": { "value": 0.5} } 46 } 47 } 48 ] 49 } 50 } 51 } 52 ] 单击 Query Editor 中的 Search 按钮。
1 SCORE: 5.909613132476807 2 _id: “573a139af29313caabcefcce” 3 plot: "Adaption of the famous Oscar Wilde tale about a young American girl th…" 4 genres: Array (3) 5 runtime: 92 6 7 SCORE: 5.367666244506836 8 _id: “573a13d8f29313caabda5dc1” 9 plot: "The Little Ghost lives in the castle over looking a small town and awa…" 10 genres: Array (2) 11 runtime: 92 12 13 SCORE: 4.676314353942871 14 _id: “573a13c0f29313caabd6139d” 15 plot: "Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal …" 16 genres: Array (2) 17 runtime: 107 18 19 SCORE: 3.9638845920562744 20 _id: “573a1398f29313caabcebf6f” 21 plot: "After an accident leaves a young man dead, his spirit stays behind to …" 22 genres: Array (3) 23 runtime: 127 24 25 SCORE: 3.9638845920562744 26 _id: “573a13cdf29313caabd83c08” 27 plot: "A man tries to solve his lover's murder by communicating with her spir…" 28 genres: Array (3) 29 runtime: 115 30 31 SCORE: 3.9638845920562744 32 _id: “573a13cef29313caabd873a2” 33 plot: "A man tries to solve his lover's murder by communicating with her spir…" 34 genres: Array (3) 35 runtime: 115 36 37 SCORE: 3.526711940765381 38 _id: “573a13c3f29313caabd6a149” 39 plot: "What kind of scenes in a horror film scares you the most? When a ghost…" 40 genres: Array (2) 41 runtime: 95 42 43 SCORE: 3.3177831172943115 44 _id: “573a1397f29313caabce7ea1” 45 plot: "Four successful elderly gentlemen, members of the Chowder Society, sha…" 46 genres: Array (3) 47 runtime: 110 48 49 SCORE: 3.3177831172943115 50 _id: “573a13a4f29313caabd117df” 51 fullplot: "When the motorcyclist Johnny Blaze finds that his father Barton Blaze …" 52 imdb: Object 53 year: 2007 54 55 SCORE: 3.3177831172943115 56 _id: “573a13a6f29313caabd185dc” 57 fullplot: "After discovering a passenger ship missing since 1962 floating adrift …" 58 imdb: Object 59 year: 2002 结果中的电影文档在
plot
或title
字段中包含查询词ghost
,并且不属于Comedy
类型。Atlas Search 没有返回plot
或title
字段中包含术语ghost
的Comedy
类型的文档,因为这些文档没有排在前 10 的文档中,因为查询将这些文档的分数降低了 50%。1 SCORE: 5.909613132476807 2 _id: “573a139af29313caabcefcce” 3 plot: "Adaption of the famous Oscar Wilde tale about a young American girl th…" 4 genres: Array (3) 5 runtime: 92 6 7 SCORE: 5.367666244506836 8 _id: “573a13d8f29313caabda5dc1” 9 plot: "The Little Ghost lives in the castle over looking a small town and awa…" 10 genres: Array (2) 11 runtime: 92 12 13 SCORE: 4.676314353942871 14 _id: “573a13c0f29313caabd6139d” 15 plot: "Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal …" 16 genres: Array (2) 17 runtime: 107 18 19 SCORE: 3.9638845920562744 20 _id: “573a1398f29313caabcebf6f” 21 plot: "After an accident leaves a young man dead, his spirit stays behind to …" 22 genres: Array (3) 23 runtime: 127 24 25 SCORE: 3.526711940765381 26 _id: “573a13c3f29313caabd6a149” 27 plot: "What kind of scenes in a horror film scares you the most? When a ghost…" 28 genres:Array (2) 29 runtime: 95 30 31 SCORE: 3.5241782665252686 32 _id: “573a1398f29313caabce912c” 33 plot: "Three unemployed parapsychology professors set up shop as a unique gho…" 34 genres: Array (2) 35 runtime: 105 36 37 SCORE: 3.5241782665252686 38 _id: “573a139cf29313caabcf5a48” 39 plot: "Casper, a ghost, teams up with Wendy, a witch, against an evil warlock…" 40 genres: Array (3) 41 runtime: 90 42 43 SCORE: 3.4605300426483154 44 _id: “573a13bdf29313caabd58274” 45 plot: "Banku, his mother, Anjali Sharma and father move in to their new house…" 46 genres: Array (3) 47 runtime: 150 48 49 SCORE: 3.3177831172943115 50 _id: “573a1397f29313caabce7ea1” 51 plot: "Four successful elderly gentlemen, members of the Chowder Society, sha…" 52 genres: Array (3) 53 runtime: 110 54 55 SCORE: 3.3177831172943115 56 _id: “573a1398f29313caabcebf79” 57 plot: "Elliot Hopper is a widower with three children, he is currently workin…" 58 genres: Array (3) 59 runtime: 83 结果中的电影文档在
plot
或title
字段中包含查询术语ghost
,但在_id
字段中没有指定的 ObjectId。 Atlas Search没有返回具有指定 ObjectsId 的文档,即使它们在title
字段中包含查询术语ghost
,因为查询将这些文档的分数降低了50 %,因此,这些文档没有排在前10份文档中。
通过 mongosh
连接到您的集群。
在终端窗口中打开mongosh
并连接到集群。 有关连接的详细说明,请参阅通过mongosh
连接。
对 movies
集合运行以下 Atlas Search compound
操作符查询。
此查询使用以下管道阶段:
| |
将结果数量限制为 | |
|
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "index": "compound-query-custom-score-tutorial", 5 "compound": { 6 "should": [ 7 { 8 "compound":{ 9 "must": [ 10 { 11 "text": { 12 "query": "ghost", 13 "path": ["plot","title"] 14 } 15 } 16 ], 17 "mustNot": [ 18 { 19 "text": { 20 "query": "Comedy", 21 "path": ["genres"] 22 } 23 } 24 ] 25 } 26 }, 27 { 28 "compound":{ 29 "must":[ 30 { 31 "text": { 32 "query": "ghost", 33 "path": ["plot","title"] 34 } 35 } 36 ], 37 "filter": [ 38 { 39 "text": { 40 "query": "Comedy", 41 "path": ["genres"] 42 } 43 } 44 ], 45 "score": { "boost": { "value": 0.5} } 46 } 47 } 48 ] 49 } 50 } 51 }, 52 { 53 "$limit": 10 54 }, 55 { 56 "$project": { 57 "_id": 1, 58 "title": 1, 59 "plot": 1, 60 "genres": 1, 61 "score": { "$meta": "searchScore" } 62 } 63 } 64 ])
1 [ 2 { 3 _id: ObjectId('573a139af29313caabcefcce'), 4 plot: 'Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.', 5 genres: [ 'Family', 'Drama', 'Fantasy' ], 6 title: 'The Canterville Ghost', 7 score: 5.909613132476807 8 }, 9 { 10 _id: ObjectId('573a13d8f29313caabda5dc1'), 11 plot: 'The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!', 12 genres: [ 'Family', 'Fantasy' ], 13 title: 'The Little Ghost', 14 score: 5.367666244506836 15 }, 16 { 17 _id: ObjectId('573a13c0f29313caabd6139d'), 18 plot: 'Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.', 19 genres: [ 'Horror', 'Thriller' ], 20 title: 'Death of a Ghost Hunter', 21 score: 4.676314353942871 22 }, 23 { 24 _id: ObjectId('573a1398f29313caabcebf6f'), 25 plot: 'After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.', 26 genres: [ 'Drama', 'Fantasy', 'Romance' ], 27 title: 'Ghost', 28 score: 3.9638845920562744 29 }, 30 { 31 _id: ObjectId('573a13cdf29313caabd83c08'), 32 plot: "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.", 33 genres: [ 'Drama', 'Fantasy', 'Mystery' ], 34 title: 'Ghost', 35 score: 3.9638845920562744 36 }, 37 { 38 _id: ObjectId('573a13cef29313caabd873a2'), 39 plot: "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.", 40 genres: [ 'Drama', 'Fantasy', 'Mystery' ], 41 title: 'Ghost', 42 score: 3.9638845920562744 43 }, 44 { 45 _id: ObjectId('573a13c3f29313caabd6a149'), 46 plot: 'What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...', 47 genres: [ 'Horror', 'Thriller' ], 48 title: 'Coming Soon', 49 score: 3.526711940765381 50 }, 51 { 52 _id: ObjectId('573a1397f29313caabce7ea1'), 53 plot: "Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ...", 54 genres: [ 'Drama', 'Horror', 'Thriller' ], 55 title: 'Ghost Story', 56 score: 3.3177831172943115 57 }, 58 { 59 _id: ObjectId('573a13a4f29313caabd117df'), 60 plot: 'Stunt motorcyclist Johnny Blaze gives up his soul to become a hellblazing vigilante, to fight against power hungry Blackheart, the son of the devil himself.', 61 genres: [ 'Action', 'Fantasy', 'Thriller' ], 62 title: 'Ghost Rider', 63 score: 3.3177831172943115 64 }, 65 { 66 _id: ObjectId('573a13a6f29313caabd185dc'), 67 plot: 'A salvage crew that discovers a long-lost 1962 passenger ship floating lifeless in a remote region of the Bering Sea soon notices, as they prepare to tow it back to land, that "strange things" happen...', 68 genres: [ 'Horror', 'Mystery' ], 69 title: 'Ghost Ship', 70 score: 3.3177831172943115 71 } 72 ]
结果中的电影文档在 plot
或 title
字段中包含查询词 ghost
,并且不属于 Comedy
类型。Atlas Search 没有返回 plot
或 title
字段中包含术语 ghost
的 Comedy
类型的文档,因为这些文档没有排在前 10 的文档中,因为查询将这些文档的分数降低了 50%。
此查询使用以下管道阶段:
| |
将结果数量限制为 | |
|
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "compound": { 5 "index": "compound-query-custom-score-tutorial", 6 "should": [ 7 { 8 "compound": { 9 "must": [ 10 { 11 "text": { 12 "query": "ghost", 13 "path": ["plot","title"] 14 } 15 } 16 ], 17 "mustNot": [ 18 { 19 "in": { 20 "value": [ObjectId('573a13cdf29313caabd83c08'), ObjectId('573a13cef29313caabd873a2')], 21 "path": "_id" 22 } 23 } 24 ] 25 } 26 }, 27 { 28 "compound": { 29 "must": [ 30 { 31 "text": { 32 "query": "ghost", 33 "path": ["plot","title"] 34 } 35 } 36 ], 37 "filter": [ 38 { 39 "in": { 40 "value": [ObjectId('573a13cdf29313caabd83c08'), ObjectId('573a13cef29313caabd873a2')], 41 "path": "_id" 42 } 43 } 44 ], 45 "score": { "boost": { "value": 0.5} } 46 } 47 } 48 ] 49 } 50 } 51 }, 52 { 53 "$limit": 10 54 }, 55 { 56 "$project": { 57 "_id": 1, 58 "title": 1, 59 "plot": 1, 60 "score": { "$meta": "searchScore" } 61 } 62 } 63 ])
1 [ 2 { 3 _id: ObjectId('573a139af29313caabcefcce'), 4 plot: 'Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.', 5 genres: [ 'Family', 'Drama', 'Fantasy' ], 6 title: 'The Canterville Ghost', 7 score: 5.909613132476807 8 }, 9 { 10 _id: ObjectId('573a13d8f29313caabda5dc1'), 11 plot: 'The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!', 12 genres: [ 'Family', 'Fantasy' ], 13 title: 'The Little Ghost', 14 score: 5.367666244506836 15 }, 16 { 17 _id: ObjectId('573a13c0f29313caabd6139d'), 18 plot: 'Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.', 19 genres: [ 'Horror', 'Thriller' ], 20 title: 'Death of a Ghost Hunter', 21 score: 4.676314353942871 22 }, 23 { 24 _id: ObjectId('573a1398f29313caabcebf6f'), 25 plot: 'After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.', 26 genres: [ 'Drama', 'Fantasy', 'Romance' ], 27 title: 'Ghost', 28 score: 3.9638845920562744 29 }, 30 { 31 _id: ObjectId('573a13c3f29313caabd6a149'), 32 plot: 'What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...', 33 genres: [ 'Horror', 'Thriller' ], 34 title: 'Coming Soon', 35 score: 3.526711940765381 36 }, 37 { 38 _id: ObjectId('573a1398f29313caabce912c'), 39 plot: 'Three unemployed parapsychology professors set up shop as a unique ghost removal service.', 40 genres: [ 'Comedy', 'Fantasy' ], 41 title: 'Ghostbusters', 42 score: 3.5241782665252686 43 }, 44 { 45 _id: ObjectId('573a139cf29313caabcf5a48'), 46 plot: 'Casper, a ghost, teams up with Wendy, a witch, against an evil warlock.', 47 genres: [ 'Adventure', 'Comedy', 'Family' ], 48 title: 'Casper Meets Wendy', 49 score: 3.5241782665252686 50 }, 51 { 52 _id: ObjectId('573a13bdf29313caabd58274'), 53 plot: 'Banku, his mother, Anjali Sharma and father move in to their new house -- the Nath villa, unaware of the fact that the house is inhabited by a ghost. It is learnt the ghost is not too happy...', 54 genres: [ 'Comedy', 'Drama', 'Fantasy' ], 55 title: 'Bhoothnath', 56 score: 3.4605300426483154 57 }, 58 { 59 _id: ObjectId('573a1397f29313caabce7ea1'), 60 plot: "Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ...", 61 genres: [ 'Drama', 'Horror', 'Thriller' ], 62 title: 'Ghost Story', 63 score: 3.3177831172943115 64 }, 65 { 66 _id: ObjectId('573a1398f29313caabcebf79'), 67 plot: 'Elliot Hopper is a widower with three children, he is currently working on a deal. It seems like his wife illness was very costly and this deal could put them out of the red. However he ...', 68 genres: [ 'Comedy', 'Family', 'Fantasy' ], 69 title: 'Ghost Dad', 70 score: 3.3177831172943115 71 } 72 ]
结果中的电影文档在plot
或title
字段中包含查询术语ghost
,但在_id
字段中没有指定的 ObjectId。 Atlas Search没有返回具有指定 ObjectsId 的文档,即使它们在title
字段中包含查询术语ghost
,因为查询将这些文档的分数降低了50 %,因此,这些文档没有排在前10份文档中。
在 MongoDB Compass 中连接到您的集群。
打开 MongoDB Compass 并连接到您的集群。有关连接的详细说明,请参阅通过 Compass 连接。
对 movies
集合运行以下 Atlas Search 查询。
若要运行此查询,请在 MongoDB Compass 中执行以下步骤:
单击 Aggregations 标签页。
单击 Select...,然后从下拉菜单中选择阶段并为该阶段添加查询,以配置以下每个管道阶段。
提示
单击 Add Stage 以添加其他阶段。
管道阶段查询$search
{ "index": "compound-query-custom-score-tutorial", "compound": { "should": [ { "compound":{ "must": [ { "text": { "query": "ghost", "path": ["plot","title"] } } ], "mustNot": [ { "text": { "query": "Comedy", "path": ["genres"] } } ] } }, { "compound":{ "must":[ { "text": { "query": "ghost", "path": ["plot","title"] } } ], "filter": [ { "text": { "query": "Comedy", "path": ["genres"] } } ], "score": { "boost": { "value": 0.5} } } } ] } } $limit
10 $project
{ "_id": 1, "title": 1, "plot": 1, "genres": 1, "score": { "$meta": "searchScore" } } 如果已启用 Auto Preview,则 MongoDB Compass 将在
$project
管道阶段旁边显示以下文档:1 _id: ObjectId('573a139af29313caabcefcce'), 2 plot: 'Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.', 3 genres: [ 'Family', 'Drama', 'Fantasy' ], 4 title: 'The Canterville Ghost', 5 score: 5.909613132476807 6 7 _id: ObjectId('573a13d8f29313caabda5dc1'), 8 plot: 'The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!', 9 genres: [ 'Family', 'Fantasy' ], 10 title: 'The Little Ghost', 11 score: 5.367666244506836 12 13 _id: ObjectId('573a13c0f29313caabd6139d'), 14 plot: 'Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.', 15 genres: [ 'Horror', 'Thriller' ], 16 title: 'Death of a Ghost Hunter', 17 score: 4.676314353942871 18 19 _id: ObjectId('573a1398f29313caabcebf6f'), 20 plot: 'After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.', 21 genres: [ 'Drama', 'Fantasy', 'Romance' ], 22 title: 'Ghost', 23 score: 3.9638845920562744 24 25 _id: ObjectId('573a13cdf29313caabd83c08'), 26 plot: "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.", 27 genres: [ 'Drama', 'Fantasy', 'Mystery' ], 28 title: 'Ghost', 29 score: 3.9638845920562744 30 31 _id: ObjectId('573a13cef29313caabd873a2'), 32 plot: "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.", 33 genres: [ 'Drama', 'Fantasy', 'Mystery' ], 34 title: 'Ghost', 35 score: 3.9638845920562744 36 37 _id: ObjectId('573a13c3f29313caabd6a149'), 38 plot: 'What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...', 39 genres: [ 'Horror', 'Thriller' ], 40 title: 'Coming Soon', 41 score: 3.526711940765381 42 43 _id: ObjectId('573a1397f29313caabce7ea1'), 44 plot: "Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ...", 45 genres: [ 'Drama', 'Horror', 'Thriller' ], 46 title: 'Ghost Story', 47 score: 3.3177831172943115 48 49 _id: ObjectId('573a13a4f29313caabd117df'), 50 plot: 'Stunt motorcyclist Johnny Blaze gives up his soul to become a hellblazing vigilante, to fight against power hungry Blackheart, the son of the devil himself.', 51 genres: [ 'Action', 'Fantasy', 'Thriller' ], 52 title: 'Ghost Rider', 53 score: 3.3177831172943115 54 55 _id: ObjectId('573a13a6f29313caabd185dc'), 56 plot: 'A salvage crew that discovers a long-lost 1962 passenger ship floating lifeless in a remote region of the Bering Sea soon notices, as they prepare to tow it back to land, that "strange things" happen...', 57 genres: [ 'Horror', 'Mystery' ], 58 title: 'Ghost Ship', 59 score: 3.3177831172943115 结果中的电影文档在
plot
或title
字段中包含查询词ghost
,并且不属于Comedy
类型。Atlas Search 没有返回plot
或title
字段中包含术语ghost
的Comedy
类型的文档,因为这些文档没有排在前 10 的文档中,因为查询将这些文档的分数降低了 50%。管道阶段查询$search
{ "index": "compound-query-custom-score-tutorial", "compound": { "should": [ { "compound":{ "must": [ { "text": { "query": "ghost", "path": ["plot","title"] } } ], "mustNot": [ { "in": { "value": [ObjectId('573a13cdf29313caabd83c08'), ObjectId('573a13cef29313caabd873a2')], "path": "_id" } } ] } }, { "compound":{ "must":[ { "text": { "query": "ghost", "path": ["plot","title"] } } ], "filter": [ { "in": { "value": [ObjectId('573a13cdf29313caabd83c08'), ObjectId('573a13cef29313caabd873a2')], "path": "_id" } } ], "score": { "boost": { "value": 0.5} } } } ] } } $limit
10 $project
{ "_id": 1, "title": 1, "plot": 1, "score": { "$meta": "searchScore" } } 如果已启用 Auto Preview,则 MongoDB Compass 将在
$project
管道阶段旁边显示以下文档:1 _id: ObjectId('573a139af29313caabcefcce'), 2 plot: 'Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.', 3 title: 'The Canterville Ghost', 4 score: 5.909613132476807 5 6 _id: ObjectId('573a13d8f29313caabda5dc1'), 7 plot: 'The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!', 8 title: 'The Little Ghost', 9 score: 5.367666244506836 10 11 _id: ObjectId('573a13c0f29313caabd6139d'), 12 plot: 'Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.', 13 title: 'Death of a Ghost Hunter', 14 score: 4.676314353942871 15 16 _id: ObjectId('573a1398f29313caabcebf6f'), 17 plot: 'After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.', 18 title: 'Ghost', 19 score: 3.9638845920562744 20 21 _id: ObjectId('573a13c3f29313caabd6a149'), 22 plot: 'What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...', 23 title: 'Coming Soon', 24 score: 3.526711940765381 25 26 _id: ObjectId('573a1398f29313caabce912c'), 27 plot: 'Three unemployed parapsychology professors set up shop as a unique ghost removal service.', 28 title: 'Ghostbusters', 29 score: 3.5241782665252686 30 31 _id: ObjectId('573a139cf29313caabcf5a48'), 32 plot: 'Casper, a ghost, teams up with Wendy, a witch, against an evil warlock.', 33 title: 'Casper Meets Wendy', 34 score: 3.5241782665252686 35 36 _id: ObjectId('573a13bdf29313caabd58274'), 37 plot: 'Banku, his mother, Anjali Sharma and father move in to their new house -- the Nath villa, unaware of the fact that the house is inhabited by a ghost. It is learnt the ghost is not too happy...', 38 title: 'Bhoothnath', 39 score: 3.4605300426483154 40 41 _id: ObjectId('573a1397f29313caabce7ea1'), 42 plot: "Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ...", 43 title: 'Ghost Story', 44 score: 3.3177831172943115 45 46 _id: ObjectId('573a1398f29313caabcebf79'), 47 plot: 'Elliot Hopper is a widower with three children, he is currently working on a deal. It seems like his wife illness was very costly and this deal could put them out of the red. However he ...', 48 title: 'Ghost Dad', 49 score: 3.3177831172943115 结果中的电影文档在
plot
或title
字段中包含查询术语ghost
,但在_id
字段中没有指定的 ObjectId。 Atlas Search没有返回具有指定 ObjectsId 的文档,即使它们在title
字段中包含查询术语ghost
,因为查询将这些文档的分数降低了50 %,因此,这些文档没有排在前10份文档中。
将查询复制并粘贴到 Program.cs
文件中。
此查询使用以下管道阶段:
| |
将结果数量限制为 | |
|
1 using MongoDB.Bson; 2 using MongoDB.Bson.Serialization.Attributes; 3 using MongoDB.Bson.Serialization.Conventions; 4 using MongoDB.Driver; 5 using MongoDB.Driver.Search; 6 7 public class BuryGenreCompoundExample 8 { 9 private const string MongoConnectionString = "<connection-string>"; 10 11 public static void Main(string[] args) 12 { 13 // allow automapping of the camelCase database fields to our MovieDocument 14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; 15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true); 16 17 // connect to your Atlas cluster 18 var mongoClient = new MongoClient(MongoConnectionString); 19 var mflixDatabase = mongoClient.GetDatabase("sample_mflix"); 20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies"); 21 22 // define and run pipeline 23 var results = moviesCollection.Aggregate() 24 .Search(Builders<MovieDocument>.Search.Compound() 25 .Should(Builders<MovieDocument>.Search.Compound() 26 .Must(Builders<MovieDocument>.Search.Text( 27 Builders<MovieDocument>.SearchPath.Multi(movie => movie.Title, movie => movie.Plot), "ghost")) 28 .MustNot(Builders<MovieDocument>.Search.Text(movie => movie.Genres, "Comedy")) 29 ) 30 .Should(Builders<MovieDocument>.Search.Compound() 31 .Must(Builders<MovieDocument>.Search.Text( 32 Builders<MovieDocument>.SearchPath.Multi(movie => movie.Title, movie => movie.Plot), "ghost")) 33 .Filter(Builders<MovieDocument>.Search.Text(movie => movie.Genres, "Comedy", score: new SearchScoreDefinitionBuilder<MovieDocument>().Boost(0.5))) 34 ), 35 indexName: "compound-query-custom-score-tutorial") 36 .Project<MovieDocument>(Builders<MovieDocument>.Projection 37 .Include(movie => movie.Plot) 38 .Include(movie => movie.Title) 39 .Include(movie => movie.Id) 40 .Include(movie => movie.Genres) 41 .MetaSearchScore("score")) 42 .Limit(10) 43 .ToList(); 44 45 // print results 46 foreach (var movie in results) 47 { 48 Console.WriteLine(movie.ToJson()); 49 } 50 } 51 } 52 53 [ ]54 public class MovieDocument 55 { 56 [ ]57 public ObjectId Id { get; set; } 58 public string Plot { get; set; } 59 public string Title { get; set; } 60 public string[] Genres { get; set; } 61 public double Score { get; set; } 62 }
此查询使用以下管道阶段:
| |
将结果数量限制为 | |
|
1 using MongoDB.Bson; 2 using MongoDB.Bson.Serialization.Attributes; 3 using MongoDB.Bson.Serialization.Conventions; 4 using MongoDB.Driver; 5 using MongoDB.Driver.Search; 6 7 public class BuryDocumentCompoundExample 8 { 9 private const string MongoConnectionString = "<connection-string>"; 10 11 public static void Main(string[] args) 12 { 13 // allow automapping of the camelCase database fields to our MovieDocument 14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; 15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true); 16 17 // connect to your Atlas cluster 18 var mongoClient = new MongoClient(MongoConnectionString); 19 var mflixDatabase = mongoClient.GetDatabase("sample_mflix"); 20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies"); 21 22 string id1 = "573a13cef29313caabd873a2"; 23 string id2 = "573a13cdf29313caabd83c08"; 24 25 // define and run pipeline 26 var results = moviesCollection.Aggregate() 27 .Search(Builders<MovieDocument>.Search.Compound() 28 .Should(Builders<MovieDocument>.Search.Compound() 29 .Must(Builders<MovieDocument>.Search.Text( 30 Builders<MovieDocument>.SearchPath.Multi(movie => movie.Title, movie => movie.Plot), "ghost")) 31 .MustNot(Builders<MovieDocument>.Search.In(movie => movie.Id, new[] {ObjectId.Parse(id1), ObjectId.Parse(id2)})) 32 ) 33 .Should(Builders<MovieDocument>.Search.Compound() 34 .Must(Builders<MovieDocument>.Search.Text( 35 Builders<MovieDocument>.SearchPath.Multi(movie => movie.Title, movie => movie.Plot), "ghost")) 36 .Filter(Builders<MovieDocument>.Search.In(movie => movie.Id, new[] {ObjectId.Parse(id1), ObjectId.Parse(id2)}, score: new SearchScoreDefinitionBuilder<MovieDocument>().Boost(0.5))) 37 ), 38 indexName: "compound-query-custom-score-tutorial") 39 .Project<MovieDocument>(Builders<MovieDocument>.Projection 40 .Include(movie => movie.Plot) 41 .Include(movie => movie.Title) 42 .Include(movie => movie.Id) 43 .MetaSearchScore("score")) 44 .Limit(10) 45 .ToList(); 46 47 // print results 48 foreach (var movie in results) 49 { 50 Console.WriteLine(movie.ToJson()); 51 } 52 } 53 } 54 55 [ ]56 public class MovieDocument 57 { 58 [ ]59 public ObjectId Id { get; set; } 60 public string Plot { get; set; } 61 public string Title { get; set; } 62 public double Score { get; set; } 63 }
替换查询中的 <connection-string>
,然后保存该文件。
确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
编译并运行 Program.cs
文件。
dotnet run compound-bury-results.csproj
{ "_id" : ObjectId("573a139af29313caabcefcce"), "plot" : "Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.", "title" : "The Canterville Ghost", "genres" : ["Family", "Drama", "Fantasy"], "score" : 5.9096131324768066 } { "_id" : ObjectId("573a13d8f29313caabda5dc1"), "plot" : "The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!", "title" : "The Little Ghost", "genres" : ["Family", "Fantasy"], "score" : 5.3676662445068359 } { "_id" : ObjectId("573a13c0f29313caabd6139d"), "plot" : "Renowned \"ghost hunter\", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.", "title" : "Death of a Ghost Hunter", "genres" : ["Horror", "Thriller"], "score" : 4.6763143539428711 } { "_id" : ObjectId("573a1398f29313caabcebf6f"), "plot" : "After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.", "title" : "Ghost", "genres" : ["Drama", "Fantasy", "Romance"], "score" : 3.9638845920562744 } { "_id" : ObjectId("573a13cdf29313caabd83c08"), "plot" : "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.", "title" : "Ghost", "genres" : ["Drama", "Fantasy", "Mystery"], "score" : 3.9638845920562744 } { "_id" : ObjectId("573a13cef29313caabd873a2"), "plot" : "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.", "title" : "Ghost", "genres" : ["Drama", "Fantasy", "Mystery"], "score" : 3.9638845920562744 } { "_id" : ObjectId("573a13c3f29313caabd6a149"), "plot" : "What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...", "title" : "Coming Soon", "genres" : ["Horror", "Thriller"], "score" : 3.5267119407653809 } { "_id" : ObjectId("573a1398f29313caabce912c"), "plot" : "Three unemployed parapsychology professors set up shop as a unique ghost removal service.", "title" : "Ghostbusters", "genres" : ["Comedy", "Fantasy"], "score" : 3.5241782665252686 } { "_id" : ObjectId("573a139cf29313caabcf5a48"), "plot" : "Casper, a ghost, teams up with Wendy, a witch, against an evil warlock.", "title" : "Casper Meets Wendy", "genres" : ["Adventure", "Comedy", "Family"], "score" : 3.5241782665252686 } { "_id" : ObjectId("573a13bdf29313caabd58274"), "plot" : "Banku, his mother, Anjali Sharma and father move in to their new house -- the Nath villa, unaware of the fact that the house is inhabited by a ghost. It is learnt the ghost is not too happy...", "title" : "Bhoothnath", "genres" : ["Comedy", "Drama", "Fantasy"], "score" : 3.4605300426483154 }
结果中的电影文档在 plot
或 title
字段中包含查询词 ghost
,并且不属于 Comedy
类型。Atlas Search 没有返回 plot
或 title
字段中包含术语 ghost
的 Comedy
类型的文档,因为这些文档没有排在前 10 的文档中,因为查询将这些文档的分数降低了 50%。
dotnet run compound-bury-results.csproj
{ "_id" : ObjectId("573a139af29313caabcefcce"), "plot" : "Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.", "title" : "The Canterville Ghost", "score" : 5.9096131324768066 } { "_id" : ObjectId("573a13d8f29313caabda5dc1"), "plot" : "The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!", "title" : "The Little Ghost", "score" : 5.3676662445068359 } { "_id" : ObjectId("573a13c0f29313caabd6139d"), "plot" : "Renowned \"ghost hunter\", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.", "title" : "Death of a Ghost Hunter", "score" : 4.6763143539428711 } { "_id" : ObjectId("573a1398f29313caabcebf6f"), "plot" : "After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.", "title" : "Ghost", "score" : 3.9638845920562744 } { "_id" : ObjectId("573a13cdf29313caabd83c08"), "plot" : "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.", "title" : "Ghost", "score" : 3.9638845920562744 } { "_id" : ObjectId("573a13cef29313caabd873a2"), "plot" : "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.", "title" : "Ghost", "score" : 3.9638845920562744 } { "_id" : ObjectId("573a13c3f29313caabd6a149"), "plot" : "What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...", "title" : "Coming Soon", "score" : 3.5267119407653809 } { "_id" : ObjectId("573a1398f29313caabce912c"), "plot" : "Three unemployed parapsychology professors set up shop as a unique ghost removal service.", "title" : "Ghostbusters", "score" : 3.5241782665252686 } { "_id" : ObjectId("573a139cf29313caabcf5a48"), "plot" : "Casper, a ghost, teams up with Wendy, a witch, against an evil warlock.", "title" : "Casper Meets Wendy", "score" : 3.5241782665252686 } { "_id" : ObjectId("573a13bdf29313caabd58274"), "plot" : "Banku, his mother, Anjali Sharma and father move in to their new house -- the Nath villa, unaware of the fact that the house is inhabited by a ghost. It is learnt the ghost is not too happy...", "title" : "Bhoothnath", "score" : 3.4605300426483154 }
结果中的电影文档在plot
或title
字段中包含查询术语ghost
,但在_id
字段中没有指定的 ObjectId。 Atlas Search没有返回具有指定 ObjectsId 的文档,即使它们在title
字段中包含查询术语ghost
,因为查询将这些文档的分数降低了50 %,因此,这些文档没有排在前10份文档中。
将查询复制并粘贴到 compound-bury-results.go
文件中。
此查询使用以下管道阶段:
| |
将结果数量限制为 | |
|
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 "time" 7 8 "go.mongodb.org/mongo-driver/bson" 9 "go.mongodb.org/mongo-driver/mongo" 10 "go.mongodb.org/mongo-driver/mongo/options" 11 ) 12 13 // define structure of movies collection 14 type MovieCollection struct { 15 title string `bson:"Title,omitempty"` 16 plot string `bson:"Plot,omitempty"` 17 } 18 19 func main() { 20 var err error 21 // connect to the Atlas cluster 22 ctx := context.Background() 23 client, err := mongo.Connect(ctx, options.Client().ApplyURI("<connection-string>")) 24 if err != nil { 25 panic(err) 26 } 27 defer client.Disconnect(ctx) 28 // set namespace 29 collection := client.Database("sample_mflix").Collection("movies") 30 // define pipeline 31 searchStage := bson.D{{"$search", bson.D{ 32 {"index", "compound-query-custom-score-tutorial"}, 33 {"compound", bson.D{ 34 {"should", bson.A{ 35 bson.D{{"compound", bson.D{ 36 {"must", bson.A{ 37 bson.D{{"text", bson.D{ 38 {"query", "ghost"}, 39 {"path", bson.A{ "plot", "title" }}, 40 }}}, 41 }}, 42 {"mustNot", bson.A{ 43 bson.D{{"text", bson.D{ 44 {"query", "Comedy"}, 45 {"path", bson.A{ "genres" }}, 46 }}}, 47 }}, 48 }}}, 49 bson.D{{"compound", bson.D{ 50 {"must", bson.A{ 51 bson.D{{"text", bson.D{ 52 {"query", "ghost"}, 53 {"path", bson.A{ "plot", "title" }}, 54 }}}, 55 }}, 56 {"filter", bson.A{ 57 bson.D{{"text", bson.D{ 58 {"query", "Comedy"}, 59 {"path", bson.A{ "genres" }}, 60 }}}, 61 }}, 62 {"score", bson.D{{"boost", bson.D{{"value", 0.5}}}}}, 63 }}}, 64 }}, 65 }}, 66 }}} 67 limitStage := bson.D{{"$limit", 10}} 68 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"plot", 1}, {"_id", 0}, {"genres", 1}, {"score", bson.D{{"$meta", "searchScore"}}}}}} 69 // specify the amount of time the operation can run on the server 70 opts := options.Aggregate().SetMaxTime(5 * time.Second) 71 // run pipeline 72 cursor, err := collection.Aggregate(ctx, mongo.Pipeline{searchStage, limitStage, projectStage}, opts) 73 if err != nil { 74 panic(err) 75 } 76 // print results 77 var results []bson.D 78 if err = cursor.All(context.TODO(), &results); err != nil { 79 panic(err) 80 } 81 for _, result := range results { 82 fmt.Println(result) 83 } 84 }
此查询使用以下管道阶段:
| |
将结果数量限制为 | |
|
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 "time" 7 "log" 8 9 "go.mongodb.org/mongo-driver/bson" 10 "go.mongodb.org/mongo-driver/mongo" 11 "go.mongodb.org/mongo-driver/mongo/options" 12 "go.mongodb.org/mongo-driver/bson/primitive" 13 ) 14 15 // define structure of movies collection 16 type MovieCollection struct { 17 title string `bson:"Title,omitempty"` 18 plot string `bson:"Plot,omitempty"` 19 } 20 21 func main() { 22 var err error 23 // connect to the Atlas cluster 24 ctx := context.Background() 25 client, err := mongo.Connect(ctx, options.Client().ApplyURI("<connection-string>")) 26 if err != nil { 27 panic(err) 28 } 29 defer client.Disconnect(ctx) 30 // set namespace 31 collection := client.Database("sample_mflix").Collection("movies") 32 // define variable 33 var objectIDFromHex = func(hex string) primitive.ObjectID { 34 objectID, err := primitive.ObjectIDFromHex(hex) 35 if err != nil { 36 log.Fatal(err) 37 } 38 return objectID 39 } 40 // define pipeline 41 searchStage := bson.D{{"$search", bson.D{ 42 {"index", "compound-query-custom-score-tutorial"}, 43 {"compound", bson.D{ 44 {"should", bson.A{ 45 bson.D{{"compound", bson.D{ 46 {"must", bson.A{ 47 bson.D{{"text", bson.D{ 48 {"query", "ghost"}, 49 {"path", bson.A{ "plot", "title" }}, 50 }}}, 51 }}, 52 {"mustNot", bson.A{ 53 bson.D{{"in", bson.D{ 54 {"value", bson.A{objectIDFromHex("573a13cdf29313caabd83c08"), objectIDFromHex("573a13cef29313caabd873a2") }}, 55 {"path", "_id"}, 56 }}}, 57 }}, 58 }}}, 59 bson.D{{"compound", bson.D{ 60 {"must", bson.A{ 61 bson.D{{"text", bson.D{ 62 {"query", "ghost"}, 63 {"path", bson.A{ "plot", "title" }}, 64 }}}, 65 }}, 66 {"filter", bson.A{ 67 bson.D{{"in", bson.D{ 68 {"value", bson.A{ objectIDFromHex("573a13cdf29313caabd83c08"), objectIDFromHex("573a13cef29313caabd873a2")}}, 69 {"path", "_id"}, 70 }}}, 71 }}, 72 {"score", bson.D{{"boost", bson.D{{"value", 0.5}}}}}, 73 }}}, 74 }}, 75 }}, 76 }}} 77 78 limitStage := bson.D{{"$limit", 10}} 79 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"plot", 1}, {"_id", 0}, {"score", bson.D{{"$meta", "searchScore"}}}}}} 80 // specify the amount of time the operation can run on the server 81 opts := options.Aggregate().SetMaxTime(5 * time.Second) 82 // run pipeline 83 cursor, err := collection.Aggregate(ctx, mongo.Pipeline{searchStage, limitStage, projectStage}, opts) 84 if err != nil { 85 panic(err) 86 } 87 // print results 88 var results []bson.D 89 if err = cursor.All(context.TODO(), &results); err != nil { 90 panic(err) 91 } 92 for _, result := range results { 93 fmt.Println(result) 94 } 95 }
替换查询中的 <connection-string>
,然后保存该文件。
确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
运行命令以查询您的集合。
go run compound-bury-results.go
[{plot Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.} {genres [Family Drama Fantasy]} {title The Canterville Ghost} {score 5.909613132476807}] [{plot The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!} {genres [Family Fantasy]} {title The Little Ghost} {score 5.367666244506836}] [{plot Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.} {genres [Horror Thriller]} {title Death of a Ghost Hunter} {score 4.676314353942871}] [{plot After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.} {genres [Drama Fantasy Romance]} {title Ghost} {score 3.9638845920562744}] [{plot A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.} {genres [Drama Fantasy Mystery]} {title Ghost} {score 3.9638845920562744}] [{plot A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.} {genres [Drama Fantasy Mystery]} {title Ghost} {score 3.9638845920562744}] [{plot What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...} {genres [Horror Thriller]} {title Coming Soon} {score 3.526711940765381}] [{plot Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ...} {genres [Drama Horror Thriller]} {title Ghost Story} {score 3.3177831172943115}] [{plot Stunt motorcyclist Johnny Blaze gives up his soul to become a hellblazing vigilante, to fight against power hungry Blackheart, the son of the devil himself.} {genres [Action Fantasy Thriller]} {title Ghost Rider} {score 3.3177831172943115}] [{plot A salvage crew that discovers a long-lost 1962 passenger ship floating lifeless in a remote region of the Bering Sea soon notices, as they prepare to tow it back to land, that "strange things" happen...} {genres [Horror Mystery]} {title Ghost Ship} {score 3.3177831172943115}]
结果中的电影文档在 plot
或 title
字段中包含查询词 ghost
,并且不属于 Comedy
类型。Atlas Search 没有返回 plot
或 title
字段中包含术语 ghost
的 Comedy
类型的文档,因为这些文档没有排在前 10 的文档中,因为查询将这些文档的分数降低了 50%。
go run compound-bury-results.go
[{plot Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.} {title The Canterville Ghost} {score 5.909613132476807}] [{plot The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!} {title The Little Ghost} {score 5.367666244506836}] [{plot Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.} {title Death of a Ghost Hunter} {score 4.676314353942871}] [{plot After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.} {title Ghost} {score 3.9638845920562744}] [{plot What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...} {title Coming Soon} {score 3.526711940765381}] [{plot Three unemployed parapsychology professors set up shop as a unique ghost removal service.} {title Ghostbusters} {score 3.5241782665252686}] [{plot Casper, a ghost, teams up with Wendy, a witch, against an evil warlock.} {title Casper Meets Wendy} {score 3.5241782665252686}] [{plot Banku, his mother, Anjali Sharma and father move in to their new house -- the Nath villa, unaware of the fact that the house is inhabited by a ghost. It is learnt the ghost is not too happy...} {title Bhoothnath} {score 3.4605300426483154}] [{plot Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ...} {title Ghost Story} {score 3.3177831172943115}] [{plot Elliot Hopper is a widower with three children, he is currently working on a deal. It seems like his wife illness was very costly and this deal could put them out of the red. However he ...} {title Ghost Dad} {score 3.3177831172943115}]
结果中的电影文档在plot
或title
字段中包含查询术语ghost
,但在_id
字段中没有指定的 ObjectId。 Atlas Search没有返回具有指定 ObjectsId 的文档,即使它们在title
字段中包含查询术语ghost
,因为查询将这些文档的分数降低了50 %,因此,这些文档没有排在前10份文档中。
将查询复制并粘贴到 CompoundBuryQuery.java
文件中。
此查询使用以下管道阶段:
| |
将结果数量限制为 | |
|
1 import java.util.Arrays; 2 import static com.mongodb.client.model.Aggregates.limit; 3 import static com.mongodb.client.model.Aggregates.project; 4 import static com.mongodb.client.model.Projections.*; 5 import com.mongodb.client.MongoClient; 6 import com.mongodb.client.MongoClients; 7 import com.mongodb.client.MongoCollection; 8 import com.mongodb.client.MongoDatabase; 9 10 import org.bson.Document; 11 12 public class CompoundBuryQuery { 13 public static void main( String[] args ) { 14 // define query 15 Document agg = 16 new Document("$search", 17 new Document("index", "compound-query-custom-score-tutorial") 18 .append("compound", 19 new Document("should", Arrays.asList(new Document("compound", 20 new Document("must", Arrays.asList(new Document("text", 21 new Document("query", "ghost") 22 .append("path", Arrays.asList("plot", "title"))))) 23 .append("mustNot", Arrays.asList(new Document("text", 24 new Document("query", "Comedy") 25 .append("path", Arrays.asList("genres"))))) 26 ), 27 new Document("compound", 28 new Document("must", Arrays.asList(new Document("text", 29 new Document("query", "ghost") 30 .append("path", Arrays.asList("plot", "title"))))) 31 .append("filter", Arrays.asList(new Document("text", 32 new Document("query", "Comedy") 33 .append("path", Arrays.asList("genres"))))) 34 .append("score", new Document("boost", 35 new Document("value", 0.5d)))))) 36 ) 37 ); 38 // specify connection 39 String uri = "<connection-string>"; 40 // establish connection and set namespace 41 try (MongoClient mongoClient = MongoClients.create(uri)) { 42 MongoDatabase database = mongoClient.getDatabase("sample_mflix"); 43 MongoCollection<Document> collection = database.getCollection("movies"); 44 // run query and print results 45 collection.aggregate(Arrays.asList(agg, 46 limit(10), 47 project(fields( 48 include("title", "plot", "genres", "_id"), 49 computed("score", new Document("$meta", "searchScore")))))) 50 .forEach(doc -> System.out.println(doc.toJson())); 51 } 52 } 53 }
此查询使用以下管道阶段:
| |
将结果数量限制为 | |
|
1 import java.util.Arrays; 2 import static com.mongodb.client.model.Aggregates.limit; 3 import static com.mongodb.client.model.Aggregates.project; 4 import static com.mongodb.client.model.Projections.*; 5 import com.mongodb.client.MongoClient; 6 import com.mongodb.client.MongoClients; 7 import com.mongodb.client.MongoCollection; 8 import com.mongodb.client.MongoDatabase; 9 import org.bson.types.ObjectId; 10 11 import org.bson.Document; 12 13 public class CompoundBuryQuery { 14 public static void main( String[] args ) { 15 // define query 16 Document agg = 17 new Document("$search", 18 new Document("index", "compound-query-custom-score-tutorial") 19 .append("compound", 20 new Document("should", Arrays.asList( 21 new Document("compound", 22 new Document("must", Arrays.asList(new Document("text", 23 new Document("query", "ghost") 24 .append("path", Arrays.asList("plot", "title"))))) 25 .append("mustNot", Arrays.asList(new Document("in", 26 new Document("value", Arrays.asList(new ObjectId("573a13cdf29313caabd83c08"), 27 new ObjectId("573a13cef29313caabd873a2"))) 28 .append("path", "_id"))))), 29 new Document("compound", 30 new Document("must", Arrays.asList(new Document("text", 31 new Document("query", "ghost") 32 .append("path", Arrays.asList("plot", "title"))))) 33 .append("filter", Arrays.asList(new Document("in", 34 new Document("value", Arrays.asList(new ObjectId("573a13cdf29313caabd83c08"), 35 new ObjectId("573a13cef29313caabd873a2"))) 36 .append("path", "_id")))) 37 .append("score", new Document("boost", 38 new Document("value", 0.5d))))) 39 ) 40 ) 41 ); 42 // specify connection 43 String uri = "<connection-string>"; 44 // establish connection and set namespace 45 try (MongoClient mongoClient = MongoClients.create(uri)) { 46 MongoDatabase database = mongoClient.getDatabase("sample_mflix"); 47 MongoCollection<Document> collection = database.getCollection("movies"); 48 // run query and print results 49 collection.aggregate(Arrays.asList(agg, 50 limit(10), 51 project(fields( 52 include("title", "plot", "_id"), 53 computed("score", new Document("$meta", "searchScore")))))) 54 .forEach(doc -> System.out.println(doc.toJson())); 55 } 56 } 57 }
替换查询中的 <connection-string>
,然后保存该文件。
确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
编译并运行 CompoundBuryQuery.java
文件。
javac CompoundBuryQuery.java
{"_id": {"$oid": "573a139af29313caabcefcce"}, "plot": "Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.", "genres": ["Family", "Drama", "Fantasy"], "title": "The Canterville Ghost", "score": 5.909613132476807} {"_id": {"$oid": "573a13d8f29313caabda5dc1"}, "plot": "The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!", "genres": ["Family", "Fantasy"], "title": "The Little Ghost", "score": 5.367666244506836} {"_id": {"$oid": "573a13c0f29313caabd6139d"}, "plot": "Renowned \"ghost hunter\", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.", "genres": ["Horror", "Thriller"], "title": "Death of a Ghost Hunter", "score": 4.676314353942871} {"_id": {"$oid": "573a1398f29313caabcebf6f"}, "plot": "After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.", "genres": ["Drama", "Fantasy", "Romance"], "title": "Ghost", "score": 3.9638845920562744} {"_id": {"$oid": "573a13cdf29313caabd83c08"}, "plot": "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.", "genres": ["Drama", "Fantasy", "Mystery"], "title": "Ghost", "score": 3.9638845920562744} {"_id": {"$oid": "573a13cef29313caabd873a2"}, "plot": "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.", "genres": ["Drama", "Fantasy", "Mystery"], "title": "Ghost", "score": 3.9638845920562744} {"_id": {"$oid": "573a13c3f29313caabd6a149"}, "plot": "What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...", "genres": ["Horror", "Thriller"], "title": "Coming Soon", "score": 3.526711940765381} {"_id": {"$oid": "573a1397f29313caabce7ea1"}, "plot": "Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ...", "genres": ["Drama", "Horror", "Thriller"], "title": "Ghost Story", "score": 3.3177831172943115} {"_id": {"$oid": "573a13a4f29313caabd117df"}, "plot": "Stunt motorcyclist Johnny Blaze gives up his soul to become a hellblazing vigilante, to fight against power hungry Blackheart, the son of the devil himself.", "genres": ["Action", "Fantasy", "Thriller"], "title": "Ghost Rider", "score": 3.3177831172943115} {"_id": {"$oid": "573a13a6f29313caabd185dc"}, "plot": "A salvage crew that discovers a long-lost 1962 passenger ship floating lifeless in a remote region of the Bering Sea soon notices, as they prepare to tow it back to land, that \"strange things\" happen...", "genres": ["Horror", "Mystery"], "title": "Ghost Ship", "score": 3.3177831172943115}
结果中的电影文档在 plot
或 title
字段中包含查询词 ghost
,并且不属于 Comedy
类型。Atlas Search 没有返回 plot
或 title
字段中包含术语 ghost
的 Comedy
类型的文档,因为这些文档没有排在前 10 的文档中,因为查询将这些文档的分数降低了 50%。
javac CompoundBuryQuery.java
{"_id": {"$oid": "573a139af29313caabcefcce"}, "plot": "Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.", "title": "The Canterville Ghost", "score": 5.909613132476807} {"_id": {"$oid": "573a13d8f29313caabda5dc1"}, "plot": "The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!", "title": "The Little Ghost", "score": 5.367666244506836} {"_id": {"$oid": "573a13c0f29313caabd6139d"}, "plot": "Renowned \"ghost hunter\", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.", "title": "Death of a Ghost Hunter", "score": 4.676314353942871} {"_id": {"$oid": "573a1398f29313caabcebf6f"}, "plot": "After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.", "title": "Ghost", "score": 3.9638845920562744} {"_id": {"$oid": "573a13c3f29313caabd6a149"}, "plot": "What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...", "title": "Coming Soon", "score": 3.526711940765381} {"_id": {"$oid": "573a1398f29313caabce912c"}, "plot": "Three unemployed parapsychology professors set up shop as a unique ghost removal service.", "title": "Ghostbusters", "score": 3.5241782665252686} {"_id": {"$oid": "573a139cf29313caabcf5a48"}, "plot": "Casper, a ghost, teams up with Wendy, a witch, against an evil warlock.", "title": "Casper Meets Wendy", "score": 3.5241782665252686} {"_id": {"$oid": "573a13bdf29313caabd58274"}, "plot": "Banku, his mother, Anjali Sharma and father move in to their new house -- the Nath villa, unaware of the fact that the house is inhabited by a ghost. It is learnt the ghost is not too happy...", "title": "Bhoothnath", "score": 3.4605300426483154} {"_id": {"$oid": "573a1397f29313caabce7ea1"}, "plot": "Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ...", "title": "Ghost Story", "score": 3.3177831172943115} {"_id": {"$oid": "573a1398f29313caabcebf79"}, "plot": "Elliot Hopper is a widower with three children, he is currently working on a deal. It seems like his wife illness was very costly and this deal could put them out of the red. However he ...", "title": "Ghost Dad", "score": 3.3177831172943115}
结果中的电影文档在plot
或title
字段中包含查询术语ghost
,但在_id
字段中没有指定的 ObjectId。 Atlas Search没有返回具有指定 ObjectsId 的文档,即使它们在title
字段中包含查询术语ghost
,因为查询将这些文档的分数降低了50 %,因此,这些文档没有排在前10份文档中。
将以下代码复制并粘贴到 CompoundBuryQuery.kt
文件。
此查询使用以下管道阶段:
| |
将结果数量限制为 | |
|
1 import com.mongodb.client.model.Aggregates.limit 2 import com.mongodb.client.model.Aggregates.project 3 import com.mongodb.client.model.Projections.* 4 import com.mongodb.kotlin.client.coroutine.MongoClient 5 import kotlinx.coroutines.runBlocking 6 import org.bson.Document 7 8 fun main() { 9 // establish connection and set namespace 10 val uri = "<connection-string>" 11 val mongoClient = MongoClient.create(uri) 12 val database = mongoClient.getDatabase("sample_mflix") 13 val collection = database.getCollection<Document>("movies") 14 15 runBlocking { 16 // define clauses 17 val mustClause = listOf( 18 Document("text", 19 Document("query", "ghost") 20 .append("path", listOf("plot","title")) 21 ) 22 ) 23 24 val mustNotClauseAndFilterClause = listOf( 25 Document("text", 26 Document("query", "Comedy") 27 .append("path", listOf("genres")) 28 ) 29 ) 30 31 val compound1 = Document("must", mustClause) 32 .append("mustNot", mustNotClauseAndFilterClause) 33 34 val compound2 = Document("must", mustClause) 35 .append("filter", mustNotClauseAndFilterClause) 36 .append("score", 37 Document("boost", 38 Document("value", 0.5) 39 ) 40 ) 41 42 val agg = Document("\$search", 43 Document("index", "compound-query-custom-score-tutorial") 44 .append("compound", Document("should", listOf( 45 Document("compound", compound1), 46 Document("compound", compound2) 47 ))) 48 ) 49 50 val resultsFlow = collection.aggregate<Document>( 51 listOf( 52 agg, 53 limit(10), 54 project(fields( 55 include("title", "plot", "genres"), 56 computed("score", Document("\$meta", "searchScore")) 57 )) 58 ) 59 ) 60 resultsFlow.collect { println(it) } 61 } 62 mongoClient.close() 63 }
此查询使用以下管道阶段:
| |
将结果数量限制为 | |
|
1 import com.mongodb.client.model.Aggregates.limit 2 import com.mongodb.client.model.Aggregates.project 3 import com.mongodb.client.model.Projections.* 4 import com.mongodb.kotlin.client.coroutine.MongoClient 5 import kotlinx.coroutines.runBlocking 6 import org.bson.Document 7 import org.bson.types.ObjectId 8 9 fun main() { 10 // establish connection and set namespace 11 val uri = "<connection-string>" 12 val mongoClient = MongoClient.create(uri) 13 val database = mongoClient.getDatabase("sample_mflix") 14 val collection = database.getCollection<Document>("movies") 15 16 runBlocking { 17 // define clauses 18 val mustClause = listOf( 19 Document("text", 20 Document("query", "ghost") 21 .append("path", listOf("plot","title")) 22 ) 23 ) 24 25 val mustNotClauseAndFilterClause = listOf( 26 Document("in", 27 Document("value", listOf(ObjectId("573a13cdf29313caabd83c08"), ObjectId("573a13cef29313caabd873a2"))) 28 .append("path", "_id") 29 ) 30 ) 31 32 val compound1 = Document("must", mustClause) 33 .append("mustNot", mustNotClauseAndFilterClause) 34 35 val compound2 = Document("must", mustClause) 36 .append("filter", mustNotClauseAndFilterClause) 37 .append("score", 38 Document("boost", 39 Document("value", 0.5) 40 ) 41 ) 42 43 val agg = Document("\$search", 44 Document("index", "compound-query-custom-score-tutorial") 45 .append("compound", Document("should", listOf( 46 Document("compound", compound1), 47 Document("compound", compound2) 48 ))) 49 ) 50 51 val resultsFlow = collection.aggregate<Document>( 52 listOf( 53 agg, 54 limit(10), 55 project(fields( 56 include("title", "plot", "_id"), 57 computed("score", Document("\$meta", "searchScore")) 58 )) 59 ) 60 ) 61 resultsFlow.collect { println(it) } 62 } 63 mongoClient.close() 64 }
替换查询中的 <connection-string>
,然后保存该文件。
确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
运行 CompoundBuryQuery.kt
文件。
当你在 IDE 中运行 CompoundBuryQuery.kt
程序时,它会打印以下文档:
dotnet run compound-bury-results.csproj
Document{{_id=573a139af29313caabcefcce, plot=Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness., genres=[Family, Drama, Fantasy], title=The Canterville Ghost, score=5.909613132476807}} Document{{_id=573a13d8f29313caabda5dc1, plot=The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!, genres=[Family, Fantasy], title=The Little Ghost, score=5.367666244506836}} Document{{_id=573a13c0f29313caabd6139d, plot=Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror., genres=[Horror, Thriller], title=Death of a Ghost Hunter, score=4.676314353942871}} Document{{_id=573a1398f29313caabcebf6f, plot=After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic., genres=[Drama, Fantasy, Romance], title=Ghost, score=3.9638845920562744}} Document{{_id=573a13cdf29313caabd83c08, plot=A man tries to solve his lover's murder by communicating with her spirit through the help of a medium., genres=[Drama, Fantasy, Mystery], title=Ghost, score=3.9638845920562744}} Document{{_id=573a13cef29313caabd873a2, plot=A man tries to solve his lover's murder by communicating with her spirit through the help of a medium., genres=[Drama, Fantasy, Mystery], title=Ghost, score=3.9638845920562744}} Document{{_id=573a13c3f29313caabd6a149, plot=What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ..., genres=[Horror, Thriller], title=Coming Soon, score=3.526711940765381}} Document{{_id=573a1397f29313caabce7ea1, plot=Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ..., genres=[Drama, Horror, Thriller], title=Ghost Story, score=3.3177831172943115}} Document{{_id=573a13a4f29313caabd117df, plot=Stunt motorcyclist Johnny Blaze gives up his soul to become a hellblazing vigilante, to fight against power hungry Blackheart, the son of the devil himself., genres=[Action, Fantasy, Thriller], title=Ghost Rider, score=3.3177831172943115}} Document{{_id=573a13a6f29313caabd185dc, plot=A salvage crew that discovers a long-lost 1962 passenger ship floating lifeless in a remote region of the Bering Sea soon notices, as they prepare to tow it back to land, that "strange things" happen..., genres=[Horror, Mystery], title=Ghost Ship, score=3.3177831172943115}}
结果中的电影文档在 plot
或 title
字段中包含查询词 ghost
,并且不属于 Comedy
类型。Atlas Search 没有返回 plot
或 title
字段中包含术语 ghost
的 Comedy
类型的文档,因为这些文档没有排在前 10 的文档中,因为查询将这些文档的分数降低了 50%。
dotnet run compound-bury-results.csproj
Document{{_id=573a139af29313caabcefcce, plot=Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness., title=The Canterville Ghost, score=5.909613132476807}} Document{{_id=573a13d8f29313caabda5dc1, plot=The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!, title=The Little Ghost, score=5.367666244506836}} Document{{_id=573a13c0f29313caabd6139d, plot=Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror., title=Death of a Ghost Hunter, score=4.676314353942871}} Document{{_id=573a1398f29313caabcebf6f, plot=After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic., title=Ghost, score=3.9638845920562744}} Document{{_id=573a13c3f29313caabd6a149, plot=What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ..., title=Coming Soon, score=3.526711940765381}} Document{{_id=573a1398f29313caabce912c, plot=Three unemployed parapsychology professors set up shop as a unique ghost removal service., title=Ghostbusters, score=3.5241782665252686}} Document{{_id=573a139cf29313caabcf5a48, plot=Casper, a ghost, teams up with Wendy, a witch, against an evil warlock., title=Casper Meets Wendy, score=3.5241782665252686}} Document{{_id=573a13bdf29313caabd58274, plot=Banku, his mother, Anjali Sharma and father move in to their new house -- the Nath villa, unaware of the fact that the house is inhabited by a ghost. It is learnt the ghost is not too happy..., title=Bhoothnath, score=3.4605300426483154}} Document{{_id=573a1397f29313caabce7ea1, plot=Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ..., title=Ghost Story, score=3.3177831172943115}} Document{{_id=573a1398f29313caabcebf79, plot=Elliot Hopper is a widower with three children, he is currently working on a deal. It seems like his wife illness was very costly and this deal could put them out of the red. However he ..., title=Ghost Dad, score=3.3177831172943115}}
结果中的电影文档在plot
或title
字段中包含查询术语ghost
,但在_id
字段中没有指定的 ObjectId。 Atlas Search没有返回具有指定 ObjectsId 的文档,即使它们在title
字段中包含查询术语ghost
,因为查询将这些文档的分数降低了50 %,因此,这些文档没有排在前10份文档中。
将示例查询复制并粘贴到 compound-bury-results.js
文件中。
此查询使用以下管道阶段:
| |
将结果数量限制为 | |
|
1 const { MongoClient } = require("mongodb"); 2 3 // connect to your Atlas cluster 4 const uri = "<connection-string>"; 5 const client = new MongoClient(uri); 6 7 async function run() { 8 try { 9 await client.connect(); 10 11 // set namespace 12 const database = client.db("sample_mflix"); 13 const coll = database.collection("movies"); 14 15 // define pipeline 16 const agg = [ 17 { 18 "$search": { 19 "index": "compound-query-custom-score-tutorial", 20 "compound": { 21 "should": [ 22 { 23 "compound": { 24 "must": [ 25 { 26 "text": { 27 "query": "ghost", 28 "path": [ 29 "plot", "title" 30 ] 31 } 32 } 33 ], 34 "mustNot": [ 35 { 36 "text": { 37 "query": "Comedy", 38 "path": [ 39 "genres" 40 ] 41 } 42 } 43 ] 44 } 45 }, { 46 "compound": { 47 "must": [ 48 { 49 "text": { 50 "query": "ghost", 51 "path": [ 52 "plot", "title" 53 ] 54 } 55 } 56 ], 57 "filter": [ 58 { 59 "text": { 60 "query": "Comedy", 61 "path": [ 62 "genres" 63 ] 64 } 65 } 66 ], 67 "score": { "boost": { "value": 0.5 } } 68 } 69 } 70 ] 71 } 72 } 73 }, { 74 "$limit": 10 75 }, { 76 "$project": { 77 "_id": 1, 78 "title": 1, 79 "plot": 1, 80 "genres": 1, 81 "score": { "$meta": "searchScore" } 82 } 83 } 84 ]; 85 86 // run pipeline 87 const result = coll.aggregate(agg); 88 89 // print results 90 await result.forEach((doc) => console.dir(JSON.stringify(doc))); 91 } finally { 92 await client.close(); 93 } 94 } 95 run().catch(console.dir);
此查询使用以下管道阶段:
| |
将结果数量限制为 | |
|
1 const { MongoClient } = require("mongodb"); 2 const { ObjectId } = require("mongodb"); 3 4 // connect to your Atlas cluster 5 const uri = "<connection-string>"; 6 const client = new MongoClient(uri); 7 8 async function run() { 9 try { 10 await client.connect(); 11 12 // set namespace 13 const database = client.db("sample_mflix"); 14 const coll = database.collection("movies"); 15 16 // define pipeline 17 const agg = [ 18 { 19 '$search': { 20 'index': 'compound-query-custom-score-tutorial', 21 'compound': { 22 'should': [ 23 { 24 'compound': { 25 'must': [ 26 { 27 'text': { 28 'query': 'ghost', 29 'path': [ 'plot', 'title' ] 30 } 31 } 32 ], 33 'mustNot': [ 34 { 35 'in': { 36 'value': [ new ObjectId('573a13cdf29313caabd83c08'), new ObjectId('573a13cef29313caabd873a2') ], 37 'path': '_id' 38 } 39 } 40 ] 41 } 42 }, { 43 'compound': { 44 'must': [ 45 { 46 'text': { 47 'query': 'ghost', 48 'path': [ 'plot', 'title' ] 49 } 50 } 51 ], 52 'filter': [ 53 { 54 'in': { 55 'value': [ new ObjectId('573a13cdf29313caabd83c08'), new ObjectId('573a13cef29313caabd873a2') ], 56 'path': '_id' 57 } 58 } 59 ], 60 'score': { 61 'boost': { 'value': 0.5 } 62 } 63 } 64 } 65 ] 66 } 67 } 68 }, { 69 '$limit': 10 70 }, { 71 '$project': { 72 '_id': 1, 73 'title': 1, 74 'plot': 1, 75 'score': { '$meta': 'searchScore' } 76 } 77 } 78 ]; 79 80 // run pipeline 81 const result = coll.aggregate(agg); 82 83 // print results 84 await result.forEach((doc) => console.dir(JSON.stringify(doc))); 85 } finally { 86 await client.close(); 87 } 88 } 89 run().catch(console.dir);
替换查询中的 <connection-string>
,然后保存该文件。
确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
查询您的集合。
运行以下命令来查询您的集合:
node compound-bury-results.js
{"_id":"573a139af29313caabcefcce","plot":"Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.","genres":["Family","Drama","Fantasy"],"title":"The Canterville Ghost","score":5.909613132476807} {"_id":"573a13d8f29313caabda5dc1","plot":"The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!","genres":["Family","Fantasy"],"title":"The Little Ghost","score":5.367666244506836} {"_id":"573a13c0f29313caabd6139d","plot":"Renowned \\"ghost hunter\\", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.","genres":["Horror","Thriller"],"title":"Death of a Ghost Hunter","score":4.676314353942871} {"_id":"573a1398f29313caabcebf6f","plot":"After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.","genres":["Drama","Fantasy","Romance"],"title":"Ghost","score":3.9638845920562744} {"_id":"573a13cdf29313caabd83c08","plot":"A man tries to solve his lovers murder by communicating with her spirit through the help of a medium.","genres":["Drama","Fantasy","Mystery"],"title":"Ghost","score":3.9638845920562744} {"_id":"573a13cef29313caabd873a2","plot":"A man tries to solve his lovers murder by communicating with her spirit through the help of a medium.","genres":["Drama","Fantasy","Mystery"],"title":"Ghost","score":3.9638845920562744} {"_id":"573a13c3f29313caabd6a149","plot":"What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...","genres":["Horror","Thriller"],"title":"Coming Soon","score":3.526711940765381} {"_id":"573a1397f29313caabce7ea1","plot":"Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderleys twin sons dies in a bizarre accident, the group ...","genres":["Drama","Horror","Thriller"],"title":"Ghost Story","score":3.3177831172943115} {"_id":"573a13a4f29313caabd117df","plot":"Stunt motorcyclist Johnny Blaze gives up his soul to become a hellblazing vigilante, to fight against power hungry Blackheart, the son of the devil himself.","genres":["Action","Fantasy","Thriller"],"title":"Ghost Rider","score":3.3177831172943115} {"_id":"573a13a6f29313caabd185dc","plot":"A salvage crew that discovers a long-lost 1962 passenger ship floating lifeless in a remote region of the Bering Sea soon notices, as they prepare to tow it back to land, that \\"strange things\\" happen...","genres":["Horror","Mystery"],"title":"Ghost Ship","score":3.3177831172943115}
结果中的电影文档在 plot
或 title
字段中包含查询词 ghost
,并且不属于 Comedy
类型。Atlas Search 没有返回 plot
或 title
字段中包含术语 ghost
的 Comedy
类型的文档,因为这些文档没有排在前 10 的文档中,因为查询将这些文档的分数降低了 50%。
node compound-bury-results.js
{"_id":"573a139af29313caabcefcce","plot":"Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.","title":"The Canterville Ghost","score":5.909613132476807} {"_id":"573a13d8f29313caabda5dc1","plot":"The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!","title":"The Little Ghost","score":5.367666244506836} {"_id":"573a13c0f29313caabd6139d","plot":"Renowned \\"ghost hunter\\", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.","title":"Death of a Ghost Hunter","score":4.676314353942871} {"_id":"573a1398f29313caabcebf6f","plot":"After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.","title":"Ghost","score":3.9638845920562744} {"_id":"573a13c3f29313caabd6a149","plot":"What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...","title":"Coming Soon","score":3.526711940765381} {"_id":"573a1398f29313caabce912c","plot":"Three unemployed parapsychology professors set up shop as a unique ghost removal service.","title":"Ghostbusters","score":3.5241782665252686} {"_id":"573a139cf29313caabcf5a48","plot":"Casper, a ghost, teams up with Wendy, a witch, against an evil warlock.","title":"Casper Meets Wendy","score":3.5241782665252686} {"_id":"573a13bdf29313caabd58274","plot":"Banku, his mother, Anjali Sharma and father move in to their new house -- the Nath villa, unaware of the fact that the house is inhabited by a ghost. It is learnt the ghost is not too happy...","title":"Bhoothnath","score":3.4605300426483154} {"_id":"573a1397f29313caabce7ea1","plot":"Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderleys twin sons dies in a bizarre accident, the group ...","title":"Ghost Story","score":3.3177831172943115} {"_id":"573a1398f29313caabcebf79","plot":"Elliot Hopper is a widower with three children, he is currently working on a deal. It seems like his wife illness was very costly and this deal could put them out of the red. However he ...","title":"Ghost Dad","score":3.3177831172943115}
结果中的电影文档在plot
或title
字段中包含查询术语ghost
,但在_id
字段中没有指定的 ObjectId。 Atlas Search没有返回具有指定 ObjectsId 的文档,即使它们在title
字段中包含查询术语ghost
,因为查询将这些文档的分数降低了50 %,因此,这些文档没有排在前10份文档中。
将查询复制并粘贴到 compound-bury-results.py
文件中。
此查询使用以下管道阶段:
| |
将结果数量限制为 | |
|
1 import pymongo 2 import dns 3 4 client = pymongo.MongoClient('<connection-string>') 5 result = client['sample_mflix']['movies'].aggregate([ 6 { 7 '$search': { 8 'index': 'compound-query-custom-score-tutorial', 9 'compound': { 10 'should': [ 11 { 12 'compound': { 13 'must': [ 14 { 15 'text': { 16 'query': 'ghost', 17 'path': [ 'plot', 'title' ] 18 } 19 } 20 ], 21 'mustNot': [ 22 { 23 'text': { 24 'query': 'Comedy', 25 'path': [ 'genres' ] 26 } 27 } 28 ] 29 } 30 }, { 31 'compound': { 32 'must': [ 33 { 34 'text': { 35 'query': 'ghost', 36 'path': [ 'plot', 'title' ] 37 } 38 } 39 ], 40 'filter': [ 41 { 42 'text': { 43 'query': 'Comedy', 44 'path': [ 'genres' ] 45 } 46 } 47 ], 48 'score': { 'boost': { 'value': 0.5 } } 49 } 50 } 51 ] 52 } 53 } 54 }, { 55 '$limit': 10 56 }, { 57 '$project': { 58 '_id': 1, 59 'title': 1, 60 'plot': 1, 61 'genres': 1, 62 'score': { '$meta': 'searchScore' } 63 } 64 } 65 ]) 66 67 for i in result: 68 print(i)
此查询使用以下管道阶段:
| |
将结果数量限制为 | |
|
1 import pymongo 2 import dns 3 from bson import ObjectId 4 5 client = pymongo.MongoClient('<connection-string>') 6 result = client['sample_mflix']['movies'].aggregate([ 7 { 8 '$search': { 9 'index': 'compound-query-custom-score-tutorial', 10 'compound': { 11 'should': [ 12 { 13 'compound': { 14 'must': [ 15 { 16 'text': { 17 'query': 'ghost', 18 'path': [ 'plot', 'title' ] 19 } 20 } 21 ], 22 'mustNot': [ 23 { 24 'in': { 25 'value': [ ObjectId('573a13cdf29313caabd83c08'), ObjectId('573a13cef29313caabd873a2') ], 26 'path': '_id' 27 } 28 } 29 ] 30 } 31 }, { 32 'compound': { 33 'must': [ 34 { 35 'text': { 36 'query': 'ghost', 37 'path': [ 'plot', 'title' ] 38 } 39 } 40 ], 41 'filter': [ 42 { 43 'in': { 44 'value': [ ObjectId('573a13cdf29313caabd83c08'), ObjectId('573a13cef29313caabd873a2') ], 45 'path': '_id' 46 } 47 } 48 ], 49 'score': { 'boost': { 'value': 0.5 } } 50 } 51 } 52 ] 53 } 54 } 55 }, { 56 '$limit': 10 57 }, { 58 '$project': { 59 '_id': 1, 60 'title': 1, 61 'plot': 1, 62 'score': { '$meta': 'searchScore' } 63 } 64 } 65 ]) 66 67 for i in result: 68 print(i)
替换查询中的 <connection-string>
,然后保存该文件。
确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。
运行命令以查询您的集合。
python compound-bury-results.csproj
{'_id': ObjectId('573a139af29313caabcefcce'), 'plot': 'Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.', 'genres': ['Family', 'Drama', 'Fantasy'], 'title': 'The Canterville Ghost', 'score': 5.909613132476807} {'_id': ObjectId('573a13d8f29313caabda5dc1'), 'plot': 'The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!', 'genres': ['Family', 'Fantasy'], 'title': 'The Little Ghost', 'score': 5.367666244506836} {'_id': ObjectId('573a13c0f29313caabd6139d'), 'plot': 'Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.', 'genres': ['Horror', 'Thriller'], 'title': 'Death of a Ghost Hunter', 'score': 4.676314353942871} {'_id': ObjectId('573a1398f29313caabcebf6f'), 'plot': 'After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.', 'genres': ['Drama', 'Fantasy', 'Romance'], 'title': 'Ghost', 'score': 3.9638845920562744} {'_id': ObjectId('573a13cdf29313caabd83c08'), 'plot': "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.", 'genres': ['Drama', 'Fantasy', 'Mystery'], 'title': 'Ghost', 'score': 3.9638845920562744} {'_id': ObjectId('573a13cef29313caabd873a2'), 'plot': "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.", 'genres': ['Drama', 'Fantasy', 'Mystery'], 'title': 'Ghost', 'score': 3.9638845920562744} {'_id': ObjectId('573a13c3f29313caabd6a149'), 'plot': 'What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...', 'genres': ['Horror', 'Thriller'], 'title': 'Coming Soon', 'score': 3.526711940765381} {'_id': ObjectId('573a1397f29313caabce7ea1'), 'plot': "Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ...", 'genres': ['Drama', 'Horror', 'Thriller'], 'title': 'Ghost Story', 'score': 3.3177831172943115} {'_id': ObjectId('573a13a4f29313caabd117df'), 'plot': 'Stunt motorcyclist Johnny Blaze gives up his soul to become a hellblazing vigilante, to fight against power hungry Blackheart, the son of the devil himself.', 'genres': ['Action', 'Fantasy', 'Thriller'], 'title': 'Ghost Rider', 'score': 3.3177831172943115} {'_id': ObjectId('573a13a6f29313caabd185dc'), 'plot': 'A salvage crew that discovers a long-lost 1962 passenger ship floating lifeless in a remote region of the Bering Sea soon notices, as they prepare to tow it back to land, that "strange things" happen...', 'genres': ['Horror', 'Mystery'], 'title': 'Ghost Ship', 'score': 3.3177831172943115}
结果中的电影文档在 plot
或 title
字段中包含查询词 ghost
,并且不属于 Comedy
类型。Atlas Search 没有返回 plot
或 title
字段中包含术语 ghost
的 Comedy
类型的文档,因为这些文档没有排在前 10 的文档中,因为查询将这些文档的分数降低了 50%。
python compound-bury-results.csproj
{'_id': ObjectId('573a139af29313caabcefcce'), 'plot': 'Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.', 'title': 'The Canterville Ghost', 'score': 5.909613132476807} {'_id': ObjectId('573a13d8f29313caabda5dc1'), 'plot': 'The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!', 'title': 'The Little Ghost', 'score': 5.367666244506836} {'_id': ObjectId('573a13c0f29313caabd6139d'), 'plot': 'Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.', 'title': 'Death of a Ghost Hunter', 'score': 4.676314353942871} {'_id': ObjectId('573a1398f29313caabcebf6f'), 'plot': 'After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.', 'title': 'Ghost', 'score': 3.9638845920562744} {'_id': ObjectId('573a13c3f29313caabd6a149'), 'plot': 'What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...', 'title': 'Coming Soon', 'score': 3.526711940765381} {'_id': ObjectId('573a1398f29313caabce912c'), 'plot': 'Three unemployed parapsychology professors set up shop as a unique ghost removal service.', 'title': 'Ghostbusters', 'score': 3.5241782665252686} {'_id': ObjectId('573a139cf29313caabcf5a48'), 'plot': 'Casper, a ghost, teams up with Wendy, a witch, against an evil warlock.', 'title': 'Casper Meets Wendy', 'score': 3.5241782665252686} {'_id': ObjectId('573a13bdf29313caabd58274'), 'plot': 'Banku, his mother, Anjali Sharma and father move in to their new house -- the Nath villa, unaware of the fact that the house is inhabited by a ghost. It is learnt the ghost is not too happy...', 'title': 'Bhoothnath', 'score': 3.4605300426483154} {'_id': ObjectId('573a1397f29313caabce7ea1'), 'plot': "Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ...", 'title': 'Ghost Story', 'score': 3.3177831172943115} {'_id': ObjectId('573a1398f29313caabcebf79'), 'plot': 'Elliot Hopper is a widower with three children, he is currently working on a deal. It seems like his wife illness was very costly and this deal could put them out of the red. However he ...', 'title': 'Ghost Dad', 'score': 3.3177831172943115}
结果中的电影文档在plot
或title
字段中包含查询术语ghost
,但在_id
字段中没有指定的 ObjectId。 Atlas Search没有返回具有指定 ObjectsId 的文档,即使它们在title
字段中包含查询术语ghost
,因为查询将这些文档的分数降低了50 %,因此,这些文档没有排在前10份文档中。
继续学习
要了解有关使用 Atlas Search 进行复合查询的更多信息,请参阅 MongoDB University 上的 MongoDB 入门课程第 9 单元。这个 1.5 小时的单元包括 Atlas Search 的概述以及有关创建 Atlas Search 索引、使用复合操作符运行 $search
查询以及使用分面对结果进行分组的课程。