Docs 菜单
Docs 主页
/
MongoDB Atlas
/ /

如何在 Atlas Search 中使用同义词

在此页面上

  • 加载样本同义词源集合
  • 使用同义词映射定义创建 Atlas Search 索引
  • 搜索集合

本教程介绍如何添加将单词配置为同义词的集合、创建在 sample_mflix.movies 集合上定义同义词映射的索引,以及使用配置为同义词的单词针对 title 字段运行 Atlas Search 查询。

本教程将指导用户完成以下步骤:

  1. sample_mflix 数据库中加载一个或多个样本同义词源集合。

  2. 使用 sample_mflix.movies 集合的一个或多个同义词映射创建 Atlas Search 索引。

  3. 针对同义词源集合中配置为同义词的单词,针对 sample_mflix.movies 集合中的 title 字段运行 Atlas Search 查询。

在开始之前,请确保您的 Atlas 集群满足先决条件中所述的要求。

注意

要创建多个同义词映射并运行本教程中的高级示例查询,将需要一个 M10 或更高级别的集群。

要创建 Atlas Search 索引,您必须拥有 Project Data Access Admin 或更高的项目访问权限。

同义词源集合中的每个文档都介绍了一个或多个单词如何映射到一个或多个同义词。要详细了解在同义词源集合文档中的字段和映射类型,请参阅同义词源集合文档的格式。

首先,创建同义词源集合,然后将该集合添加到打算使用同义词源集合的数据库中。在本部分中,用户将在 sample_mflix 数据库中创建一两个样本同义词源集合,然后将这些同义词源集合与同一数据库中的 movies 集合的索引一起使用。

1
  1. 如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含所需项目的组织。

  2. 如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。

  3. 如果尚未显示,请单击侧边栏中的Clusters

    显示 集群页面。

2

单击集群的对应 Browse Collections 按钮。

显示数据浏览器

3

如果运行的是免费或共享层级集群,请按照运输同义词 标签页中的步骤操作,为索引中的单个同义词映射定义创建集合。如果有 M10 或更高级别的集群并希望在索引中创建多个同义词映射,请按照这两个标签页中的步骤操作,创建 运输同义词服装同义词 集合。

  1. 展开 sample_mflix 数据库,点击 图标打开 Create Collection 模式。

  2. Collection name 字段中输入 transport_synonyms

  3. 点击 Createsample_mflix 数据库中创建集合。

  1. 展开 sample_mflix 数据库,点击 图标打开 Create Collection 模式。

  2. Collection name 字段中输入 attire_synonyms

  3. 点击 Createsample_mflix 数据库中创建集合。

4

按照标签页中的步骤将数据加载到相应的集合中。

  1. 如果未选中 transport_synonyms,则将其选中。

  2. 单击每个示例文档的 Insert Document 以将其添加到集合中。

  3. 单击 JSON 视图 ({}) 替换默认文档。

  4. 逐一复制并粘贴以下示例文档,然后单击 Insert,将文档逐一添加到集合。

    {
    "mappingType": "equivalent",
    "synonyms": ["car", "vehicle", "automobile"]
    }
    {
    "mappingType": "explicit",
    "input": ["boat"],
    "synonyms": ["boat", "vessel", "sail"]
    }
  1. 如果未选中 attire_synonyms,则将其选中。

  2. 单击每个示例文档的 Insert Document 以将其添加到集合中。

  3. 单击 JSON 视图 ({}) 以替换默认文档。

  4. 逐一复制并粘贴以下示例文档,然后单击 Insert,将文档逐一添加到集合。

    {
    "mappingType": "equivalent",
    "synonyms": ["dress", "apparel", "attire"]
    }
    {
    "mappingType": "explicit",
    "input": ["hat"],
    "synonyms": ["hat", "fedora", "headgear"]
    }

集合索引中的同义词映射指定了同义词源集合和用于该集合的分析器。

在本部分中,用户将创建一个 Atlas Search 索引,该索引为 sample_mflix.movies 集合定义一个或多个同义词映射。该索引中的映射定义引用了用户在 sample_mflix 数据库中创建的同义词源集合。

1
  1. 如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含所需项目的组织。

  2. 如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。

  3. 如果尚未显示,请单击侧边栏中的Clusters

    会显示集群页面。

2

您可以从侧边栏、 Data Explorer 或集群详细信息页面转到 Atlas Search 页面。

  1. 在侧边栏中,单击 Services 标题下的 Atlas Search

  2. Select data source 下拉菜单中选择您的集群并单击 Go to Atlas Search

    将显示 Atlas Search 页面。

  1. 单击集群的对应 Browse Collections 按钮。

  2. 展开数据库并选择集合。

  3. 单击该集合的 Search Indexes 标签页。

    将显示 Atlas Search 页面。

  1. 单击集群的名称。

  2. 单击 Atlas Search 标签页。

    将显示 Atlas Search 页面。

3
4
  • 要获得引导式体验,请选择 Atlas Search Visual Editor

  • 要编辑原始索引定义,请选择 Atlas SearchJSON Editor

5
  1. Index Name 字段中输入 synonyms-tutorial

    如果将索引命名为 default,则在使用 $search 管道阶段时无需指定 index 参数。如果您为索引指定了自定义名称,则必须在 index 参数中指定此名称。

  2. Database and Collection(数据库和集合)部分中找到 sample_mflix 数据库,然后选择 movies 集合。

6

要仅运行简单的样本查询,请使用下面的单同义词映射标签页中的索引定义。如果有 M10 或更高级别的集群,并且加载了两个样本同义词源集合,则可以使用在下面的多个同义词映射标签页中指定多个同义词映射的索引定义来运行简单和高级样本查询。

以下索引定义指定:

  • 语言分析器 lucene.english 作为索引和查询 title 字段的默认分析器。

  • 名称 transportSynonyms 作为此同义词映射的名称。

  • transport_synonyms 集合作为源同义词集合,用于使用 transportSynonyms 映射查找用于查询的同义词。transportSynonyms 可用于对使用 lucene.english 分析器编制索引的任何字段(在本示例中包括 title 字段)的文本查询。

  1. 单击 Next(连接)。

  2. 单击 Refine Your Index(连接)。

  3. 单击 Field Mappings 部分中的 Add Field

  4. 单击 Customized Configuration(连接)。

  5. Add Field Mapping 窗口中配置以下字段,然后点击 Add

    用户界面字段名称
    配置
    Field Name
    输入 title
    Enable Dynamic Mapping
    切换到 Off
    Data Type Configuration
    1. 单击 Add Data Type(连接)。

    2. 选择 String

    3. 对于 Index AnalyzerSearch Analyzer,点击下拉列表以从 lucene.language 分析器下拉列表中选择 lucene.english

    对于上面未列出的所有其他字段,接受默认值。

  6. 单击 Synonym Mappings 部分中的 Add Synonym Mapping

  7. Add Synonym Mapping 窗口中配置以下字段,然后点击 Add

    用户界面字段名称
    配置
    Synonym Mapping Name
    输入 transportSynonyms
    Synonym Source Collection
    选择 transport_synonyms
    Analyzer
    选择 lucene.english
  8. 单击 Save Changes(连接)。

  1. 将默认索引定义替换为以下索引定义。

    {
    "mappings": {
    "dynamic": false,
    "fields": {
    "title": {
    "analyzer": "lucene.english",
    "type": "string"
    }
    }
    },
    "synonyms": [
    {
    "analyzer": "lucene.english",
    "name": "transportSynonyms",
    "source": {
    "collection": "transport_synonyms"
    }
    }
    ]
    }
  2. 单击 Next(连接)。

以下索引定义指定:

  • 语言分析器 lucene.standard 作为索引和查询 title 字段的默认分析器。

  • 名称 transportSynonymsattireSynonyms 作为同义词映射的名称。

  • transport_synonyms 集合作为源同义词集合,用于使用 transportSynonyms 映射查找用于查询的同义词。transportSynonyms 可用于对使用 lucene.standard 分析器编制索引的任何字段(在本教程的此示例查询中包括 title 字段)的文本查询。

  • attire_synonyms 集合作为源同义词集合,用于使用 attireSynonyms 映射查找用于查询的同义词。attireSynonyms 可用于对使用 lucene.standard 分析器编制索引的任何字段(在本示例中包括 title 字段)的文本查询。

  1. 单击 Next(连接)。

  2. 单击 Refine Your Index(连接)。

  3. 单击 Field Mappings 部分中的 Add Field

  4. Add Field Mapping 窗口中配置以下字段,然后点击 Add

    用户界面字段名称
    配置
    Field Name
    输入 title
    Enable Dynamic Mapping
    切换到 Off
    Data Type Configuration
    1. 选择 String

    2. 对于 Index AnalyzerSearch Analyzer,点击下拉列表以从 lucene.language 分析器下拉列表中选择 lucene.english

    对于上面未列出的所有其他字段,接受默认值。

  5. 单击 Synonym Mappings 部分中的 Add Synonym Mapping

  6. Add Synonym Mapping 窗口中配置以下字段,然后点击 Add

    用户界面字段名称
    配置
    Synonym Mapping Name
    输入 transportSynonyms
    Synonym Source Collection
    选择 transport_synonyms
    Analyzer
    选择 lucene.english
  7. Synonym Mappings 部分中再次单击 Add Synonym Mapping

  8. Add Synonym Mapping 窗口中配置以下字段,然后点击 Add

    用户界面字段名称
    配置
    Synonym Mapping Name
    输入 attireSynonyms
    Synonym Source Collection
    选择 attire_synonyms
    Analyzer
    选择 lucene.english
  9. 单击 Save Changes(连接)。

  1. 将默认索引定义替换为以下索引定义。

    {
    "mappings": {
    "dynamic": false,
    "fields": {
    "title": {
    "analyzer": "lucene.english",
    "type": "string"
    }
    }
    },
    "synonyms": [
    {
    "analyzer": "lucene.english",
    "name": "transportSynonyms",
    "source": {
    "collection": "transport_synonyms"
    }
    },
    {
    "analyzer": "lucene.english",
    "name": "attireSynonyms",
    "source": {
    "collection": "attire_synonyms"
    }
    }
    ]
    }
  2. 单击 Next(连接)。

7
8

此时将显示一个模态窗口,让您知道索引正在构建中。点击 Close 按钮。

9

构建索引大约需要一分钟时间。在构建时,Status 列显示 Build in Progress。构建完成后,Status 列显示 Active


➤ 使用选择语言下拉菜单设置本节中示例的语言。


同义词只能在使用 text 操作符的查询中使用。在本部分中,用户将连接到 Atlas 集群,然后使用 text 操作符针对 sample_mflix.movies 集合中的 title 字段运行样本查询。样本查询使用配置为同义词源集合中不同映射类型的同义词的单词。查询使用的同义词映射中引用了该源集合。

1
  1. 如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含所需项目的组织。

  2. 如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。

  3. 如果尚未显示,请单击侧边栏中的Clusters

    会显示集群页面。

2

您可以从侧边栏、 Data Explorer 或集群详细信息页面转到 Atlas Search 页面。

  1. 在侧边栏中,单击 Services 标题下的 Atlas Search

  2. Select data source 下拉菜单中选择您的集群并单击 Go to Atlas Search

    将显示 Atlas Search 页面。

  1. 单击集群的对应 Browse Collections 按钮。

  2. 展开数据库并选择集合。

  3. 单击该集合的 Search Indexes 标签页。

    将显示 Atlas Search 页面。

  1. 单击集群的名称。

  2. 单击 Atlas Search 标签页。

    将显示 Atlas Search 页面。

3

单击要查询的索引右侧的 Query 按钮。

4

单击 Edit Query 以查看 JSON 格式的默认查询语法示例。

5

如果使用单个同义词映射定义创建了索引,从以下简单示例标签页运行查询。如果在索引中定义多个同义词映射,则可以从以下两个标签页运行查询。

以下查询:

  • 排除 title 字段之外的所有字段。

  • 添加名为 score 的字段。

Atlas Search 查询结果根据同义词源集合中定义的单词映射类型而有所不同。

以下查询在 title 字段中搜索 automobile,并使用 transportSynonyms 同义词映射定义来搜索您在 transport_synonyms 同义词源集合中配置的 automobile 的同义词。

[
{
$search: {
index: "synonyms-tutorial",
text: {
path: "title",
query: "automobile",
synonyms: "transportSynonyms"
}
}
}
]
SCORE: 4.197734832763672 _id: “573a13a9f29313caabd1f18a”
fullplot: "While traveling to California for the dispute of the final race of the…"
imdb: Object
year: 2006
...
title: "Cars"
SCORE: 3.8511905670166016 _id: “573a1398f29313caabcea94c”
plot: "A man must struggle to travel home for Thanksgiving with an obnoxious …"
genres: Array
runtime: 93
...
title: "Planes, Trains, and Automobiles"
SCORE: 3.39473032951355 _id: “573a1397f29313caabce5fb0”
plot: "Car Wash is about a close-knit group of employees who one day have all…"
genres: Array
runtime: 97
...
title: "Car Wash"
SCORE: 3.39473032951355 _id: “573a1397f29313caabce7bd2”
plot: "When the owner of a struggling used car lot is killed, it's up to the …"
genres: Array
runtime: 113
...
title: "Used Cars"
SCORE: 3.39473032951355 _id: “573a13a6f29313caabd18bfe”
fullplot: "Gifted 18-year-old Meg has been abandoned by her father and neglected …"
imdb: Object
year: 2002
...
title: "Blue Car"
SCORE: 3.39473032951355 _id: “573a13c1f29313caabd64e3d”
fullplot: "After Mater gets his best friend, star race car Lightning McQueen, a s…"
imdb: Object
year: 2011
...
title: "Cars 2"
SCORE: 3.39473032951355 _id: “573a13eaf29313caabdce62c”
plot: "A rebellious teenager navigates his way through the juvenile court sys…"
genres: Array
runtime: 94
...
title: "Stealing Cars"
SCORE: 3.39473032951355 _id: “573a13f1f29313caabddc93f”
plot: "A small town sheriff sets out to find the two kids who have taken his …"
genres: Array
runtime: 86
...
title: "Cop Car"
SCORE: 2.8496146202087402 _id: “573a1396f29313caabce5480”
plot: "The small town of Paris, Australia deliberately causes car accidents, …"
genres: Array
runtime: 91
...
title: "The Cars That Eat People"
SCORE: 2.8496146202087402 _id: “573a139df29313caabcf9636”
plot: "Military doctor General Klenski is arrested in Stalin's Russia in 1953…"
genres: Array
runtime: 137
...
title: "Khrustalyov, My Car!"

Atlas Search 结果包含在 title 字段中带有 carautomobile 的电影,尽管查询术语是 automobile,因为我们在名为 sample_synonyms 的同义词来源集合中将 automobile 配置为 carvehicleautomobile 的同义词,该集合在索引中指定。Atlas Search 对于单词 carvehicle 的搜索返回相同的结果。要对此进行测试,将上面查询中的 query 字段的值替换为 carvehicle,然后运行查询。

以下查询在 title 字段中搜索 boat,并使用 transportSynonyms 同义词映射定义来搜索您在 transport_synonyms 同义词源集合中配置的 boat 的同义词。

[
{
$search: {
index: "synonyms-tutorial",
text: {
path: "title",
query: "boat",
synonyms: "transportSynonyms"
}
}
}
]
SCORE: 5.373150825500488 _id: “573a13e9f29313caabdcd013”
plot: "A fearless sea captain sails a ship through loopholes in international…"
genres: Array
runtime: 90
...
title: "Vessel"
SCORE: 4.589139938354492 _id: “573a13e8f29313caabdc9e72”
countries: Array
genres: Array
runtime: 7
...
title: "Boats"
SCORE: 4.3452959060668945 _id: “573a1398f29313caabce90b6”
plot: "In 1914, a luxury ship leaves Italy in order to scatter the ashes of a…"
genres: Array
runtime: 128
...
title: "And the Ship Sails On"
SCORE: 4.3452959060668945 _id: “573a139cf29313caabcf7c75”
plot: "A young Pennsylvania man moves to Los Angeles to begin work for an amb…"
genres: Array
runtime: 90
...
title: "Broken Vessels"
SCORE: 4.3452959060668945 _id: “573a13f0f29313caabdda2dd”
plot: "A young man struggling with the death of his parents meets an extrover…"
genres: Array
runtime: 80
...
title: "Sailing to Paradise"
SCORE: 3.711261749267578 _id: “573a1397f29313caabce8796”
plot: "A Japanese photojournalist revisits Vietnam after the Liberation and l…"
genres: Array
runtime: 109
...
title: "Boat People"
SCORE: 3.711261749267578 _id: “573a13a6f29313caabd17a98”
plot: "Two straight men mistakenly end up on a "gays only" cruise."
genres: Array
runtime: 94
...
title: "Boat Trip"
SCORE: 3.1153182983398438 _id: “573a1394f29313caabce036c”
plot: "Three London gentlemen take vacation rowing down the Thames, encounter…"
genres: Array
runtime: 84
...
title: "Three Men in a Boat"
SCORE: 3.1153182983398438 _id: “573a1395f29313caabce2c28”
plot: "After a series of misunderstandings, the head of an aerospace research…"
genres: Array
runtime: 110
...
title: "The Glass Bottom Boat"
SCORE: 3.1153182983398438 _id: “573a13c2f29313caabd68772”
fullplot: "Jack is a shy and awkward man who drives a limo and lives an unassumin…"
imdb: Object
runtime: 2010
...
title: "Jack Goes Boating"

Atlas Search 搜索结果包含 title 字段中具有 boatvesselsail 的电影,因为我们在名为 sample_synonyms 的同义词源集合中将 boatvesselsail 配置为boat 的同义词,该集合在集合的索引中指定。

Atlas Search 仅在结果中搜索单词 vessel 时返回以下文档

{ "title" : "Vessel", "score" : 5.373150825500488 }
{ "title" : "Broken Vessels", "score" : 4.3452959060668945 }

Atlas Search 不包括结果中 title 字段中带有 boatsail 的文档,因为我们没有将 vessel 配置为同义词源集合中 boatsail 的同义词。要对此进行测试,将上面查询中的 query 字段的值替换为 vessel,然后再次运行查询。

同样,Atlas Search 仅在搜索词 sail 的结果中返回以下文档:

{ "title" : "And the Ship Sails On", "score" : 4.3452959060668945 }
{ "title" : "Sailing to Paradise", "score" : 4.3452959060668945 }

Atlas Search 不包括结果中 title 字段中带有 boatvessel 的文档,因为我们没有将 sail 配置为同义词源集合中 boatvessel 的同义词。要测试此示例,请将上述查询中 query 字段的值替换为 sail,然后再次运行查询。

Atlas Search 查询结果根据同义词源集合中定义的单词映射类型而有所不同。

以下查询在 title 字段中搜索 automobile,并使用 transportSynonyms 同义词映射定义来搜索您在 transport_synonyms 同义词源集合中配置的 automobile 的同义词。此外,该查询还会在 title 字段中搜索 attire,并使用 attireSynonyms 同义词映射定义来搜索您在 attire_synonyms 同义词源集合中配置的 attire 的同义词。

[
{
$search: {
"index": "synonyms-tutorial",
"compound": {
"should": [{
"text": {
"path": "title",
"query": "automobile",
"synonyms": "transportSynonyms"
}
},
{
"text": {
"path": "title",
"query": "attire",
"synonyms": "attireSynonyms"
}
}]
}
}
}
]
SCORE: 4.812004089355469 _id: “573a139af29313caabcf003f”
plot: "The Dress is a tale filled with sex, violence, comedy and drama as it …"
genres: Array
runtime: 103
...
title: "The Dress"
SCORE: 4.197734832763672 _id: “573a13a9f29313caabd1f18a”
fullplot: "While traveling to California for the dispute of the final race of the…"
imdb: Object
year: 2006
...
title: "Cars"
SCORE: 3.891493320465088 _id: “573a1397f29313caabce77cd”
plot: "A mysterious blonde woman kills one of a psychiatrist's patients, and …"
genres: Array
runtime: 105
...
title: "Dressed to Kill"
SCORE: 3.891493320465088 _id: “573a13bcf29313caabd57e07”
fullplot: "Two things about Jane: she never says no to her friends (she's been a …"
imdb Object
year: 2008
...
title: "27 Dresses"
SCORE: 3.8511905670166016 _id: “573a1398f29313caabcea94c”
plot: "A man must struggle to travel home for Thanksgiving with an obnoxious …"
genres: Array
runtime: 93
...
title: "Planes, Trains, and Automobiles"
SCORE: 3.39473032951355 _id: “573a1397f29313caabce5fb0”
plot: "Car Wash is about a close-knit group of employees who one day have all…"
genres: Array
runtime: 97
...
title: "Car Wash"
SCORE: 3.39473032951355 _id: “573a1397f29313caabce7bd2”
plot: "When the owner of a struggling used car lot is killed, it's up to the …"
genres: Array
runtime: 113
...
title: "Used Cars"
SCORE: 3.39473032951355 _id: “573a13a6f29313caabd18bfe”
fullplot: "Gifted 18-year-old Meg has been abandoned by her father and neglected …"
imdb: Object
year: 2002
...
title: "Blue Car"
SCORE: 3.39473032951355 _id: “573a13c1f29313caabd64e3d”
fullplot: "After Mater gets his best friend, star race car Lightning McQueen, a s…"
imdb: Object
year: 2011
...
title: "Cars 2"
SCORE: 3.39473032951355 _id: “573a13eaf29313caabdce62c”
plot: "A rebellious teenager navigates his way through the juvenile court sys…"
genres: Array
runtime: 94
...
title: "Stealing Cars"

Atlas Search 结果包含两个搜索术语的文档。结果包含查询术语 automobiletitle 字段中带有 car 的电影,因为我们将 automobile 配置为名为carvehicleautomobile 的同义词源集合中的同义词 transport_synonyms。结果还包含查询术语 attire 的标题字段中带有 dress 的电影,因为我们将 attire 配置为名为 attire_synonyms 的同义词源集合中的dressapparelattire 的同义词。

Atlas Search 在 transport_synonyms 源集合中搜索 carvehicle 以及在 attire_synonyms 源集合中搜索 dressapparel 会返回相同的结果。要测试此示例,将上述查询中 query 字段的值替换为 carvehicle,并将上述查询中 query 字段的值替换为 dressapparel,然后再次运行查询。

以下查询在 title 字段中搜索 boat,并使用 transportSynonyms 同义词映射定义来搜索您在 transport_synonyms 同义词源集合中配置的 boat 的同义词。此外,该查询还会在 title 字段中搜索 hat,并使用 attireSynonyms 同义词映射定义来搜索您在 attire_synonyms 同义词源集合中配置的 hat 的同义词。

[
{
$search: {
index: "synonyms-tutorial",
compound: {
should: [{
text: {
path: "title",
query: "boat",
synonyms: "transportSynonyms"
}
},
{
text: {
path: "title",
query: "hat",
synonyms: "attireSynonyms"
}
}]
}
}
}
]
SCORE: 5.673145294189453 _id: “573a1397f29313caabce6bed”
plot: "Down-on-his-luck Hollywood producer Barry 'Dutch' Detweiler attempts t…"
genres: Array
runtime: 114
...
title: "Fedora"
SCORE: 5.373150825500488 _id: “573a13e9f29313caabdcd013”
plot: "A fearless sea captain sails a ship through loopholes in international…"
genres: Array
runtime: 90
...
title: "Vessel"
SCORE: 4.589139938354492 _id: “573a13e8f29313caabdc9e72”
countries: Array
genres: Array
runtime: 7
...
title: "Boats"
SCORE: 4.3452959060668945 _id: “573a1398f29313caabce90b6”
plot: "In 1914, a luxury ship leaves Italy in order to scatter the ashes of a…"
genres: Array
runtime: 128
...
title: "And the Ship Sails On"
SCORE: 4.3452959060668945 _id: “573a139cf29313caabcf7c75”
plot: "A young Pennsylvania man moves to Los Angeles to begin work for an amb…"
genres: Array
runtime: 90
...
title: "Broken Vessels"
SCORE: 4.3452959060668945 _id: “573a13f0f29313caabdda2dd”
plot: "A young man struggling with the death of his parents meets an extrover…"
genres: Array
runtime: 80
...
title: "Sailing to Paradise"
SCORE: 4.066137313842773 _id: “573a1392f29313caabcdaae8”
plot: "An American dancer comes to Britain and falls for a model whom he init…"
genres: Array
runtime: 101
...
title: "Top Hat"
SCORE: 4.066137313842773 _id: “573a1394f29313caabce05e8”
plot: "A Korean War veteran's morphine addiction wreaks havoc upon his family…"
genres: Array
runtime: 109
...
title: "A Hatful of Rain"
SCORE: 3.711261749267578 _id: “573a1397f29313caabce8796”
plot: "A Japanese photojournalist revisits Vietnam after the Liberation and l…"
genres: Array
runtime: 109
...
title: "Boat People"
SCORE: 3.711261749267578 _id: “573a13a6f29313caabd17a98”
plot: "Two straight men mistakenly end up on a "gays only" cruise."
genres: Array
runtime: 94
...
title: "Boat Trip"

Atlas Search 结果包含两个搜索术语的文档。结果包含查询术语 boattitle 字段中带有 vesselboatsail 的电影,因为我们将 boat 配置为名为 transport_synonyms 的同义词源集合中的 boatvesselsail 的同义词。

Atlas Search 不包括搜索结果中 title 字段中带有 boatsail 的文档 vessel,因为我们没有将 vessel 配置为同义词来源集合中 boatsail 的同义词。同样,Atlas Search 不会在搜索词 sail 的结果中包含 title 字段中包含 boatvessel 的文档,因为我们没有将 sail 配置为同义词源集合中的 boatvessel。要测试这些示例,请将上述查询中 query 字段的值替换为 vesselsail,然后再次运行查询。

结果还包含查询词 hat 的标题字段中带有 fedorahat 的电影,因为我们将 hat 配置为名为 attire_synonyms 的同义词源集合中的 hatfedoraheadgear 的同义词。

Atlas Search 不包括搜索结果中 title 字段中带有 hatfedora 的文档 headgear,因为我们没有将 headgear 配置为同义词来源集合中 hatfedora 的同义词。同样,Atlas Search 不会在搜索词 fedora 的结果中包含 title 字段中包含 hatheadgear 的文档,因为我们没有将 fedora 配置为同义词源集合中的 hatheadgear。要测试这些示例,请将上述查询中 query 字段的值替换为 fedoraheadgear,然后再次运行查询。

6

Search Tester 可能不会显示其所返回文档的所有字段。要查看所有字段,包括在查询路径中指定的字段,请展开结果中的文档。

1

在终端窗口中打开mongosh并连接到集群。 有关连接的详细说明,请参阅通过mongosh连接。

2

mongosh 提示符下运行以下命令:

use sample_mflix
3

如果使用单个同义词映射定义创建了索引,请从以下简单示例标签页运行查询。如果在索引中定义多个同义词映射,则可以从以下两个标签页运行查询。

这些查询使用了下列管道阶段:

  • $search 搜索集合阶段。

  • $limit 阶段将输出限制为 10 个结果。

  • $project 阶段到:

    • 排除 title 字段之外的所有字段。

    • 添加名为 score 的字段。

Atlas Search 查询结果根据同义词源集合中定义的单词映射类型而有所不同。

该查询还会在 title 字段中搜索单词 automobile,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 automobile 的同义词的单词。

db.movies.aggregate([
{
$search: {
"index": "synonyms-tutorial",
"text": {
"path": "title",
"query": "automobile",
"synonyms": "transportSynonyms"
}
}
},
{
$limit: 10
},
{
$project: {
"_id": 0,
"title": 1,
"score": { $meta: "searchScore" }
}
}
])
{ "title" : "Cars", "score" : 4.197734832763672 }
{ "title" : "Planes, Trains & Automobiles", "score" : 3.8511905670166016 }
{ "title" : "Car Wash", "score" : 3.39473032951355 }
{ "title" : "Used Cars", "score" : 3.39473032951355 }
{ "title" : "Blue Car", "score" : 3.39473032951355 }
{ "title" : "Cars 2", "score" : 3.39473032951355 }
{ "title" : "Stealing Cars", "score" : 3.39473032951355 }
{ "title" : "Cop Car", "score" : 3.39473032951355 }
{ "title" : "The Cars That Eat People", "score" : 2.8496146202087402 }
{ "title" : "Khrustalyov, My Car!", "score" : 2.8496146202087402 }

Atlas Search 结果包含在 title 字段中带有 carautomobile 的电影,尽管查询术语是 automobile,因为我们在名为 sample_synonyms 的同义词来源集合中将 automobile 配置为 carvehicleautomobile 的同义词,该集合在索引中指定。Atlas Search 对于单词 carvehicle 的搜索返回相同的结果。要对此进行测试,将上面查询中的 query 字段的值替换为 carvehicle,然后运行查询。

该查询还会在 title 字段中搜索单词 boat,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 boat 的同义词的单词。

db.movies.aggregate([
{
$search: {
"index": "synonyms-tutorial",
"text": {
"path": "title",
"query": "boat",
"synonyms": "transportSynonyms"
}
}
},
{
$limit: 10
},
{
$project: {
"_id": 0,
"title": 1,
"score": { $meta: "searchScore" }
}
}
])
{ "title" : "Vessel", "score" : 5.373150825500488 }
{ "title" : "Boats", "score" : 4.589139938354492 }
{ "title" : "And the Ship Sails On", "score" : 4.3452959060668945 }
{ "title" : "Broken Vessels", "score" : 4.3452959060668945 }
{ "title" : "Sailing to Paradise", "score" : 4.3452959060668945 }
{ "title" : "Boat People", "score" : 3.711261749267578 }
{ "title" : "Boat Trip", "score" : 3.711261749267578 }
{ "title" : "Three Men in a Boat", "score" : 3.1153182983398438 }
{ "title" : "The Glass Bottom Boat", "score" : 3.1153182983398438 }
{ "title" : "Jack Goes Boating", "score" : 3.1153182983398438 }

Atlas Search 搜索结果包含 title 字段中具有 boatvesselsail 的电影,因为我们在名为 sample_synonyms 的同义词源集合中将 boatvesselsail 配置为boat 的同义词,该集合在集合的索引中指定。

Atlas Search 仅在结果中搜索单词 vessel 时返回以下文档

{ "title" : "Vessel", "score" : 5.373150825500488 }
{ "title" : "Broken Vessels", "score" : 4.3452959060668945 }

Atlas Search 不包括结果中 title 字段中带有 boatsail 的文档,因为我们没有将 vessel 配置为同义词源集合中 boatsail 的同义词。要对此进行测试,将上面查询中的 query 字段的值替换为 vessel,然后再次运行查询。

同样,Atlas Search 仅在搜索词 sail 的结果中返回以下文档:

{ "title" : "And the Ship Sails On", "score" : 4.3452959060668945 }
{ "title" : "Sailing to Paradise", "score" : 4.3452959060668945 }

Atlas Search 不包括结果中 title 字段中带有 boatvessel 的文档,因为我们没有将 sail 配置为同义词源集合中 boatvessel 的同义词。要测试此示例,请将上述查询中 query 字段的值替换为 sail,然后再次运行查询。

Atlas Search 查询结果根据同义词源集合中定义的单词映射类型而有所不同。

该查询还会在 title 字段中搜索单词 automobile,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 automobile 的同义词的单词。该查询还会在 title 字段中搜索单词 attire,并使用名为 attireSynonyms 的同义词映射定义在名为 attire_synonyms 的同义词源集合中搜索配置为查询单词 attire 的同义词的单词。

db.movies.aggregate([
{
$search: {
"index": "synonyms-tutorial",
"compound": {
"should": [{
"text": {
"path": "title",
"query": "automobile",
"synonyms": "transportSynonyms"
}
},
{
"text": {
"path": "title",
"query": "attire",
"synonyms": "attireSynonyms"
}
}]
}
}
},
{
$limit: 10
},
{
$project: {
"_id": 0,
"title": 1,
"score": { $meta: "searchScore" }
}
}
])
[
{ title: 'The Dress', score: 4.812004089355469 },
{ title: 'Cars', score: 4.197734832763672 },
{ title: 'Dressed to Kill', score: 3.891493320465088 },
{ title: '27 Dresses', score: 3.891493320465088 },
{ title: 'Planes, Trains & Automobiles', score: 3.8511905670166016 },
{ title: 'Car Wash', score: 3.39473032951355 },
{ title: 'Used Cars', score: 3.39473032951355 },
{ title: 'Blue Car', score: 3.39473032951355 },
{ title: 'Cars 2', score: 3.39473032951355 },
{ title: 'Stealing Cars', score: 3.39473032951355 }
]

Atlas Search 结果包含两个搜索术语的文档。结果包含查询术语 automobiletitle 字段中带有 car 的电影,因为我们将 automobile 配置为名为carvehicleautomobile 的同义词源集合中的同义词 transport_synonyms。结果还包含查询术语 attire 的标题字段中带有 dress 的电影,因为我们将 attire 配置为名为 attire_synonyms 的同义词源集合中的dressapparelattire 的同义词。

Atlas Search 在 transport_synonyms 源集合中搜索 carvehicle 以及在 attire_synonyms 源集合中搜索 dressapparel 会返回相同的结果。要测试此示例,将上述查询中 query 字段的值替换为 carvehicle,并将上述查询中 query 字段的值替换为 dressapparel,然后再次运行查询。

该查询还会在 title 字段中搜索单词 boat,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 boat 的同义词的单词。该查询还会在 title 字段中搜索单词 hat,并使用名为 attireSynonyms 的同义词映射定义在名为 attire_synonyms 的同义词源集合中搜索配置为查询单词 hat 的同义词的单词。

db.movies.aggregate([
{
$search: {
"index": "synonyms-tutorial",
"compound": {
"should": [{
"text": {
"path": "title",
"query": "boat",
"synonyms": "transportSynonyms"
}
},
{
"text": {
"path": "title",
"query": "hat",
"synonyms": "attireSynonyms"
}
}]
}
}
},
{
$limit: 10
},
{
$project: {
"_id": 0,
"title": 1,
"score": { $meta: "searchScore" }
}
}
])
[
{ title: 'Fedora', score: 5.673145294189453 },
{ title: 'Vessel', score: 5.373150825500488 },
{ title: 'Boats', score: 4.589139938354492 },
{ title: 'And the Ship Sails On', score: 4.3452959060668945 },
{ title: 'Broken Vessels', score: 4.3452959060668945 },
{ title: 'Sailing to Paradise', score: 4.3452959060668945 },
{ title: 'Top Hat', score: 4.066137313842773 },
{ title: 'A Hatful of Rain', score: 4.066137313842773 },
{ title: 'Boat People', score: 3.711261749267578 },
{ title: 'Boat Trip', score: 3.711261749267578 }
]

Atlas Search 结果包含两个搜索术语的文档。结果包含查询术语 boattitle 字段中带有 vesselboatsail 的电影,因为我们将 boat 配置为名为 transport_synonyms 的同义词源集合中的 boatvesselsail 的同义词。

Atlas Search 不包括搜索结果中 title 字段中带有 boatsail 的文档 vessel,因为我们没有将 vessel 配置为同义词来源集合中 boatsail 的同义词。同样,Atlas Search 不会在搜索词 sail 的结果中包含 title 字段中包含 boatvessel 的文档,因为我们没有将 sail 配置为同义词源集合中的 boatvessel。要测试这些示例,请将上述查询中 query 字段的值替换为 vesselsail,然后再次运行查询。

结果还包含查询词 hat 的标题字段中带有 fedorahat 的电影,因为我们将 hat 配置为名为 attire_synonyms 的同义词源集合中的 hatfedoraheadgear 的同义词。

Atlas Search 不包括搜索结果中 title 字段中带有 hatfedora 的文档 headgear,因为我们没有将 headgear 配置为同义词来源集合中 hatfedora 的同义词。同样,Atlas Search 不会在搜索词 fedora 的结果中包含 title 字段中包含 hatheadgear 的文档,因为我们没有将 fedora 配置为同义词源集合中的 hatheadgear。要测试这些示例,请将上述查询中 query 字段的值替换为 fedoraheadgear,然后再次运行查询。

1

打开 MongoDB Compass 并连接到您的集群。有关连接的详细说明,请参阅通过 Compass 连接。

2

Database 屏幕上,依次单击 sample_mflix 数据库和 movies 集合。

3

Atlas Search 查询结果根据同义词源集合中定义的单词映射类型而有所不同。

该查询还会在 title 字段中搜索单词 automobile,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 automobile 同义词的单词。查询包括以下阶段:

  • $limit 阶段将输出限制为 10 个结果。

  • $project 阶段排除 title 之外的所有字段,并添加一个名为 score 的字段。

若要在 MongoDB Compass 中运行此查询:

  1. 单击 Aggregations 标签页。

  2. 单击 Select...,然后从下拉菜单中选择阶段并为该阶段添加查询,以配置以下每个管道阶段。单击 Add Stage 以添加其他阶段。

    管道阶段
    查询
    $search
    {
    "index": "synonyms-tutorial",
    "text": {
    "path": "title",
    "query": "automobile",
    "synonyms": "transportSynonyms"
    }
    }
    $limit
    10
    $project
    {
    "_id": 0,
    "title": 1,
    "score": { "$meta": "searchScore" }
    }

    如果已启用 Auto Preview,则 MongoDB Compass 将在 $project 管道阶段旁边显示以下文档:

    {title Cars} {score 4.197734832763672}
    {title Planes, Trains & Automobiles} {score 3.8511905670166016}
    {title Car Wash} {score 3.39473032951355}
    {title Used Cars} {score 3.39473032951355}
    {title Blue Car} {score 3.39473032951355}
    {title Cars 2} {score 3.39473032951355}
    {title Stealing Cars} {score 3.39473032951355}
    {title Cop Car} {score 3.39473032951355}
    {title The Cars That Eat People} {score 2.8496146202087402}
    {title Khrustalyov, My Car!} {score 2.8496146202087402}

    Atlas Search 结果包含在 title 字段中带有 carautomobile 的电影,尽管查询术语是 automobile,因为我们在名为 sample_synonyms 的同义词来源集合中将 automobile 配置为 carvehicleautomobile 的同义词,该集合在索引中指定。Atlas Search 对于单词 carvehicle 的搜索返回相同的结果。要对此进行测试,将上面查询中的 query 字段的值替换为 carvehicle,然后运行查询。

该查询还会在 title 字段中搜索单词 boat,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 boat 同义词的单词。它包括以下阶段:

  • $limit 阶段将输出限制为 10 个结果。

  • $project 阶段排除 title 之外的所有字段,并添加一个名为 score 的字段。

若要在 MongoDB Compass 中运行此查询:

  1. 单击 Aggregations 标签页。

  2. 单击 Select...,然后从下拉菜单中选择阶段并为该阶段添加查询,以配置以下每个管道阶段。单击 Add Stage 以添加其他阶段。

    管道阶段
    查询
    $search
    {
    "index": "synonyms-tutorial",
    "text": {
    "path": "title",
    "query": "boat",
    "synonyms": "transportSynonyms"
    }
    }
    $limit
    10
    $project
    {
    "_id": 0,
    "title": 1,
    "score": { "$meta": "searchScore" }
    }

    如果已启用 Auto Preview,则 MongoDB Compass 将在 $project 管道阶段旁边显示以下文档:

    {title Vessel} {score 5.373150825500488}
    {title Boats} {score 4.589139938354492}
    {title And the Ship Sails On} {score 4.3452959060668945}
    {title Broken Vessels} {score 4.3452959060668945}
    {title Sailing to Paradise} {score 4.3452959060668945}
    {title Boat People} {score 3.711261749267578}
    {title Boat Trip} {score 3.711261749267578}
    {title Three Men in a Boat} {score 3.1153182983398438}
    {title The Glass Bottom Boat} {score 3.1153182983398438}
    {title Jack Goes Boating} {score 3.1153182983398438}

    Atlas Search 搜索结果包含 title 字段中具有 boatvesselsail 的电影,因为我们在名为 sample_synonyms 的同义词源集合中将 boatvesselsail 配置为boat 的同义词,该集合在集合的索引中指定。

    Atlas Search 仅在结果中搜索单词 vessel 时返回以下文档

    { "title" : "Vessel", "score" : 5.373150825500488 }
    { "title" : "Broken Vessels", "score" : 4.3452959060668945 }

    Atlas Search 不包括结果中 title 字段中带有 boatsail 的文档,因为我们没有将 vessel 配置为同义词源集合中 boatsail 的同义词。要对此进行测试,将上面查询中的 query 字段的值替换为 vessel,然后再次运行查询。

    同样,Atlas Search 仅在搜索词 sail 的结果中返回以下文档:

    { "title" : "And the Ship Sails On", "score" : 4.3452959060668945 }
    { "title" : "Sailing to Paradise", "score" : 4.3452959060668945 }

    Atlas Search 不包括结果中 title 字段中带有 boatvessel 的文档,因为我们没有将 sail 配置为同义词源集合中 boatvessel 的同义词。要测试此示例,请将上述查询中 query 字段的值替换为 sail,然后再次运行查询。

4

Atlas Search 查询结果根据同义词源集合中定义的单词映射类型而有所不同。

该查询还会在 title 字段中搜索单词 automobile,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 automobile 的同义词的单词。该查询还会在 title 字段中搜索单词 attire,并使用名为 attireSynonyms 的同义词映射定义在名为 attire_synonyms 的同义词源集合中搜索配置为查询单词 attire 的同义词的单词。

查询包括以下阶段:

  • $limit 阶段将输出限制为 10 个结果。

  • $project 阶段排除 title 之外的所有字段,并添加一个名为 score 的字段。

若要在 MongoDB Compass 中运行此查询:

  1. 单击 Aggregations 标签页。

  2. 单击 Select...,然后从下拉菜单中选择阶段并为该阶段添加查询,以配置以下每个管道阶段。单击 Add Stage 以添加其他阶段。

    管道阶段
    查询
    $search
    {
    "index": "synonyms-tutorial",
    "compound": {
    "should": [{
    "text": {
    "path": "title",
    "query": "automobile",
    "synonyms": "transportSynonyms"
    }
    },
    {
    "text": {
    "path": "title",
    "query": "attire",
    "synonyms": "attireSynonyms"
    }
    }]
    }
    }
    $limit
    10
    $project
    {
    "_id": 0,
    "title": 1,
    "score": { "$meta": "searchScore" }
    }

    如果已启用 Auto Preview,则 MongoDB Compass 将在 $project 管道阶段旁边显示以下文档:

    { title: 'The Dress', score: 4.812004089355469 },
    { title: 'Cars', score: 4.197734832763672 },
    { title: 'Dressed to Kill', score: 3.891493320465088 },
    { title: '27 Dresses', score: 3.891493320465088 },
    { title: 'Planes, Trains & Automobiles', score: 3.8511905670166016 },
    { title: 'Car Wash', score: 3.39473032951355 },
    { title: 'Used Cars', score: 3.39473032951355 },
    { title: 'Blue Car', score: 3.39473032951355 },
    { title: 'Cars 2', score: 3.39473032951355 },
    { title: 'Stealing Cars', score: 3.39473032951355 }

    Atlas Search 结果包含两个搜索术语的文档。结果包含查询术语 automobiletitle 字段中带有 car 的电影,因为我们将 automobile 配置为名为carvehicleautomobile 的同义词源集合中的同义词 transport_synonyms。结果还包含查询术语 attire 的标题字段中带有 dress 的电影,因为我们将 attire 配置为名为 attire_synonyms 的同义词源集合中的dressapparelattire 的同义词。

    Atlas Search 在 transport_synonyms 源集合中搜索 carvehicle 以及在 attire_synonyms 源集合中搜索 dressapparel 会返回相同的结果。要测试此示例,将上述查询中 query 字段的值替换为 carvehicle,并将上述查询中 query 字段的值替换为 dressapparel,然后再次运行查询。

该查询还会在 title 字段中搜索单词 boat,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 boat 的同义词的单词。该查询还会在 title 字段中搜索单词 hat,并使用名为 attireSynonyms 的同义词映射定义在名为 attire_synonyms 的同义词源集合中搜索配置为查询单词 hat 的同义词的单词。

查询包括以下阶段:

  • $limit 阶段将输出限制为 10 个结果。

  • $project 阶段排除 title 之外的所有字段,并添加一个名为 score 的字段。

若要在 MongoDB Compass 中运行此查询:

  1. 单击 Aggregations 标签页。

  2. 单击 Select...,然后从下拉菜单中选择阶段并为该阶段添加查询,以配置以下每个管道阶段。单击 Add Stage 以添加其他阶段。

    管道阶段
    查询
    $search
    {
    "index": "synonyms-tutorial",
    "compound": {
    "should": [{
    "text": {
    "path": "title",
    "query": "boat",
    "synonyms": "transportSynonyms"
    }
    },
    {
    "text": {
    "path": "title",
    "query": "hat",
    "synonyms": "attireSynonyms"
    }
    }]
    }
    }
    $limit
    10
    $project
    {
    "_id": 0,
    "title": 1,
    "score": { "$meta": "searchScore" }
    }

    如果已启用 Auto Preview,则 MongoDB Compass 将在 $project 管道阶段旁边显示以下文档:

    { title: 'Fedora', score: 5.673145294189453 },
    { title: 'Vessel', score: 5.373150825500488 },
    { title: 'Boats', score: 4.589139938354492 },
    { title: 'And the Ship Sails On', score: 4. 3452959060668945 },
    { title: 'Broken Vessels', score: 4.3452959060668945 },
    { title: 'Sailing to Paradise', score: 4.3452959060668945 },
    { title: 'Top Hat', score: 4.066137313842773 },
    { title: 'A Hatful of Rain', score: 4.066137313842773 },
    { title: 'Boat People', score: 3.711261749267578 },
    { title: 'Boat Trip', score: 3.711261749267578 }

    Atlas Search 结果包含两个搜索术语的文档。结果包含查询术语 boattitle 字段中带有 vesselboatsail 的电影,因为我们将 boat 配置为名为 transport_synonyms 的同义词源集合中的 boatvesselsail 的同义词。

    Atlas Search 不包括搜索结果中 title 字段中带有 boatsail 的文档 vessel,因为我们没有将 vessel 配置为同义词来源集合中 boatsail 的同义词。同样,Atlas Search 不会在搜索词 sail 的结果中包含 title 字段中包含 boatvessel 的文档,因为我们没有将 sail 配置为同义词源集合中的 boatvessel。要测试这些示例,请将上述查询中 query 字段的值替换为 vesselsail,然后再次运行查询。

    结果还包含查询词 hat 的标题字段中带有 fedorahat 的电影,因为我们将 hat 配置为名为 attire_synonyms 的同义词源集合中的 hatfedoraheadgear 的同义词。

    Atlas Search 不包括搜索结果中 title 字段中带有 hatfedora 的文档 headgear,因为我们没有将 headgear 配置为同义词来源集合中 hatfedora 的同义词。同样,Atlas Search 不会在搜索词 fedora 的结果中包含 title 字段中包含 hatheadgear 的文档,因为我们没有将 fedora 配置为同义词源集合中的 hatheadgear。要测试这些示例,请将上述查询中 query 字段的值替换为 fedoraheadgear,然后再次运行查询。

1

这些代码示例执行以下任务:

  • 导入mongodb包和依赖项。

  • 建立与您的 Atlas 集群的连接。

  • 遍历游标以打印与查询匹配的文档。

Atlas Search 查询结果根据同义词源集合中定义的单词映射类型而有所不同。

  1. 创建一个名为 synonyms-equivalent-query.go 的文件。

  2. 将代码示例复制并粘贴到 synonyms-equivalent-query.go 文件中。

    该代码示例包含以下阶段:

    • $search 阶段,在 title 字段中搜索单词 automobile,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 automobile 同义词的单词。

    • $limit 阶段用于将输出限制为 10 个结果。

    • $project 阶段排除除 title 之外的所有字段,并添加一个名为 score 的字段。

    1package main
    2
    3import (
    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
    14type MovieCollection struct {
    15 title string `bson:"Title,omitempty"`
    16}
    17
    18func 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.D{{"index", "synonyms-tutorial"}, {"text", bson.D{{"path", "title"}, {"query", "automobile"}, {"synonyms", "transportSynonyms"}}}}}}
    31 limitStage := bson.D{{"$limit", 10}}
    32 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"_id", 0}, {"score", bson.D{{"$meta", "searchScore"}}}}}}
    33 // specify the amount of time the operation can run on the server
    34 opts := options.Aggregate().SetMaxTime(5 * time.Second)
    35 // run pipeline
    36 cursor, err := collection.Aggregate(ctx, mongo.Pipeline{searchStage, limitStage, projectStage}, opts)
    37 if err != nil {
    38 panic(err)
    39 }
    40 // print results
    41 var results []bson.D
    42 if err = cursor.All(context.TODO(), &results); err != nil {
    43 panic(err)
    44 }
    45 for _, result := range results {
    46 fmt.Println(result)
    47 }
    48}
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。

  4. 运行以下命令来查询您的集合:

    go run synonyms-equivalent-query.go

    当您运行 synonyms-equivalent-query.go 时,程序会将以下文档打印到您的终端:

    [{title Cars} {score 4.197734832763672}]
    [{title Planes, Trains & Automobiles} {score 3.8511905670166016}]
    [{title Car Wash} {score 3.39473032951355}]
    [{title Used Cars} {score 3.39473032951355}]
    [{title Blue Car} {score 3.39473032951355}]
    [{title Cars 2} {score 3.39473032951355}]
    [{title Stealing Cars} {score 3.39473032951355}]
    [{title Cop Car} {score 3.39473032951355}]
    [{title The Cars That Eat People} {score 2.8496146202087402}]
    [{title Khrustalyov, My Car!} {score 2.8496146202087402}]

    Atlas Search 结果包含在 title 字段中带有 carautomobile 的电影,尽管查询术语是 automobile,因为我们在名为 sample_synonyms 的同义词来源集合中将 automobile 配置为 carvehicleautomobile 的同义词,该集合在索引中指定。Atlas Search 对于单词 carvehicle 的搜索返回相同的结果。要对此进行测试,将上面查询中的 query 字段的值替换为 carvehicle,然后运行查询。

  1. 创建一个名为 synonyms-explicit-query.go 的文件。

  2. 将代码示例复制并粘贴到 synonyms-explicit-query.go 文件中。

    该代码示例包含以下阶段:

    • $search 阶段,在 title 字段中搜索单词 boat,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 boat 同义词的单词。

    • $limit 阶段用于将输出限制为 10 个结果。

    • $project 阶段排除除 title 之外的所有字段,并添加一个名为 score 的字段。

    1package main
    2
    3import (
    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
    14type MovieCollection struct {
    15 title string `bson:"Title,omitempty"`
    16}
    17
    18func 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.D{{"text", bson.D{{"index", "synonyms-tutorial"}, {"path", "title"}, {"query", "boat"}, {"synonyms", "transportSynonyms"}}}}}}
    31 limitStage := bson.D{{"$limit", 10}}
    32 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"_id", 0}, {"score", bson.D{{"$meta", "searchScore"}}}}}}
    33 // specify the amount of time the operation can run on the server
    34 opts := options.Aggregate().SetMaxTime(5 * time.Second)
    35 // run pipeline
    36 cursor, err := collection.Aggregate(ctx, mongo.Pipeline{searchStage, limitStage, projectStage}, opts)
    37 if err != nil {
    38 panic(err)
    39 }
    40 // print results
    41 var results []bson.D
    42 if err = cursor.All(context.TODO(), &results); err != nil {
    43 panic(err)
    44 }
    45 for _, result := range results {
    46 fmt.Println(result)
    47 }
    48}
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。

  4. 运行以下命令来查询您的集合:

    go run synonyms-explicit-query.go
    [{title Vessel} {score 5.373150825500488}]
    [{title Boats} {score 4.589139938354492}]
    [{title And the Ship Sails On} {score 4.3452959060668945}]
    [{title Broken Vessels} {score 4.3452959060668945}]
    [{title Sailing to Paradise} {score 4.3452959060668945}]
    [{title Boat People} {score 3.711261749267578}]
    [{title Boat Trip} {score 3.711261749267578}]
    [{title Three Men in a Boat} {score 3.1153182983398438}]
    [{title The Glass Bottom Boat} {score 3.1153182983398438}]
    [{title Jack Goes Boating} {score 3.1153182983398438}]

    Atlas Search 搜索结果包含 title 字段中具有 boatvesselsail 的电影,因为我们在名为 sample_synonyms 的同义词源集合中将 boatvesselsail 配置为boat 的同义词,该集合在集合的索引中指定。

    Atlas Search 仅在结果中搜索单词 vessel 时返回以下文档

    { "title" : "Vessel", "score" : 5.373150825500488 }
    { "title" : "Broken Vessels", "score" : 4.3452959060668945 }

    Atlas Search 不包括结果中 title 字段中带有 boatsail 的文档,因为我们没有将 vessel 配置为同义词源集合中 boatsail 的同义词。要对此进行测试,将上面查询中的 query 字段的值替换为 vessel,然后再次运行查询。

    同样,Atlas Search 仅在搜索词 sail 的结果中返回以下文档:

    { "title" : "And the Ship Sails On", "score" : 4.3452959060668945 }
    { "title" : "Sailing to Paradise", "score" : 4.3452959060668945 }

    Atlas Search 不包括结果中 title 字段中带有 boatvessel 的文档,因为我们没有将 sail 配置为同义词源集合中 boatvessel 的同义词。要测试此示例,请将上述查询中 query 字段的值替换为 sail,然后再次运行查询。

2

这些代码示例执行以下任务:

  • 导入mongodb包和依赖项。

  • 建立与您的 Atlas 集群的连接。

  • 遍历游标以打印与查询匹配的文档。

Atlas Search 查询结果根据同义词源集合中定义的单词映射类型而有所不同。

  1. 创建一个名为 synonyms-equivalent-query.go 的文件。

  2. 将代码示例复制并粘贴到 synonyms-equivalent-query.go 文件中。

    该代码示例包含以下阶段:

    • $search 阶段,在 title 字段中搜索单词 automobile,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 automobile 同义词的单词。该查询还会在 title 字段中搜索单词 attire,并使用名为 attireSynonyms 的同义词映射定义在名为 attire_synonyms 的同义词源集合中搜索配置为查询单词 attire 同义词的单词。

    • $limit 阶段用于将输出限制为 10 个结果。

    • $project 阶段排除除 title 之外的所有字段,并添加一个名为 score 的字段。

    1package main
    2
    3import (
    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
    14type MovieCollection struct {
    15 title string `bson:"Title,omitempty"`
    16}
    17
    18func 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": "synonyms-tutorial",
    32 "compound": bson.M{
    33 "should": bson.A{
    34 bson.M{
    35 "text": bson.D{
    36 {"path", "title"}, {"query", "automobile"}, {"synonyms", "transportSynonyms"},
    37 },
    38 },
    39 bson.M{
    40 "text": bson.D{
    41 {"path", "title"}, {"query", "attire"}, {"synonyms", "attireSynonyms"},
    42 },
    43 },
    44 },
    45 },
    46 }}}
    47 limitStage := bson.D{{"$limit", 10}}
    48 projectStage := bson.D{{"$project", bson.D{{"title", 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}
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。

  4. 运行以下命令来查询您的集合:

    go run synonyms-equivalent-query.go
    [{title The Dress} {score 4.812004089355469}]
    [{title Cars} {score 4.197734832763672}]
    [{title Dressed to Kill} {score 3.891493320465088}]
    [{title 27 Dresses} {score 3.891493320465088}]
    [{title Planes, Trains & Automobiles} {score 3.8511905670166016}]
    [{title Car Wash} {score 3.39473032951355}]
    [{title Used Cars} {score 3.39473032951355}]
    [{title Blue Car} {score 3.39473032951355}]
    [{title Cars 2} {score 3.39473032951355}]
    [{title Stealing Cars} {score 3.39473032951355}]

    Atlas Search 结果包含两个搜索术语的文档。结果包含查询术语 automobiletitle 字段中带有 car 的电影,因为我们将 automobile 配置为名为carvehicleautomobile 的同义词源集合中的同义词 transport_synonyms。结果还包含查询术语 attire 的标题字段中带有 dress 的电影,因为我们将 attire 配置为名为 attire_synonyms 的同义词源集合中的dressapparelattire 的同义词。

    Atlas Search 在 transport_synonyms 源集合中搜索 carvehicle 以及在 attire_synonyms 源集合中搜索 dressapparel 会返回相同的结果。要测试此示例,将上述查询中 query 字段的值替换为 carvehicle,并将上述查询中 query 字段的值替换为 dressapparel,然后再次运行查询。

  1. 创建一个名为 synonyms-explicit-query.go 的文件。

  2. 将代码示例复制并粘贴到 synonyms-explicit-query.go 文件中。

    该代码示例包含以下阶段:

    • $search 阶段,在 title 字段中搜索单词 boat,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 boat 同义词的单词。该查询还会在 title 字段中搜索单词 hat,并使用名为 attireSynonyms 的同义词映射定义在名为 attire_synonyms 的同义词源集合中搜索配置为查询单词 hat 同义词的单词。

    • $limit 阶段用于将输出限制为 10 个结果。

    • $project 阶段排除除 title 之外的所有字段,并添加一个名为 score 的字段。

    1package main
    2
    3import (
    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
    14type MovieCollection struct {
    15 title string `bson:"Title,omitempty"`
    16}
    17
    18func 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": "synonyms-tutorial",
    32 "compound": bson.M{
    33 "must": bson.A{
    34 bson.M{
    35 "text": bson.D{
    36 {"path", "title"}, {"query", "boat"}, {"synonyms", "transportSynonyms"},
    37 },
    38 },
    39 bson.M{
    40 "text": bson.D{
    41 {"path", "title"}, {"query", "hat"}, {"synonyms", "attireSynonyms"},
    42 },
    43 },
    44 },
    45 },
    46 }}}
    47 limitStage := bson.D{{"$limit", 10}}
    48 projectStage := bson.D{{"$project", bson.D{{"title", 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}
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。

  4. 运行以下命令来查询您的集合:

    go run synonyms-explicit-query.go
    [{title Fedora} {score 5.673145294189453}]
    [{title Vessel} {score 5.373150825500488}]
    [{title Boats} {score 4.589139938354492}]
    [{title And the Ship Sails On} {score 4.3452959060668945}]
    [{title Broken Vessels} {score 4.3452959060668945}]
    [{title Sailing to Paradise} {score 4.3452959060668945}]
    [{title Top Hat} {score 4.066137313842773}]
    [{title A Hatful of Rain} {score 4.066137313842773}]
    [{title Boat People} {score 3.711261749267578}]
    [{title Boat Trip} {score 3.711261749267578}]

    Atlas Search 结果包含两个搜索术语的文档。结果包含查询术语 boattitle 字段中带有 vesselboatsail 的电影,因为我们将 boat 配置为名为 transport_synonyms 的同义词源集合中的 boatvesselsail 的同义词。

    Atlas Search 不包括搜索结果中 title 字段中带有 boatsail 的文档 vessel,因为我们没有将 vessel 配置为同义词来源集合中 boatsail 的同义词。同样,Atlas Search 不会在搜索词 sail 的结果中包含 title 字段中包含 boatvessel 的文档,因为我们没有将 sail 配置为同义词源集合中的 boatvessel。要测试这些示例,请将上述查询中 query 字段的值替换为 vesselsail,然后再次运行查询。

    结果还包含查询词 hat 的标题字段中带有 fedorahat 的电影,因为我们将 hat 配置为名为 attire_synonyms 的同义词源集合中的 hatfedoraheadgear 的同义词。

    Atlas Search 不包括搜索结果中 title 字段中带有 hatfedora 的文档 headgear,因为我们没有将 headgear 配置为同义词来源集合中 hatfedora 的同义词。同样,Atlas Search 不会在搜索词 fedora 的结果中包含 title 字段中包含 hatheadgear 的文档,因为我们没有将 fedora 配置为同义词源集合中的 hatheadgear。要测试这些示例,请将上述查询中 query 字段的值替换为 fedoraheadgear,然后再次运行查询。

1
junit
4.11 或更高版本
mongodb-driver-sync
4.3.0 或更高版本
slf4j-log4j12
1.7.30 或更高版本
2

这些代码示例执行以下任务:

  • 导入mongodb包和依赖项。

  • 建立与您的 Atlas 集群的连接。

  • 遍历游标以打印与查询匹配的文档。

Atlas Search 查询结果根据同义词源集合中定义的单词映射类型而有所不同。

  1. 创建一个名为 SynonymsEquivalentQuery.java 的文件。

  2. 将以下代码复制并粘贴到该文件中。

    该代码示例包含以下阶段:

    • $search 阶段,在 title 字段中搜索单词 automobile,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 automobile 同义词的单词。

    • $limit 阶段用于将输出限制为 10 个结果。

    • $project 阶段排除除 title 之外的所有字段,并添加一个名为 score 的字段。

    1import java.util.Arrays;
    2import static com.mongodb.client.model.Filters.eq;
    3import static com.mongodb.client.model.Aggregates.limit;
    4import static com.mongodb.client.model.Aggregates.project;
    5import static com.mongodb.client.model.Projections.excludeId;
    6import static com.mongodb.client.model.Projections.fields;
    7import static com.mongodb.client.model.Projections.include;
    8import static com.mongodb.client.model.Projections.computed;
    9import com.mongodb.client.MongoClient;
    10import com.mongodb.client.MongoClients;
    11import com.mongodb.client.MongoCollection;
    12import com.mongodb.client.MongoDatabase;
    13import org.bson.Document;
    14
    15public class SynonymsEquivalentQuery {
    16 public static void main( String[] args ) {
    17 // define query
    18 Document agg = new Document("$search",
    19 new Document("index", "synonyms-tutorial")
    20 .append("text",
    21 new Document("query", "automobile")
    22 .append("path","title")
    23 .append("synonyms", "transportSynonyms")));
    24
    25 // specify connection
    26 String uri = "<connection-string>";
    27
    28 // establish connection and set namespace
    29 try (MongoClient mongoClient = MongoClients.create(uri)) {
    30 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
    31 MongoCollection<Document> collection = database.getCollection("movies");
    32
    33 // run query and print results
    34 collection.aggregate(Arrays.asList(agg,
    35 limit(10),
    36 project(fields(excludeId(), include("title"), computed("score", new Document("$meta", "searchScore")))))
    37 ).forEach(doc -> System.out.println(doc.toJson()));
    38 }
    39 }
    40}

    注意

    要在 Maven 环境中运行示例代码,请在文件中的 import 语句上方添加以下内容。

    package com.mongodb.drivers;
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。

  4. 编译并运行 SynonymsEquivalentQuery.java 文件。

    javac SynonymsEquivalentQuery.java
    java SynonymsEquivalentQuery
    {"title": "Cars", "score": 4.197734832763672}
    {"title": "Planes, Trains & Automobiles", "score": 3.8511905670166016}
    {"title": "Car Wash", "score": 3.39473032951355}
    {"title": "Used Cars", "score": 3.39473032951355}
    {"title": "Blue Car", "score": 3.39473032951355}
    {"title": "Cars 2", "score": 3.39473032951355}
    {"title": "Stealing Cars", "score": 3.39473032951355}
    {"title": "Cop Car", "score": 3.39473032951355}
    {"title": "The Cars That Eat People", "score": 2.8496146202087402}
    {"title": "Khrustalyov, My Car!", "score": 2.8496146202087402}

    Atlas Search 结果包含在 title 字段中带有 carautomobile 的电影,尽管查询术语是 automobile,因为我们在名为 sample_synonyms 的同义词来源集合中将 automobile 配置为 carvehicleautomobile 的同义词,该集合在索引中指定。Atlas Search 对于单词 carvehicle 的搜索返回相同的结果。要对此进行测试,将上面查询中的 query 字段的值替换为 carvehicle,然后运行查询。

  1. 创建一个名为 SynonymsExplicitQuery.java 的文件。

  2. 将以下代码复制并粘贴到该文件中。

    该代码示例包含以下阶段:

    • $search 阶段,在 title 字段中搜索单词 boat,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 boat 同义词的单词。

    • $limit 阶段用于将输出限制为 10 个结果。

    • $project 阶段排除除 title 之外的所有字段,并添加一个名为 score 的字段。

    1import java.util.Arrays;
    2import static com.mongodb.client.model.Filters.eq;
    3import static com.mongodb.client.model.Aggregates.limit;
    4import static com.mongodb.client.model.Aggregates.project;
    5import static com.mongodb.client.model.Projections.excludeId;
    6import static com.mongodb.client.model.Projections.fields;
    7import static com.mongodb.client.model.Projections.include;
    8import static com.mongodb.client.model.Projections.computed;
    9import com.mongodb.client.MongoClient;
    10import com.mongodb.client.MongoClients;
    11import com.mongodb.client.MongoCollection;
    12import com.mongodb.client.MongoDatabase;
    13import org.bson.Document;
    14
    15public class SynonymsExplicitQuery {
    16 public static void main( String[] args ) {
    17 // define query
    18 Document agg = new Document("$search",
    19 new Document("index", "synonyms-tutorial")
    20 .append("text",
    21 new Document("query", "boat")
    22 .append("path","title")
    23 .append("synonyms", "transportSynonyms")));
    24
    25 // specify connection
    26 String uri = "<connection-string>";
    27
    28 // establish connection and set namespace
    29 try (MongoClient mongoClient = MongoClients.create(uri)) {
    30 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
    31 MongoCollection<Document> collection = database.getCollection("movies");
    32
    33 // run query and print results
    34 collection.aggregate(Arrays.asList(agg,
    35 limit(10),
    36 project(fields(excludeId(), include("title"), computed("score", new Document("$meta", "searchScore")))))
    37 ).forEach(doc -> System.out.println(doc.toJson()));
    38 }
    39 }
    40}

    注意

    要在 Maven 环境中运行示例代码,请在文件中的 import 语句上方添加以下内容。

    package com.mongodb.drivers;
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。

  4. 编译并运行 SynonymsExplicitQuery.java 文件。

    javac SynonymsExplicitQuery.java
    java SynonymsExplicitQuery
    {"title": "Vessel", "score": 5.373150825500488}
    {"title": "Boats", "score": 4.589139938354492}
    {"title": "And the Ship Sails On", "score": 4.3452959060668945}
    {"title": "Broken Vessels", "score": 4.3452959060668945}
    {"title": "Sailing to Paradise", "score": 4.3452959060668945}
    {"title": "Boat People", "score": 3.711261749267578}
    {"title": "Boat Trip", "score": 3.711261749267578}
    {"title": "Three Men in a Boat", "score": 3.1153182983398438}
    {"title": "The Glass Bottom Boat", "score": 3.1153182983398438}
    {"title": "Jack Goes Boating", "score": 3.1153182983398438}

    Atlas Search 搜索结果包含 title 字段中具有 boatvesselsail 的电影,因为我们在名为 sample_synonyms 的同义词源集合中将 boatvesselsail 配置为boat 的同义词,该集合在集合的索引中指定。

    Atlas Search 仅在结果中搜索单词 vessel 时返回以下文档

    { "title" : "Vessel", "score" : 5.373150825500488 }
    { "title" : "Broken Vessels", "score" : 4.3452959060668945 }

    Atlas Search 不包括结果中 title 字段中带有 boatsail 的文档,因为我们没有将 vessel 配置为同义词源集合中 boatsail 的同义词。要对此进行测试,将上面查询中的 query 字段的值替换为 vessel,然后再次运行查询。

    同样,Atlas Search 仅在搜索词 sail 的结果中返回以下文档:

    { "title" : "And the Ship Sails On", "score" : 4.3452959060668945 }
    { "title" : "Sailing to Paradise", "score" : 4.3452959060668945 }

    Atlas Search 不包括结果中 title 字段中带有 boatvessel 的文档,因为我们没有将 sail 配置为同义词源集合中 boatvessel 的同义词。要测试此示例,请将上述查询中 query 字段的值替换为 sail,然后再次运行查询。

3

这些代码示例执行以下任务:

  • 导入mongodb包和依赖项。

  • 建立与您的 Atlas 集群的连接。

  • 遍历游标以打印与查询匹配的文档。

Atlas Search 查询结果根据同义词源集合中定义的单词映射类型而有所不同。

  1. 创建一个名为 SynonymsEquivalentQuery.java 的文件。

  2. 将以下代码复制并粘贴到该文件中。

    该代码示例包含以下阶段:

    • $search 阶段,在 title 字段中搜索单词 automobile,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 automobile 同义词的单词。该查询还会在 title 字段中搜索单词 attire,并使用名为 attireSynonyms 的同义词映射定义在名为 attire_synonyms 的同义词源集合中搜索配置为查询单词 attire 同义词的单词。

    • $limit 阶段用于将输出限制为 10 个结果。

    • $project 阶段排除除 title 之外的所有字段,并添加一个名为 score 的字段。

    1import java.util.Arrays;
    2import static com.mongodb.client.model.Filters.eq;
    3import static com.mongodb.client.model.Aggregates.limit;
    4import static com.mongodb.client.model.Aggregates.project;
    5import static com.mongodb.client.model.Projections.computed;
    6import static com.mongodb.client.model.Projections.excludeId;
    7import static com.mongodb.client.model.Projections.fields;
    8import static com.mongodb.client.model.Projections.include;
    9import com.mongodb.client.MongoClient;
    10import com.mongodb.client.MongoClients;
    11import com.mongodb.client.MongoCollection;
    12import com.mongodb.client.MongoDatabase;
    13import org.bson.Document;
    14
    15public class SynonymsEquivalentQuery {
    16 public static void main( String[] args ) {
    17 Document agg = new Document("$search",
    18 new Document("index", "synonyms-tutorial")
    19 .append("compound",
    20 new Document("should", Arrays.asList(new Document("text",
    21 new Document("path", "title")
    22 .append("query", "automobile")
    23 .append("synonyms", "transportSynonyms")),
    24 new Document("text",
    25 new Document("path", "title")
    26 .append("query", "attire")
    27 .append("synonyms", "attireSynonyms"))))));
    28
    29 String uri = "<connection-string>";
    30
    31 try (MongoClient mongoClient = MongoClients.create(uri)) {
    32 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
    33 MongoCollection<Document> collection = database.getCollection("movies");
    34
    35 collection.aggregate(Arrays.asList(agg,
    36 limit(10),
    37 project(fields(excludeId(), include("title"), computed("score", new Document("$meta", "searchScore")))))
    38 ).forEach(doc -> System.out.println(doc.toJson()));
    39 }
    40 }
    41}

    注意

    要在 Maven 环境中运行示例代码,请在文件中的 import 语句上方添加以下内容。

    package com.mongodb.drivers;
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。

  4. 编译并运行 SynonymsEquivalentQuery.java 文件。

    javac SynonymsEquivalentQuery.java
    java SynonymsEquivalentQuery
    {"title": "The Dress", "score": 4.812004089355469}
    {"title": "Cars", "score": 4.197734832763672}
    {"title": "Dressed to Kill", "score": 3.891493320465088}
    {"title": "27 Dresses", "score": 3.891493320465088}
    {"title": "Planes, Trains & Automobiles", "score": 3.8511905670166016}
    {"title": "Car Wash", "score": 3.39473032951355}
    {"title": "Used Cars", "score": 3.39473032951355}
    {"title": "Blue Car", "score": 3.39473032951355}
    {"title": "Cars 2", "score": 3.39473032951355}
    {"title": "Stealing Cars", "score": 3.39473032951355}

    Atlas Search 结果包含两个搜索术语的文档。结果包含查询术语 automobiletitle 字段中带有 car 的电影,因为我们将 automobile 配置为名为carvehicleautomobile 的同义词源集合中的同义词 transport_synonyms。结果还包含查询术语 attire 的标题字段中带有 dress 的电影,因为我们将 attire 配置为名为 attire_synonyms 的同义词源集合中的dressapparelattire 的同义词。

    Atlas Search 在 transport_synonyms 源集合中搜索 carvehicle 以及在 attire_synonyms 源集合中搜索 dressapparel 会返回相同的结果。要测试此示例,将上述查询中 query 字段的值替换为 carvehicle,并将上述查询中 query 字段的值替换为 dressapparel,然后再次运行查询。

  1. 创建一个名为 SynonymsExplicitQuery.java 的文件。

  2. 将以下代码复制并粘贴到该文件中。

    该代码示例包含以下阶段:

    • $search 阶段,在 title 字段中搜索单词 boat,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 boat 同义词的单词。该查询还会在 title 字段中搜索单词 hat,并使用名为 attireSynonyms 的同义词映射定义在名为 attire_synonyms 的同义词源集合中搜索配置为查询单词 hat 同义词的单词。

    • $limit 阶段用于将输出限制为 10 个结果。

    • $project 阶段排除除 title 之外的所有字段,并添加一个名为 score 的字段。

    1import java.util.Arrays;
    2import static com.mongodb.client.model.Filters.eq;
    3import static com.mongodb.client.model.Aggregates.limit;
    4import static com.mongodb.client.model.Aggregates.project;
    5import static com.mongodb.client.model.Projections.computed;
    6import static com.mongodb.client.model.Projections.excludeId;
    7import static com.mongodb.client.model.Projections.fields;
    8import static com.mongodb.client.model.Projections.include;
    9import com.mongodb.client.MongoClient;
    10import com.mongodb.client.MongoClients;
    11import com.mongodb.client.MongoCollection;
    12import com.mongodb.client.MongoDatabase;
    13import org.bson.Document;
    14
    15public class SynonymsExplicitQuery {
    16 public static void main( String[] args ) {
    17 Document agg = new Document("$search",
    18 new Document("index", "synonyms-tutorial")
    19 .append("compound",
    20 new Document("should", Arrays.asList(new Document("text",
    21 new Document("path", "title")
    22 .append("query", "boat")
    23 .append("synonyms", "transportSynonyms")),
    24 new Document("text",
    25 new Document("path", "title")
    26 .append("query", "hat")
    27 .append("synonyms", "attireSynonyms"))))));
    28
    29 String uri = "<connection-string>";
    30
    31 try (MongoClient mongoClient = MongoClients.create(uri)) {
    32 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
    33 MongoCollection<Document> collection = database.getCollection("movies");
    34
    35 collection.aggregate(Arrays.asList(agg,
    36 limit(10),
    37 project(fields(excludeId(), include("title"), computed("score", new Document("$meta", "searchScore")))))
    38 ).forEach(doc -> System.out.println(doc.toJson()));
    39 }
    40 }
    41}

    注意

    要在 Maven 环境中运行示例代码,请在文件中的 import 语句上方添加以下内容。

    package com.mongodb.drivers;
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。

  4. 编译并运行 SynonymsExplicitQuery.java 文件。

    javac SynonymsExplicitQuery.java
    java SynonymsExplicitQuery
    {"title": "Fedora", "score": 5.673145294189453}
    {"title": "Vessel", "score": 5.373150825500488}
    {"title": "Boats", "score": 4.589139938354492}
    {"title": "And the Ship Sails On", "score": 4.3452959060668945}
    {"title": "Broken Vessels", "score": 4.3452959060668945}
    {"title": "Sailing to Paradise", "score": 4.3452959060668945}
    {"title": "Top Hat", "score": 4.066137313842773}
    {"title": "A Hatful of Rain", "score": 4.066137313842773}
    {"title": "Boat People", "score": 3.711261749267578}
    {"title": "Boat Trip", "score": 3.711261749267578}

    Atlas Search 结果包含两个搜索术语的文档。结果包含查询术语 boattitle 字段中带有 vesselboatsail 的电影,因为我们将 boat 配置为名为 transport_synonyms 的同义词源集合中的 boatvesselsail 的同义词。

    Atlas Search 不包括搜索结果中 title 字段中带有 boatsail 的文档 vessel,因为我们没有将 vessel 配置为同义词来源集合中 boatsail 的同义词。同样,Atlas Search 不会在搜索词 sail 的结果中包含 title 字段中包含 boatvessel 的文档,因为我们没有将 sail 配置为同义词源集合中的 boatvessel。要测试这些示例,请将上述查询中 query 字段的值替换为 vesselsail,然后再次运行查询。

    结果还包含查询词 hat 的标题字段中带有 fedorahat 的电影,因为我们将 hat 配置为名为 attire_synonyms 的同义词源集合中的 hatfedoraheadgear 的同义词。

    Atlas Search 不包括搜索结果中 title 字段中带有 hatfedora 的文档 headgear,因为我们没有将 headgear 配置为同义词来源集合中 hatfedora 的同义词。同样,Atlas Search 不会在搜索词 fedora 的结果中包含 title 字段中包含 hatheadgear 的文档,因为我们没有将 fedora 配置为同义词源集合中的 hatheadgear。要测试这些示例,请将上述查询中 query 字段的值替换为 fedoraheadgear,然后再次运行查询。

1
mongodb-driver-kotlin-coroutine
4.10.0 或更高版本
2

这些代码示例执行以下任务:

  • 导入mongodb包和依赖项。

  • 建立与您的 Atlas 集群的连接。

  • 打印与 AggregateFlow 实例中的查询相匹配的文档。

Atlas Search 查询结果根据同义词源集合中定义的单词映射类型而有所不同。

  1. 创建一个名为 SynonymsEquivalentQuery.kt 的文件。

  2. 将以下代码复制并粘贴到该文件中。

    该代码示例包含以下阶段:

    • $search 阶段,在 title 字段中搜索单词 automobile,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 automobile 同义词的单词。

    • $limit 阶段用于将输出限制为 10 个结果。

    • $project 阶段排除除 title 之外的所有字段,并添加一个名为 score 的字段。

    1import com.mongodb.client.model.Aggregates.limit
    2import com.mongodb.client.model.Aggregates.project
    3import com.mongodb.client.model.Projections.*
    4import com.mongodb.kotlin.client.coroutine.MongoClient
    5import kotlinx.coroutines.runBlocking
    6import org.bson.Document
    7
    8fun 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 query
    17 val agg = Document(
    18 "\$search",
    19 Document("index", "synonyms-tutorial")
    20 .append(
    21 "text",
    22 Document("query", "automobile")
    23 .append("path", "title")
    24 .append("synonyms", "transportSynonyms")
    25 )
    26 )
    27
    28 // run query and print results
    29 val resultsFlow = collection.aggregate<Document>(
    30 listOf(
    31 agg,
    32 limit(10),
    33 project(fields(
    34 excludeId(),
    35 include("title"),
    36 computed("score", Document("\$meta", "searchScore"))
    37 ))
    38 )
    39 )
    40 resultsFlow.collect { println(it) }
    41 }
    42 mongoClient.close()
    43}
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。

  4. 运行 SynonymsEquivalentQuery.kt 文件。

    当你在 IDE 中运行 SynonymsEquivalentQuery.kt 程序时,它会打印以下文档:

    Document{{title=Cars, score=4.140600204467773}}
    Document{{title=Planes, Trains & Automobiles, score=3.8122920989990234}}
    Document{{title=Blue Car, score=3.348478317260742}}
    Document{{title=Used Cars, score=3.348478317260742}}
    Document{{title=Cars 2, score=3.348478317260742}}
    Document{{title=Stealing Cars, score=3.348478317260742}}
    Document{{title=Cop Car, score=3.348478317260742}}
    Document{{title=Car Wash, score=3.348478317260742}}
    Document{{title=The Cars That Eat People, score=2.810762405395508}}
    Document{{title=Revenge of the Electric Car, score=2.810762405395508}}

    Atlas Search 结果包含在 title 字段中带有 carautomobile 的电影,尽管查询术语是 automobile,因为我们在名为 sample_synonyms 的同义词来源集合中将 automobile 配置为 carvehicleautomobile 的同义词,该集合在索引中指定。Atlas Search 对于单词 carvehicle 的搜索返回相同的结果。要对此进行测试,将上面查询中的 query 字段的值替换为 carvehicle,然后运行查询。

  1. 创建一个名为 SynonymsExplicitQuery.kt 的文件。

  2. 将以下代码复制并粘贴到该文件中。

    该代码示例包含以下阶段:

    • $search 阶段,在 title 字段中搜索单词 boat,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 boat 同义词的单词。

    • $limit 阶段用于将输出限制为 10 个结果。

    • $project 阶段排除除 title 之外的所有字段,并添加一个名为 score 的字段。

    1import com.mongodb.client.model.Aggregates.limit
    2import com.mongodb.client.model.Aggregates.project
    3import com.mongodb.client.model.Projections.*
    4import com.mongodb.kotlin.client.coroutine.MongoClient
    5import kotlinx.coroutines.runBlocking
    6import org.bson.Document
    7
    8fun 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 query
    17 val agg = Document(
    18 "\$search",
    19 Document("index", "synonyms-tutorial")
    20 .append(
    21 "text",
    22 Document("query", "boat")
    23 .append("path", "title")
    24 .append("synonyms", "transportSynonyms")
    25 )
    26 )
    27
    28 // run query and print results
    29 val resultsFlow = collection.aggregate<Document>(
    30 listOf(
    31 agg,
    32 limit(10),
    33 project(fields(
    34 excludeId(),
    35 include("title"),
    36 computed("score", Document("\$meta", "searchScore"))
    37 ))
    38 )
    39 )
    40 resultsFlow.collect { println(it) }
    41 }
    42 mongoClient.close()
    43}
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。

  4. 运行 SynonymsExplicitQuery.kt 文件。

    当你在 IDE 中运行 SynonymsExplicitQuery.kt 程序时,它会打印以下文档:

    Document{{title=Vessel, score=5.3159894943237305}}
    Document{{title=Boats, score=4.597315311431885}}
    Document{{title=Sailing to Paradise, score=4.299008369445801}}
    Document{{title=And the Ship Sails On, score=4.299008369445801}}
    Document{{title=Broken Vessels, score=4.299008369445801}}
    Document{{title=Boat Trip, score=3.717820644378662}}
    Document{{title=Boat People, score=3.717820644378662}}
    Document{{title=Jack Goes Boating, score=3.1207938194274902}}
    Document{{title=The Glass Bottom Boat, score=3.1207938194274902}}
    Document{{title=Raspberry Boat Refugee, score=3.1207938194274902}}

    Atlas Search 搜索结果包含 title 字段中具有 boatvesselsail 的电影,因为我们在名为 sample_synonyms 的同义词源集合中将 boatvesselsail 配置为boat 的同义词,该集合在集合的索引中指定。

    Atlas Search 仅在结果中搜索单词 vessel 时返回以下文档

    { "title" : "Vessel", "score" : 5.373150825500488 }
    { "title" : "Broken Vessels", "score" : 4.3452959060668945 }

    Atlas Search 不包括结果中 title 字段中带有 boatsail 的文档,因为我们没有将 vessel 配置为同义词源集合中 boatsail 的同义词。要对此进行测试,将上面查询中的 query 字段的值替换为 vessel,然后再次运行查询。

    同样,Atlas Search 仅在搜索词 sail 的结果中返回以下文档:

    { "title" : "And the Ship Sails On", "score" : 4.3452959060668945 }
    { "title" : "Sailing to Paradise", "score" : 4.3452959060668945 }

    Atlas Search 不包括结果中 title 字段中带有 boatvessel 的文档,因为我们没有将 sail 配置为同义词源集合中 boatvessel 的同义词。要测试此示例,请将上述查询中 query 字段的值替换为 sail,然后再次运行查询。

3

这些代码示例执行以下任务:

  • 导入mongodb包和依赖项。

  • 建立与您的 Atlas 集群的连接。

  • 打印与 AggregateFlow 实例中的查询相匹配的文档。

Atlas Search 查询结果根据同义词源集合中定义的单词映射类型而有所不同。

  1. 创建一个名为 SynonymsEquivalentQuery.kt 的文件。

  2. 将以下代码复制并粘贴到该文件中。

    该代码示例包含以下阶段:

    • $search 阶段,在 title 字段中搜索单词 automobile,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 automobile 同义词的单词。该查询还会在 title 字段中搜索单词 attire,并使用名为 attireSynonyms 的同义词映射定义在名为 attire_synonyms 的同义词源集合中搜索配置为查询单词 attire 同义词的单词。

    • $limit 阶段用于将输出限制为 10 个结果。

    • $project 阶段排除除 title 之外的所有字段,并添加一个名为 score 的字段。

    1import com.mongodb.client.model.Aggregates.limit
    2import com.mongodb.client.model.Aggregates.project
    3import com.mongodb.client.model.Projections.*
    4import com.mongodb.kotlin.client.coroutine.MongoClient
    5import kotlinx.coroutines.runBlocking
    6import org.bson.Document
    7
    8fun 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 query
    17 val agg = Document(
    18 "\$search",
    19 Document("index", "synonyms-tutorial")
    20 .append(
    21 "compound",
    22 Document(
    23 "should", listOf(
    24 Document(
    25 "text",
    26 Document("path", "title")
    27 .append("query", "automobile")
    28 .append("synonyms", "transportSynonyms")
    29 ),
    30 Document(
    31 "text",
    32 Document("path", "title")
    33 .append("query", "attire")
    34 .append("synonyms", "attireSynonyms")
    35 )
    36 )
    37 )
    38 )
    39 )
    40
    41 // run query and print results
    42 val resultsFlow = collection.aggregate<Document>(
    43 listOf(
    44 agg,
    45 limit(10),
    46 project(fields(
    47 excludeId(),
    48 include("title"),
    49 computed("score", Document("\$meta", "searchScore"))
    50 ))
    51 )
    52 )
    53 resultsFlow.collect { println(it) }
    54 }
    55 mongoClient.close()
    56}
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。

  4. 运行 SynonymsEquivalentQuery.kt 文件。

    当你在 IDE 中运行 SynonymsEquivalentQuery.kt 程序时,它会打印以下文档:

    Document{{title=The Dress, score=4.852960586547852}}
    Document{{title=Cars, score=4.140600204467773}}
    Document{{title=27 Dresses, score=3.9245595932006836}}
    Document{{title=Planes, Trains & Automobiles, score=3.8122920989990234}}
    Document{{title=Car Wash, score=3.348478317260742}}
    Document{{title=Used Cars, score=3.348478317260742}}
    Document{{title=Blue Car, score=3.348478317260742}}
    Document{{title=Cars 2, score=3.348478317260742}}
    Document{{title=Stealing Cars, score=3.348478317260742}}
    Document{{title=Cop Car, score=3.348478317260742}}

    Atlas Search 结果包含两个搜索术语的文档。结果包含查询术语 automobiletitle 字段中带有 car 的电影,因为我们将 automobile 配置为名为carvehicleautomobile 的同义词源集合中的同义词 transport_synonyms。结果还包含查询术语 attire 的标题字段中带有 dress 的电影,因为我们将 attire 配置为名为 attire_synonyms 的同义词源集合中的dressapparelattire 的同义词。

    Atlas Search 在 transport_synonyms 源集合中搜索 carvehicle 以及在 attire_synonyms 源集合中搜索 dressapparel 会返回相同的结果。要测试此示例,将上述查询中 query 字段的值替换为 carvehicle,并将上述查询中 query 字段的值替换为 dressapparel,然后再次运行查询。

  1. 创建一个名为 SynonymsExplicitQuery.kt 的文件。

  2. 将以下代码复制并粘贴到该文件中。

    该代码示例包含以下阶段:

    • $search 阶段,在 title 字段中搜索单词 boat,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 boat 同义词的单词。该查询还会在 title 字段中搜索单词 hat,并使用名为 attireSynonyms 的同义词映射定义在名为 attire_synonyms 的同义词源集合中搜索配置为查询单词 hat 同义词的单词。

    • $limit 阶段用于将输出限制为 10 个结果。

    • $project 阶段排除除 title 之外的所有字段,并添加一个名为 score 的字段。

    1import com.mongodb.client.model.Aggregates.limit
    2import com.mongodb.client.model.Aggregates.project
    3import com.mongodb.client.model.Projections.*
    4import com.mongodb.kotlin.client.coroutine.MongoClient
    5import kotlinx.coroutines.runBlocking
    6import org.bson.Document
    7
    8fun 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 query
    17 val agg = Document(
    18 "\$search",
    19 Document("index", "synonyms-tutorial")
    20 .append(
    21 "compound",
    22 Document(
    23 "should", listOf(
    24 Document(
    25 "text",
    26 Document("path", "title")
    27 .append("query", "boat")
    28 .append("synonyms", "transportSynonyms")
    29 ),
    30 Document(
    31 "text",
    32 Document("path", "title")
    33 .append("query", "hat")
    34 .append("synonyms", "attireSynonyms")
    35 )
    36 )
    37 )
    38 )
    39 )
    40
    41 // run query and print results
    42 val resultsFlow = collection.aggregate<Document>(
    43 listOf(
    44 agg,
    45 limit(10),
    46 project(fields(
    47 excludeId(),
    48 include("title"),
    49 computed("score", Document("\$meta", "searchScore"))
    50 ))
    51 )
    52 )
    53
    54 resultsFlow.collect { println(it) }
    55 }
    56
    57 mongoClient.close()
    58}
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。

  4. 运行 SynonymsExplicitQuery.kt 文件。

    当你在 IDE 中运行 SynonymsExplicitQuery.kt 程序时,它会打印以下文档:

    Document{{title=Fedora, score=5.6159772872924805}}
    Document{{title=Vessel, score=5.3159894943237305}}
    Document{{title=Boats, score=4.597315311431885}}
    Document{{title=And the Ship Sails On, score=4.299008369445801}}
    Document{{title=Broken Vessels, score=4.299008369445801}}
    Document{{title=Sailing to Paradise, score=4.299008369445801}}
    Document{{title=Top Hat, score=4.01986026763916}}
    Document{{title=A Hatful of Rain, score=4.01986026763916}}
    Document{{title=Boat People, score=3.717820644378662}}
    Document{{title=Boat Trip, score=3.717820644378662}}

    Atlas Search 结果包含两个搜索术语的文档。结果包含查询术语 boattitle 字段中带有 vesselboatsail 的电影,因为我们将 boat 配置为名为 transport_synonyms 的同义词源集合中的 boatvesselsail 的同义词。

    Atlas Search 不包括搜索结果中 title 字段中带有 boatsail 的文档 vessel,因为我们没有将 vessel 配置为同义词来源集合中 boatsail 的同义词。同样,Atlas Search 不会在搜索词 sail 的结果中包含 title 字段中包含 boatvessel 的文档,因为我们没有将 sail 配置为同义词源集合中的 boatvessel。要测试这些示例,请将上述查询中 query 字段的值替换为 vesselsail,然后再次运行查询。

    结果还包含查询词 hat 的标题字段中带有 fedorahat 的电影,因为我们将 hat 配置为名为 attire_synonyms 的同义词源集合中的 hatfedoraheadgear 的同义词。

    Atlas Search 不包括搜索结果中 title 字段中带有 hatfedora 的文档 headgear,因为我们没有将 headgear 配置为同义词来源集合中 hatfedora 的同义词。同样,Atlas Search 不会在搜索词 fedora 的结果中包含 title 字段中包含 hatheadgear 的文档,因为我们没有将 fedora 配置为同义词源集合中的 hatheadgear。要测试这些示例,请将上述查询中 query 字段的值替换为 fedoraheadgear,然后再次运行查询。

1

这些代码示例执行以下任务:

  • 导入 mongodb,即 MongoDB 的 Node.js 驱动程序。

  • 创建一个 MongoClient 类实例,以建立与 Atlas 集群的连接。

  • 遍历游标以打印与查询匹配的文档。

Atlas Search 查询结果根据同义词源集合中定义的单词映射类型而有所不同。

  1. 创建一个名为 synonyms-equivalent-query.js 的文件。

  2. 将代码示例复制并粘贴到 synonyms-equivalent-query.js 文件中。

    该代码示例包含以下阶段:

    • $search 阶段,在 title 字段中搜索单词 automobile,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 automobile 同义词的单词。

    • $limit 阶段用于将输出限制为 10 个结果。

    • $project 阶段排除除 title 之外的所有字段,并添加一个名为 score 的字段。

    1const MongoClient = require("mongodb").MongoClient;
    2const assert = require("assert");
    3
    4const agg = [
    5 {
    6 $search: {
    7 index: "synonyms-tutorial",
    8 text: {
    9 path: "title",
    10 query: "automobile",
    11 synonyms: "transportSynonyms",
    12 },
    13 },
    14 },
    15 {
    16 $limit: 10,
    17 },
    18 {
    19 $project: {
    20 _id: 0,
    21 title: 1,
    22 score: { $meta: "searchScore" },
    23 },
    24 },
    25];
    26
    27MongoClient.connect(
    28 "<connection-string>",
    29 { useNewUrlParser: true, useUnifiedTopology: true },
    30 async function (connectErr, client) {
    31 assert.equal(null, connectErr);
    32 const coll = client.db("sample_mflix").collection("movies");
    33 let cursor = await coll.aggregate(agg);
    34 await cursor.forEach((doc) => console.log(doc));
    35 client.close();
    36 }
    37);
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的凭证。

  4. 运行以下命令来查询您的集合:

    node synonyms-equivalent-query.js
    { title: 'Cars', score: 4.197734832763672 }
    { title: 'Planes, Trains & Automobiles', score: 3.8511905670166016 }
    { title: 'Car Wash', score: 3.39473032951355 }
    { title: 'Used Cars', score: 3.39473032951355 }
    { title: 'Blue Car', score: 3.39473032951355 }
    { title: 'Cars 2', score: 3.39473032951355 }
    { title: 'Stealing Cars', score: 3.39473032951355 }
    { title: 'Cop Car', score: 3.39473032951355 }
    { title: 'The Cars That Eat People', score: 2.8496146202087402 }
    { title: 'Khrustalyov, My Car!', score: 2.8496146202087402 }

    Atlas Search 结果包含在 title 字段中带有 carautomobile 的电影,尽管查询术语是 automobile,因为我们在名为 sample_synonyms 的同义词来源集合中将 automobile 配置为 carvehicleautomobile 的同义词,该集合在索引中指定。Atlas Search 对于单词 carvehicle 的搜索返回相同的结果。要对此进行测试,将上面查询中的 query 字段的值替换为 carvehicle,然后运行查询。

  1. 创建一个名为 synonyms-explicit-query.js 的文件。

  2. 将代码示例复制并粘贴到 synonyms-explicit-query.js 文件中。

    该代码示例包含以下阶段:

    • $search 阶段,在 title 字段中搜索单词 boat,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 boat 同义词的单词。

    • $limit 阶段用于将输出限制为 10 个结果。

    • $project 阶段排除除 title 之外的所有字段,并添加一个名为 score 的字段。

    1const MongoClient = require("mongodb").MongoClient;
    2const assert = require("assert");
    3
    4const agg = [
    5 {
    6 $search: {
    7 index: "synonyms-tutorial",
    8 text: {
    9 path: "title",
    10 query: "boat",
    11 synonyms: "transportSynonyms",
    12 },
    13 },
    14 },
    15 {
    16 $limit: 10,
    17 },
    18 {
    19 $project: {
    20 _id: 0,
    21 title: 1,
    22 score: { $meta: "searchScore" },
    23 },
    24 },
    25];
    26
    27MongoClient.connect(
    28 "<connection-string>",
    29 { useNewUrlParser: true, useUnifiedTopology: true },
    30 async function (connectErr, client) {
    31 assert.equal(null, connectErr);
    32 const coll = client.db("sample_mflix").collection("movies");
    33 let cursor = await coll.aggregate(agg);
    34 await cursor.forEach((doc) => console.log(doc));
    35 client.close();
    36 }
    37);
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的凭证。

  4. 运行以下命令来查询您的集合:

    node synonyms-explicit-query.js
    { title: 'Vessel', score: 5.373150825500488 }
    { title: 'Boats', score: 4.589139938354492 }
    { title: 'And the Ship Sails On', score: 4.3452959060668945 }
    { title: 'Broken Vessels', score: 4.3452959060668945 }
    { title: 'Sailing to Paradise', score: 4.3452959060668945 }
    { title: 'Boat People', score: 3.711261749267578 }
    { title: 'Boat Trip', score: 3.711261749267578 }
    { title: 'Three Men in a Boat', score: 3.1153182983398438 }
    { title: 'The Glass Bottom Boat', score: 3.1153182983398438 }
    { title: 'Jack Goes Boating', score: 3.1153182983398438 }

    Atlas Search 搜索结果包含 title 字段中具有 boatvesselsail 的电影,因为我们在名为 sample_synonyms 的同义词源集合中将 boatvesselsail 配置为boat 的同义词,该集合在集合的索引中指定。

    Atlas Search 仅在结果中搜索单词 vessel 时返回以下文档

    { "title" : "Vessel", "score" : 5.373150825500488 }
    { "title" : "Broken Vessels", "score" : 4.3452959060668945 }

    Atlas Search 不包括结果中 title 字段中带有 boatsail 的文档,因为我们没有将 vessel 配置为同义词源集合中 boatsail 的同义词。要对此进行测试,将上面查询中的 query 字段的值替换为 vessel,然后再次运行查询。

    同样,Atlas Search 仅在搜索词 sail 的结果中返回以下文档:

    { "title" : "And the Ship Sails On", "score" : 4.3452959060668945 }
    { "title" : "Sailing to Paradise", "score" : 4.3452959060668945 }

    Atlas Search 不包括结果中 title 字段中带有 boatvessel 的文档,因为我们没有将 sail 配置为同义词源集合中 boatvessel 的同义词。要测试此示例,请将上述查询中 query 字段的值替换为 sail,然后再次运行查询。

2

这些代码示例执行以下任务:

  • 导入 mongodb,即 MongoDB 的 Node.js 驱动程序。

  • 创建一个 MongoClient 类实例,以建立与 Atlas 集群的连接。

  • 遍历游标以打印与查询匹配的文档。

Atlas Search 查询结果根据同义词源集合中定义的单词映射类型而有所不同。

  1. 创建一个名为 synonyms-equivalent-query.js 的文件。

  2. 将代码示例复制并粘贴到 synonyms-equivalent-query.js 文件中。

    该代码示例包含以下阶段:

    • $search 阶段,在 title 字段中搜索单词 automobile,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 automobile 同义词的单词。该查询还会在 title 字段中搜索单词 attire,并使用名为 attireSynonyms 的同义词映射定义在名为 attire_synonyms 的同义词源集合中搜索配置为查询单词 attire 同义词的单词。

    • $limit 阶段用于将输出限制为 10 个结果。

    • $project 阶段排除除 title 之外的所有字段,并添加一个名为 score 的字段。

    1pconst MongoClient = require("mongodb").MongoClient;
    2const assert = require("assert");
    3
    4const agg = [
    5 {
    6 '$search': {
    7 'index': 'synonyms-tutorial',
    8 'compound': {
    9 'should': [
    10 {
    11 'text': {
    12 'path': 'title',
    13 'query': 'automobile',
    14 'synonyms': 'transportSynonyms'
    15 }
    16 }, {
    17 'text': {
    18 'path': 'title',
    19 'query': 'attire',
    20 'synonyms': 'attireSynonyms'
    21 }
    22 }
    23 ]
    24 }
    25 }
    26 }, {
    27 '$limit': 10
    28 }, {
    29 '$project': {
    30 '_id': 0,
    31 'title': 1,
    32 'score': {
    33 '$meta': 'searchScore'
    34 }
    35 }
    36 }
    37];
    38
    39MongoClient.connect(
    40 "<connection-string>",
    41 { useNewUrlParser: true, useUnifiedTopology: true },
    42 async function (connectErr, client) {
    43 assert.equal(null, connectErr);
    44 const coll = client.db("sample_mflix").collection("movies");
    45 let cursor = await coll.aggregate(agg);
    46 await cursor.forEach((doc) => console.log(doc));
    47 client.close();
    48 }
    49);
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的凭证。

  4. 运行以下命令来查询您的集合:

    node synonyms-equivalent-query.js
    { title: 'The Dress', score: 4.812004089355469 }
    { title: 'Cars', score: 4.197734832763672 }
    { title: 'Dressed to Kill', score: 3.891493320465088 }
    { title: '27 Dresses', score: 3.891493320465088 }
    { title: 'Planes, Trains & Automobiles', score: 3.8511905670166016 }
    { title: 'Car Wash', score: 3.39473032951355 }
    { title: 'Used Cars', score: 3.39473032951355 }
    { title: 'Blue Car', score: 3.39473032951355 }
    { title: 'Cars 2', score: 3.39473032951355 }
    { title: 'Stealing Cars', score: 3.39473032951355 }

    Atlas Search 结果包含两个搜索术语的文档。结果包含查询术语 automobiletitle 字段中带有 car 的电影,因为我们将 automobile 配置为名为carvehicleautomobile 的同义词源集合中的同义词 transport_synonyms。结果还包含查询术语 attire 的标题字段中带有 dress 的电影,因为我们将 attire 配置为名为 attire_synonyms 的同义词源集合中的dressapparelattire 的同义词。

    Atlas Search 在 transport_synonyms 源集合中搜索 carvehicle 以及在 attire_synonyms 源集合中搜索 dressapparel 会返回相同的结果。要测试此示例,将上述查询中 query 字段的值替换为 carvehicle,并将上述查询中 query 字段的值替换为 dressapparel,然后再次运行查询。

  1. 创建一个名为 synonyms-explicit-query.js 的文件。

  2. 将代码示例复制并粘贴到 synonyms-explicit-query.js 文件中。

    该代码示例包含以下阶段:

    • $search 阶段,在 title 字段中搜索单词 boat,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 boat 同义词的单词。该查询还会在 title 字段中搜索单词 hat,并使用名为 attireSynonyms 的同义词映射定义在名为 attire_synonyms 的同义词源集合中搜索配置为查询单词 hat 同义词的单词。

    • $limit 阶段用于将输出限制为 10 个结果。

    • $project 阶段排除除 title 之外的所有字段,并添加一个名为 score 的字段。

    1const MongoClient = require("mongodb").MongoClient;
    2const assert = require("assert");
    3
    4const agg = [
    5 {
    6 '$search': {
    7 'index': 'synonyms-tutorial',
    8 'compound': {
    9 'should': [
    10 {
    11 'text': {
    12 'path': 'title',
    13 'query': 'boat',
    14 'synonyms': 'transportSynonyms'
    15 }
    16 }, {
    17 'text': {
    18 'path': 'title',
    19 'query': 'hat',
    20 'synonyms': 'attireSynonyms'
    21 }
    22 }
    23 ]
    24 }
    25 }
    26 }, {
    27 '$limit': 10
    28 }, {
    29 '$project': {
    30 '_id': 0,
    31 'title': 1,
    32 'score': {
    33 '$meta': 'searchScore'
    34 }
    35 }
    36 }
    37];
    38
    39MongoClient.connect(
    40 "<connection-string>",
    41 { useNewUrlParser: true, useUnifiedTopology: true },
    42 async function (connectErr, client) {
    43 assert.equal(null, connectErr);
    44 const coll = client.db("sample_mflix").collection("movies");
    45 let cursor = await coll.aggregate(agg);
    46 await cursor.forEach((doc) => console.log(doc));
    47 client.close();
    48 }
    49);
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的凭证。

  4. 运行以下命令来查询您的集合:

    node synonyms-explicit-query.js
    { title: 'Fedora', score: 5.673145294189453 }
    { title: 'Vessel', score: 5.373150825500488 }
    { title: 'Boats', score: 4.589139938354492 }
    { title: 'And the Ship Sails On', score: 4.3452959060668945 }
    { title: 'Broken Vessels', score: 4.3452959060668945 }
    { title: 'Sailing to Paradise', score: 4.3452959060668945 }
    { title: 'Top Hat', score: 4.066137313842773 }
    { title: 'A Hatful of Rain', score: 4.066137313842773 }
    { title: 'Boat People', score: 3.711261749267578 }
    { title: 'Boat Trip', score: 3.711261749267578 }

    Atlas Search 结果包含两个搜索术语的文档。结果包含查询术语 boattitle 字段中带有 vesselboatsail 的电影,因为我们将 boat 配置为名为 transport_synonyms 的同义词源集合中的 boatvesselsail 的同义词。

    Atlas Search 不包括搜索结果中 title 字段中带有 boatsail 的文档 vessel,因为我们没有将 vessel 配置为同义词来源集合中 boatsail 的同义词。同样,Atlas Search 不会在搜索词 sail 的结果中包含 title 字段中包含 boatvessel 的文档,因为我们没有将 sail 配置为同义词源集合中的 boatvessel。要测试这些示例,请将上述查询中 query 字段的值替换为 vesselsail,然后再次运行查询。

    结果还包含查询词 hat 的标题字段中带有 fedorahat 的电影,因为我们将 hat 配置为名为 attire_synonyms 的同义词源集合中的 hatfedoraheadgear 的同义词。

    Atlas Search 不包括搜索结果中 title 字段中带有 hatfedora 的文档 headgear,因为我们没有将 headgear 配置为同义词来源集合中 hatfedora 的同义词。同样,Atlas Search 不会在搜索词 fedora 的结果中包含 title 字段中包含 hatheadgear 的文档,因为我们没有将 fedora 配置为同义词源集合中的 hatheadgear。要测试这些示例,请将上述查询中 query 字段的值替换为 fedoraheadgear,然后再次运行查询。

1

这些代码示例执行以下任务:

  • 导入 pymongo 、MongoDB 的 Python 驱动程序和 dns 模块,这是使用 DNS 种子列表连接字符串将 pymongo 连接到 Atlas 所必需的。

  • 创建一个 MongoClient 类实例,以建立与 Atlas 集群的连接。

  • 遍历游标以打印与查询匹配的文档。

Atlas Search 查询结果根据同义词源集合中定义的单词映射类型而有所不同。

  1. 创建一个名为 synonyms-equivalent-query.py 的文件。

  2. 将代码示例复制并粘贴到 synonyms-equivalent.py 文件中。

    该代码示例包含以下阶段:

    • $search 阶段,在 title 字段中搜索单词 automobile,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 automobile 同义词的单词。

    • $limit 阶段将输出限制为10结果

    • $project阶段排除title以外的所有字段,并添加名为score的字段

    1import pymongo
    2import dns
    3
    4client = pymongo.MongoClient('<connection-string>')
    5result = client['sample_mflix']['movies'].aggregate([
    6 {
    7 '$search': {
    8 'index': 'synonyms-tutorial',
    9 'text': {
    10 'path': 'title',
    11 'query': 'automobile',
    12 'synonyms': 'transportSynonyms'
    13 }
    14 }
    15 },
    16 {
    17 '$limit': 10
    18 },
    19 {
    20 '$project': {
    21 '_id': 0,
    22 'title': 1,
    23 'score': {
    24 '$meta': 'searchScore'
    25 }
    26 }
    27 }
    28])
    29
    30for i in result:
    31 print(i)
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的凭证。

  4. 运行以下命令来查询您的集合:

    python synonyms-equivalent-query.py
    {'title': 'Cars', 'score': 4.197734832763672}
    {'title': 'Planes, Trains & Automobiles', 'score': 3.8511905670166016}
    {'title': 'Car Wash', 'score': 3.39473032951355}
    {'title': 'Used Cars', 'score': 3.39473032951355}
    {'title': 'Blue Car', 'score': 3.39473032951355}
    {'title': 'Cars 2', 'score': 3.39473032951355}
    {'title': 'Stealing Cars', 'score': 3.39473032951355}
    {'title': 'Cop Car', 'score': 3.39473032951355}
    {'title': 'The Cars That Eat People', 'score': 2.8496146202087402}
    {'title': 'Khrustalyov, My Car!', 'score': 2.8496146202087402}

    Atlas Search 结果包含在 title 字段中带有 carautomobile 的电影,尽管查询术语是 automobile,因为我们在名为 sample_synonyms 的同义词来源集合中将 automobile 配置为 carvehicleautomobile 的同义词,该集合在索引中指定。Atlas Search 对于单词 carvehicle 的搜索返回相同的结果。要对此进行测试,将上面查询中的 query 字段的值替换为 carvehicle,然后运行查询。

  1. 创建一个名为 synonyms-explicit-query.py 的文件。

  2. 将代码示例复制并粘贴到 synonyms-explicit.py 文件中。

    该代码示例包含以下阶段:

    • $search 阶段,在 title 字段中搜索单词 boat,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 boat 同义词的单词。

    • $limit 阶段用于将输出限制为 10 个结果。

    • $project 阶段排除除 title 之外的所有字段,并添加一个名为 score 的字段。

    1import pymongo
    2import dns
    3
    4client = pymongo.MongoClient('<connection-string>')
    5result = client['sample_mflix']['movies'].aggregate([
    6 {
    7 '$search': {
    8 'index': 'synonyms-tutorial',
    9 'text': {
    10 'path': 'title',
    11 'query': 'boat',
    12 'synonyms': 'transportSynonyms'
    13 }
    14 }
    15 },
    16 {
    17 '$limit': 10
    18 },
    19 {
    20 '$project': {
    21 '_id': 0,
    22 'title': 1,
    23 'score': {
    24 '$meta': 'searchScore'
    25 }
    26 }
    27 }
    28])
    29
    30for i in result:
    31 print(i)
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的凭证。

  4. 运行以下命令来查询您的集合:

    python synonyms-explicit-query.py
    {'title': 'Vessel', 'score': 5.373150825500488}
    {'title': 'Boats', 'score': 4.589139938354492}
    {'title': 'And the Ship Sails On', 'score': 4.3452959060668945}
    {'title': 'Broken Vessels', 'score': 4.3452959060668945}
    {'title': 'Sailing to Paradise', 'score': 4.3452959060668945}
    {'title': 'Boat People', 'score': 3.711261749267578}
    {'title': 'Boat Trip', 'score': 3.711261749267578}
    {'title': 'Three Men in a Boat', 'score': 3.1153182983398438}
    {'title': 'The Glass Bottom Boat', 'score': 3.1153182983398438}
    {'title': 'Jack Goes Boating', 'score': 3.1153182983398438}

    Atlas Search 搜索结果包含 title 字段中具有 boatvesselsail 的电影,因为我们在名为 sample_synonyms 的同义词源集合中将 boatvesselsail 配置为boat 的同义词,该集合在集合的索引中指定。

    Atlas Search 仅在结果中搜索单词 vessel 时返回以下文档

    { "title" : "Vessel", "score" : 5.373150825500488 }
    { "title" : "Broken Vessels", "score" : 4.3452959060668945 }

    Atlas Search 不包括结果中 title 字段中带有 boatsail 的文档,因为我们没有将 vessel 配置为同义词源集合中 boatsail 的同义词。要对此进行测试,将上面查询中的 query 字段的值替换为 vessel,然后再次运行查询。

    同样,Atlas Search 仅在搜索词 sail 的结果中返回以下文档:

    { "title" : "And the Ship Sails On", "score" : 4.3452959060668945 }
    { "title" : "Sailing to Paradise", "score" : 4.3452959060668945 }

    Atlas Search 不包括结果中 title 字段中带有 boatvessel 的文档,因为我们没有将 sail 配置为同义词源集合中 boatvessel 的同义词。要测试此示例,请将上述查询中 query 字段的值替换为 sail,然后再次运行查询。

2

这些代码示例执行以下任务:

  • 导入 pymongo 、MongoDB 的 Python 驱动程序和 dns 模块,这是使用 DNS 种子列表连接字符串将 pymongo 连接到 Atlas 所必需的。

  • 创建一个 MongoClient 类实例,以建立与 Atlas 集群的连接。

  • 遍历游标以打印与查询匹配的文档。

Atlas Search 查询结果根据同义词源集合中定义的单词映射类型而有所不同。

  1. 创建一个名为 synonyms-equivalent-query.py 的文件。

  2. 将代码示例复制并粘贴到 synonyms-equivalent.py 文件中。

    该代码示例包含以下阶段:

    • $search 阶段,在 title 字段中搜索单词 automobile,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 automobile 同义词的单词。该查询还会在 title 字段中搜索单词 attire,并使用名为 attireSynonyms 的同义词映射定义在名为 attire_synonyms 的同义词源集合中搜索配置为查询单词 attire 同义词的单词。

    • $limit 阶段用于将输出限制为 10 个结果。

    • $project 阶段排除除 title 之外的所有字段,并添加一个名为 score 的字段。

    1import pymongo
    2import dns
    3
    4client = pymongo.MongoClient('<connection-string>')
    5result = client['sample_mflix']['movies'].aggregate([
    6 {
    7 '$search': {
    8 'index': 'synonyms-tutorial',
    9 'compound': {
    10 'should': [
    11 {
    12 'text': {
    13 'path': 'title',
    14 'query': 'automobile',
    15 'synonyms': 'transportSynonyms'
    16 }
    17 }, {
    18 'text': {
    19 'path': 'title',
    20 'query': 'attire',
    21 'synonyms': 'attireSynonyms'
    22 }
    23 }
    24 ]
    25 }
    26 }
    27 }, {
    28 '$limit': 10
    29 }, {
    30 '$project': {
    31 '_id': 0,
    32 'title': 1,
    33 'score': {
    34 '$meta': 'searchScore'
    35 }
    36 }
    37 }
    38])
    39
    40for i in result:
    41 print(i)
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的凭证。

  4. 运行以下命令来查询您的集合:

    python synonyms-equivalent-query.py
    {'title': 'The Dress', 'score': 4.812004089355469}
    {'title': 'Cars', 'score': 4.197734832763672}
    {'title': 'Dressed to Kill', 'score': 3.891493320465088}
    {'title': '27 Dresses', 'score': 3.891493320465088}
    {'title': 'Planes, Trains & Automobiles', 'score': 3.8511905670166016}
    {'title': 'Car Wash', 'score': 3.39473032951355}
    {'title': 'Used Cars', 'score': 3.39473032951355}
    {'title': 'Blue Car', 'score': 3.39473032951355}
    {'title': 'Cars 2', 'score': 3.39473032951355}
    {'title': 'Stealing Cars', 'score': 3.39473032951355}

    Atlas Search 结果包含两个搜索术语的文档。结果包含查询术语 automobiletitle 字段中带有 car 的电影,因为我们将 automobile 配置为名为carvehicleautomobile 的同义词源集合中的同义词 transport_synonyms。结果还包含查询术语 attire 的标题字段中带有 dress 的电影,因为我们将 attire 配置为名为 attire_synonyms 的同义词源集合中的dressapparelattire 的同义词。

    Atlas Search 在 transport_synonyms 源集合中搜索 carvehicle 以及在 attire_synonyms 源集合中搜索 dressapparel 会返回相同的结果。要测试此示例,将上述查询中 query 字段的值替换为 carvehicle,并将上述查询中 query 字段的值替换为 dressapparel,然后再次运行查询。

  1. 创建一个名为 synonyms-explicit-query.py 的文件。

  2. 将代码示例复制并粘贴到 synonyms-explicit.py 文件中。

    该代码示例包含以下阶段:

    • $search 阶段,在 title 字段中搜索单词 boat,并使用名为 transportSynonyms 的同义词映射定义在名为 transport_synonyms 的同义词源集合中搜索配置为查询单词 boat 同义词的单词。该查询还会在 title 字段中搜索单词 hat,并使用名为 attireSynonyms 的同义词映射定义在名为 attire_synonyms 的同义词源集合中搜索配置为查询单词 hat 同义词的单词。

    • $limit 阶段用于将输出限制为 10 个结果。

    • $project 阶段排除除 title 之外的所有字段,并添加一个名为 score 的字段。

    1import pymongo
    2import dns
    3
    4client = pymongo.MongoClient('<connection-string>')
    5result = client['sample_mflix']['movies'].aggregate([
    6 {
    7 '$search': {
    8 'index': 'synonyms-tutorial',
    9 'compound': {
    10 'should': [
    11 {
    12 'text': {
    13 'path': 'title',
    14 'query': 'boat',
    15 'synonyms': 'transportSynonyms'
    16 }
    17 }, {
    18 'text': {
    19 'path': 'title',
    20 'query': 'hat',
    21 'synonyms': 'attireSynonyms'
    22 }
    23 }
    24 ]
    25 }
    26 }
    27 }, {
    28 '$limit': 10
    29 }, {
    30 '$project': {
    31 '_id': 0,
    32 'title': 1,
    33 'score': {
    34 '$meta': 'searchScore'
    35 }
    36 }
    37 }
    38])
    39
    40for i in result:
    41 print(i)
  3. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的凭证。

  4. 运行以下命令来查询您的集合:

    python synonyms-explicit-query.py
    {'title': 'Fedora', 'score': 5.673145294189453}
    {'title': 'Vessel', 'score': 5.373150825500488}
    {'title': 'Boats', 'score': 4.589139938354492}
    {'title': 'And the Ship Sails On', 'score': 4.3452959060668945}
    {'title': 'Broken Vessels', 'score': 4.3452959060668945}
    {'title': 'Sailing to Paradise', 'score': 4.3452959060668945}
    {'title': 'Top Hat', 'score': 4.066137313842773}
    {'title': 'A Hatful of Rain', 'score': 4.066137313842773}
    {'title': 'Boat People', 'score': 3.711261749267578}
    {'title': 'Boat Trip', 'score': 3.711261749267578}

    Atlas Search 结果包含两个搜索术语的文档。结果包含查询术语 boattitle 字段中带有 vesselboatsail 的电影,因为我们将 boat 配置为名为 transport_synonyms 的同义词源集合中的 boatvesselsail 的同义词。

    Atlas Search 不包括搜索结果中 title 字段中带有 boatsail 的文档 vessel,因为我们没有将 vessel 配置为同义词来源集合中 boatsail 的同义词。同样,Atlas Search 不会在搜索词 sail 的结果中包含 title 字段中包含 boatvessel 的文档,因为我们没有将 sail 配置为同义词源集合中的 boatvessel。要测试这些示例,请将上述查询中 query 字段的值替换为 vesselsail,然后再次运行查询。

    结果还包含查询词 hat 的标题字段中带有 fedorahat 的电影,因为我们将 hat 配置为名为 attire_synonyms 的同义词源集合中的 hatfedoraheadgear 的同义词。

    Atlas Search 不包括搜索结果中 title 字段中带有 hatfedora 的文档 headgear,因为我们没有将 headgear 配置为同义词来源集合中 hatfedora 的同义词。同样,Atlas Search 不会在搜索词 fedora 的结果中包含 title 字段中包含 hatheadgear 的文档,因为我们没有将 fedora 配置为同义词源集合中的 hatheadgear。要测试这些示例,请将上述查询中 query 字段的值替换为 fedoraheadgear,然后再次运行查询。

后退

分面