Docs 菜单
Docs 主页
/
MongoDB Atlas
/ /

如何运行部分匹配 Atlas Search 查询

在此页面上

  • 创建 Atlas Search 索引
  • 运行区分大小写的部分匹配查询

本教程介绍如何在 sample_mflix.movies 集合上创建索引,并对 plot 字段运行部分字符串查询。要返回部分字符串查询的匹配项,可以使用以下操作符之一:

  • autocomplete 操作符,它允许在指定字段中搜索包含您在查询中所指定字符序列的单词或短语。

  • 短语操作符,允许您按您指定的术语之间的距离搜索文档的指定字段,其中包含查询字符串中的术语。

  • regex 运算符,其支持使用正则表达式在指定字段中搜索字符串。

  • 通配符操作符,允许您使用查询中的特殊字符搜索指定字段,以匹配任何字符。

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

  1. sample_mflix.movies 集合的 plot 字段上设置 Atlas Search 索引。

  2. 使用自动完成短语正则表达式通配符操作符对 sample_mflix.movies中的 plot字段运行部分字符串的 Atlas Search 查询。

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

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

在本部分中,您将在 sample_mflix.movies 集合中的 plot 字段上创建一个 Atlas 搜索索引,以便针对这些字段运行部分匹配查询。

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 字段中输入 partial-match-tutorial

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

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

6

您可以使用 Atlas 用户界面中的 Atlas Search Visual Editor 或 Atlas Search JSON Editor 来创建索引。

  1. 单击 Next(连接)。

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

  3. Index Configurations 部分中,切换以禁用 Dynamic Mapping

  4. Field Mappings 部分中,单击

  5. Add Field 显示 Add Field Mapping 窗口。

    1. 单击 Quick Start for Text Fields(连接)。

    2. 从下拉列表中选择 Search-as-you-type 模板,然后查看默认设置。

      要了解关于这些设置的更多信息,请参阅如何为自动完成的字段编制索引

    1. 单击 Quick Start for Text Fields(连接)。

    2. 从下拉列表中选择 Full Text Search 模板,然后查看默认设置。

      要了解有关这些设置的更多信息,请参阅如何索引字符串字段。

    1. 从下拉列表中选择 Customized Configuration

    2. Data Type 下拉列表中选择 String,以使用通配符操作符运行查询。

    3. 修改数据类型的默认设置,如下所示:

      用户界面字段名称
      配置
      Index Analyzer
      lucene.keyword
      Search Analyzer
      lucene.keyword
      Index Options
      offsets
      Store
      true
      Ignore Above
      Norms
      include

      要了解有关这些设置的更多信息,请参阅如何索引字符串字段。

    1. 从下拉列表中选择 Customized Configuration

    2. Data Type 下拉列表中选择 String,以使用通配符操作符运行查询。

    3. 修改数据类型的默认设置,如下所示:

      用户界面字段名称
      配置
      Index Analyzer
      lucene.keyword
      Search Analyzer
      lucene.keyword
      Index Options
      offsets
      Store
      true
      Ignore Above
      Norms
      include

      要了解有关这些设置的更多信息,请参阅如何索引字符串字段。

  6. Field Name 下拉列表中选择 plot

  7. 单击 Add 将字段添加到 Field Mappings 部分的列表中。

  8. 单击 Save Changes(连接)。

  1. 将默认索引定义替换为以下示例索引定义,用于运行查询的操作符。

    {
    "mappings": {
    "dynamic": false,
    "fields": {
    "plot": [
    {
    "type": "autocomplete",
    "tokenization": "edgeGram",
    "minGrams": 2,
    "maxGrams": 15,
    "foldDiacritics": true
    }
    ]
    }
    }
    }
    {
    "mappings": {
    "fields": {
    "plot": {
    "analyzer": "lucene.standard",
    "type": "string"
    }
    }
    }
    }
    {
    "mappings": {
    "fields": {
    "plot": {
    "analyzer": "lucene.keyword",
    "type": "string"
    }
    }
    }
    }
    {
    "mappings": {
    "fields": {
    "plot": {
    "analyzer": "lucene.keyword",
    "type": "string"
    }
    }
    }
    }
  2. 单击 Next(连接)。

7
8

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

9

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


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


可以使用 autocompletephraseregex通配符运算符来运行区分大小写的部分匹配查询。本教程使用这些运算符来搜索图表中包含指定部分字符串的影片。

在本部分,您将连接到 Atlas 集群并使用该运算符针对 sample_mflix.movies 集合中的 plot 字段运行样本查询。

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

以下查询使用运算符查询 sample_mflix.movies 集合的 plot 字段。

将以下查询复制并粘贴到 Query Editor 中,然后点击 Query Editor 中的 Search 按钮。

该查询允许执行以下操作,以将查询字符串 new purchase 与字段中的单词进行匹配:

  • 允许单词 newpurchase 出现在 plot 字段的任何位置。

  • 允许查询字符串中的两个字符变体将查询与字段中的单词匹配,但不允许更改查询字符串中的第一个字符。

  • 最多允许考虑 256 个相似词。

1[
2 {
3 "$search": {
4 "index": "partial-match-tutorial",
5 "autocomplete": {
6 "path": "plot",
7 "query": "new purchase",
8 "tokenOrder": "any",
9 "fuzzy": {
10 "maxEdits": 2,
11 "prefixLength": 1,
12 "maxExpansions": 256
13 }
14 },
15 "highlight": {
16 "path": "plot"
17 }
18 }
19 }
20]
SCORE: 3 _id: "573a13a4f29313caabd112f0"
A divorced woman and her diabetic daughter take refuge in their newly-purchased house's safe room, when three men break-in, searching for a missing fortune.
Matching fields: plot
SCORE: 3 _id: "573a13d1f29313caabd8e209"
A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need.
Matching fields: plot
SCORE: 2 _id: "573a13bef29313caabd5b62d"
Set in the near future when artificial organs can be bought on credit, it revolves around a man who struggles to make the payments on a heart he has purchased. He must
Matching fields: plot
SCORE: 2 _id: "573a13b3f29313caabd3c91e"
He is "purchased" by a wealthy television producer and taken to a desolate island where he must fight to the death against nine other condemned killers from all corners of the world, with freedom going to the sole survivor.
Matching fields: plot
SCORE: 2 _id: "573a1398f29313caabceb931"
A country boy becomes the head of a gang through the purchase of some lucky roses from an old lady.
Matching fields: plot, plot
SCORE: 1 _id: "573a13a7f29313caabd1b5ab"
An illegal Nigerian immigrant discovers the unpalatable side of London life.
Matching fields: plot
SCORE: 1 _id: "573a13a7f29313caabd1b5c0"
A young dropout falls in love with a nightclub dancer...
Matching fields: plot
SCORE: 1 _id: "573a13a7f29313caabd1b62f"
In 1990, to protect his fragile mother from a fatal shock after a long coma, a young man must keep her from learning that her beloved nation of East Germany as she knew it has disappeared.
Matching fields: plot
SCORE: 1 _id: "573a13a7f29313caabd1b6af"
Gadget once again has to fight his arch nemesis, Claw.
Matching fields: plot

查询指定了查询字符串 new purpose,其中 newpurpose 之间的位置距离最大为 5

1[
2 {
3 "$search": {
4 "index": "partial-match-tutorial",
5 "phrase": {
6 "path": "plot",
7 "query": "new purpose",
8 "slop": 5
9 },
10 "highlight": {
11 "path": "plot"
12 }
13 }
14 }
15]
SCORE: 3.7209534645080566 _id: "573a13b1f29313caabd37ae6"
The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities.
Matching fields: plot
SCORE: 1.1507558822631836 _id: "573a13bdf29313caabd58a26"
But without a hero, he loses all purpose and must find new meaning to his life.
Matching fields: plot
SCORE: 1.0041160583496094 _id: "573a1396f29313caabce5197"
An aging Pat Garrett is hired as a lawman on behalf of a group of wealthy New Mexico cattle barons--his sole purpose being to bring down his old friend Billy the Kid.
Matching fields: plot

该查询使用 (.*) 正则表达式将任意数量的字符与部分查询字符串进行匹配。

1[
2 {
3 "$search": {
4 "index": "partial-match-tutorial",
5 "regex": {
6 "path": "plot",
7 "query": "(.*)new(.*) pur(.*)"
8 }
9 }
10 }
11]
SCORE: 1 _id: "573a1397f29313caabce77d9"
fullplot: "After the Rebel base on the icy planet Hoth is taken over by the empir…"
imdb: Object
year: 1980
SCORE: 1 _id: "573a1398f29313caabceb893"
plot: "The new owner of the Cleveland Indians puts together a purposely horri…"
genres: Array
runtime: 107
SCORE: 1 _id: "573a13b1f29313caabd37ae6"
plot: "The true story of Richard Pimentel, a brilliant public speaker with a …"
genres: Array
runtime: 94
SCORE: 1 _id: "573a13d1f29313caabd8e209"
fullplot: "Theodore is a lonely man in the final stages of his divorce. When he's…"
imdb: Object
year: 2013
SCORE: 1 _id: "573a13dcf29313caabdb107a"
plot: "An adrenaline junkie walks away from a whirlwind romance and embraces …"
genres: Array
runtime: 146

查询使用查询字符串中的 * 来匹配部分查询字符串中指定单词前后的 0 个或多个字符。

1[
2 {
3 "$search": {
4 "index": "partial-match-tutorial",
5 "wildcard": {
6 "path": "plot",
7 "query": "*new* pur*"
8 }
9 }
10 }
11]
SCORE: 1 _id: "573a1397f29313caabce77d9"
fullplot: "After the Rebel base on the icy planet Hoth is taken over by the empir…"
imdb: Object
year: 1980
SCORE: 1 _id: "573a1398f29313caabceb893"
plot: "The new owner of the Cleveland Indians puts together a purposely horri…"
genres: Array
runtime: 107
SCORE: 1 _id: "573a13b1f29313caabd37ae6"
plot: "The true story of Richard Pimentel, a brilliant public speaker with a …"
genres: Array
runtime: 94
SCORE: 1 _id: "573a13d1f29313caabd8e209"
fullplot: "Theodore is a lonely man in the final stages of his divorce. When he's…"
imdb: Object
year: 2013
SCORE: 1 _id: "573a13dcf29313caabdb107a"
plot: "An adrenaline junkie walks away from a whirlwind romance and embraces …"
genres: Array
runtime: 146
6

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

1

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

2

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

use sample_mflix
3

以下查询使用该操作符查询 sample_mflix.movies 集合的 plot 字段。该查询包括:

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

  • $project 阶段排除 titleplot 以外的所有字段。

该查询允许执行以下操作,以将查询字符串 new purchase 与字段中的单词进行匹配:

  • 允许单词 newpurchase 出现在 plot 字段的任何位置。

  • 允许查询字符串中的两个字符变体将查询与字段中的单词匹配,但不允许更改查询字符串中的第一个字符。

  • 最多允许考虑 256 个相似词。

1db.movies.aggregate([
2 {
3 "$search": {
4 "index": "partial-match-tutorial",
5 "autocomplete": {
6 "path": "plot",
7 "query": "new purchase",
8 "tokenOrder": "any",
9 "fuzzy": {
10 "maxEdits": 2,
11 "prefixLength": 1,
12 "maxExpansions": 256
13 }
14 },
15 "highlight": {
16 "path": "plot"
17 }
18 }
19 },
20 {
21 "$limit": 5
22 },
23 {
24 "$project": {
25 "_id": 0,
26 "title": 1,
27 "plot": 1,
28 "highlights": { "$meta": "searchHighlights" }
29 }
30 }
31])
[
{
plot: "A divorced woman and her diabetic daughter take refuge in their newly-purchased house's safe room, when three men break-in, searching for a missing fortune.",
title: 'Panic Room',
highlights: [
{
score: 4.364492893218994,
path: 'plot',
texts: [
{
value: 'A divorced woman and her diabetic daughter take refuge in their ',
type: 'text'
},
{ value: "newly-purchased house's safe", type: 'hit' },
{
value: ' room, when three men break-in, searching for a missing fortune.',
type: 'text'
}
]
}
]
},
{
plot: "A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need.",
title: 'Her',
highlights: [
{
score: 4.198050022125244,
path: 'plot',
texts: [
{
value: 'A lonely writer develops an unlikely relationship with his ',
type: 'text'
},
{ value: 'newly purchased operating system', type: 'hit' },
{
value: " that's designed to meet his every ",
type: 'text'
},
{ value: 'need', type: 'hit' },
{ value: '.', type: 'text' }
]
}
]
},
{
plot: "Set in the near future when artificial organs can be bought on credit, it revolves around a man who struggles to make the payments on a heart he has purchased. He must therefore go on the run before said ticker is repossessed.",
title: 'Repo Men',
highlights: [
{
score: 2.6448397636413574,
path: 'plot',
texts: [
{ value: 'Set in the ', type: 'text' },
{ value: 'near future when', type: 'hit' },
{ value: ' artificial organs can be bought on credit, it revolves around a man who struggles to make the payments on a heart he has ', type: 'text' },
{ value: 'purchased. He must', type: 'hit' }
]
}
]
},
{
plot: 'A psychologically troubled novelty supplier is nudged towards a romance with an English woman, all the while being extorted by a phone-sex line run by a crooked mattress salesman, and purchasing stunning amounts of pudding.',
title: 'Punch-Drunk Love',
highlights: [
{
score: 1.2451990842819214,
path: 'plot',
texts: [
{ value: 'A psychologically troubled ', type: 'text' },
{ value: 'novelty supplier is', type: 'hit' },
{ value: ' ', type: 'text' },
{ value: 'nudged towards a', type: 'hit' },
{
value: ' romance with an English woman, all the while being extorted by a phone-sex line run by a crooked mattress salesman, and ',
type: 'text'
},
{ value: 'purchasing stunning amounts', type: 'hit' },
{ value: ' of pudding.', type: 'text' }
]
}
]
},
{
plot: 'Jack Conrad is awaiting the death penalty in a corrupt Central American prison. He is "purchased" by a wealthy television producer and taken to a desolate island where he must fight to the death against nine other condemned killers from all corners of the world, with freedom going to the sole survivor.',
title: 'The Condemned',
highlights: [
{
score: 2.94378924369812,
path: 'plot',
texts: [
{ value: 'He is "', type: 'text' },
{ value: 'purchased" by a', type: 'hit' },
{
value: ' wealthy television producer and taken to a desolate island where he must fight to the death against ',
type: 'text'
},
{ value: 'nine other condemned', type: 'hit' },
{
value: ' killers from all corners of the world, with freedom going to the sole survivor.',
type: 'text'
}
]
}
]
}
]

查询指定了查询字符串 new purpose,其中 newpurpose 之间的位置距离最大为 5

1db.movies.aggregate([
2 {
3 "$search": {
4 "index": "partial-match-tutorial",
5 "phrase": {
6 "path": "plot",
7 "query": "new purpose",
8 "slop": 5
9 },
10 "highlight": {
11 "path": "plot"
12 }
13 }
14 },
15 {
16 "$limit": 5
17 },
18 {
19 "$project": {
20 "_id": 0,
21 "plot": 1,
22 "title": 1,
23 "highlights": { "$meta": "searchHighlights" }
24 }
25 }
26])
[
{
plot: 'The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities.',
title: 'Music Within',
highlights: [
{
score: 1.9394469261169434,
path: 'plot',
texts: [
{ value: 'The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a ', type: 'text' },
{ value: 'new', type: 'hit' },
{ value: ' ', type: 'text' },
{ value: 'purpose', type: 'hit' },
{ value: ' in his landmark efforts on the behalf of Americans with disabilities.', type: 'text' }
]
}
]
},
{
plot: 'The supervillain Megamind finally defeats his nemesis, the superhero Metro Man. But without a hero, he loses all purpose and must find new meaning to his life.',
title: 'Megamind',
highlights: [
{
score: 2.90376877784729,
path: 'plot',
texts: [
{ value: 'But without a hero, he loses all ', type: 'text' },
{ value: 'purpose', type: 'hit' },
{ value: ' and must find ', type: 'text' },
{ value: 'new', type: 'hit' },
{ value: ' meaning to his life.', type: 'text' }
]
}
]
},
{
plot: 'An aging Pat Garrett is hired as a lawman on behalf of a group of wealthy New Mexico cattle barons--his sole purpose being to bring down his old friend Billy the Kid.',
title: 'Pat Garrett & Billy the Kid',
highlights: [
{
score: 2.115748405456543,
path: 'plot',
texts: [
{ value: 'An aging Pat Garrett is hired as a lawman on behalf of a group of wealthy ', type: 'text' },
{ value: 'New', type: 'hit' },
{ value: ' Mexico cattle barons--his sole ', type: 'text' },
{ value: 'purpose', type: 'hit' },
{ value: ' being to bring down his old friend Billy the Kid.', type: 'text' }
]
}
]
}
]

该查询使用 (.*) 正则表达式将任意数量的字符与部分查询字符串进行匹配。

1db.movies.aggregate([
2 {
3 "$search": {
4 "index": "partial-match-tutorial",
5 "regex": {
6 "path": "plot",
7 "query": "(.*)new(.*) pur(.*)"
8 }
9 }
10 },
11 {
12 $limit: 5
13 },
14 {
15 $project: {
16 "_id": 0,
17 "plot": 1,
18 "title": 1
19 }
20 }
21])
[
{
plot: 'After the rebels have been brutally overpowered by the Empire on their newly established base, Luke Skywalker takes advanced Jedi training with Master Yoda, while his friends are pursued by Darth Vader as part of his plan to capture Luke.',
title: 'Star Wars: Episode V - The Empire Strikes Back'
},
{
plot: "The new owner of the Cleveland Indians puts together a purposely horrible team so they'll lose and she can move the team. But when the plot is uncovered, they start winning just to spite her.",
title: 'Major League'
},
{
plot: 'The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities.',
title: 'Music Within'
},
{
plot: "A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need.",
title: 'Her'
},
{
plot: 'An adrenaline junkie walks away from a whirlwind romance and embraces a new life as a thief, though he soon finds himself pursued by veteran police officer and engaged in a turf war with a local gangster.',
title: 'Kick'
}
]

查询使用查询字符串中的 * 来匹配部分查询字符串中指定单词前后的 0 个或多个字符。

1db.movies.aggregate([
2 {
3 "$search": {
4 "index": "partial-match-tutorial",
5 "wildcard": {
6 "path": "plot",
7 "query": "*new* pur*"
8 }
9 }
10 },
11 {
12 "$limit": 5
13 },
14 {
15 "$project": {
16 "_id": 0,
17 "plot": 1
18 }
19 }
20])
[
{
plot: 'After the rebels have been brutally overpowered by the Empire on their newly established base, Luke Skywalker takes advanced Jedi training with Master Yoda, while his friends are pursued by Darth Vader as part of his plan to capture Luke.',
title: 'Star Wars: Episode V - The Empire Strikes Back'
},
{
plot: "The new owner of the Cleveland Indians puts together a purposely horrible team so they'll lose and she can move the team. But when the plot is uncovered, they start winning just to spite her.",
title: 'Major League'
},
{
plot: 'The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities.',
title: 'Music Within'
},
{
plot: "A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need.",
title: 'Her'
},
{
plot: 'An adrenaline junkie walks away from a whirlwind romance and embraces a new life as a thief, though he soon finds himself pursued by veteran police officer and engaged in a turf war with a local gangster.',
title: 'Kick'
}
]
1

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

2

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

3

以下查询使用该操作符查询 sample_mflix.movies 集合的 plot 字段。该查询包括:

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

  • $project 阶段排除 titleplot 以外的所有字段。

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

  1. 单击 Aggregations 标签页。

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

    该查询允许执行以下操作,以将查询字符串 new purchase 与字段中的单词进行匹配:

    • 允许单词 newpurchase 出现在 plot 字段的任何位置。

    • 允许查询字符串中的两个字符变体将查询与字段中的单词匹配,但不允许更改查询字符串中的第一个字符。

    • 最多允许考虑 256 个相似词。

    管道阶段
    查询
    $search
    {
    "index": "partial-match-tutorial",
    "autocomplete": {
    "path": "plot",
    "query": "new purchase",
    "tokenOrder": "any",
    "fuzzy": {
    "maxEdits": 2,
    "prefixLength": 1,
    "maxExpansions": 256
    }
    },
    "highlight": {
    "path": "plot"
    }
    }
    $limit
    5
    $project
    {
    "_id": 0,
    "title": 1,
    "plot": 1,
    "highlights": { "$meta": "searchHighlights" }
    }

    查询指定了查询字符串 new purpose,其中 newpurpose 之间的位置距离最大为 5

    管道阶段
    查询
    $search
    {
    "index": "partial-match-tutorial",
    "phrase": {
    "path": "plot",
    "query": "new purpose",
    "slop": 5
    },
    "highlight": {
    "path": "plot"
    }
    }
    $limit
    5
    $project
    {
    "_id": 0,
    "title": 1,
    "plot": 1,
    "highlights": { "$meta": "searchHighlights" }
    }

    该查询使用 (.*) 正则表达式将任意数量的字符与部分查询字符串进行匹配。

    管道阶段
    查询
    $search
    {
    "index": "partial-match-tutorial",
    "regex": {
    "path": "plot",
    "query": "(.*)new(.*) pur(.*)"
    }
    }
    $limit
    5
    $project
    {
    "_id": 0,
    "title": 1,
    "plot": 1
    }

    查询使用查询字符串中的 * 来匹配部分查询字符串中指定单词前后的 0 个或多个字符。

    管道阶段
    查询
    $search
    {
    "index": "partial-match-tutorial",
    "wildcard": {
    "path": "plot",
    "query": "*new* pur*"
    }
    }
    $limit
    5
    $project
    {
    "_id": 0,
    "title": 1,
    "plot": 1
    }

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

1[
2 {
3 plot: "A divorced woman and her diabetic daughter take refuge in their newly-purchased house's safe room, when three men break-in, searching for a missing fortune.",
4 title: 'Panic Room',
5 highlights: [
6 {
7 score: 4.364492893218994,
8 path: 'plot',
9 texts: [
10 {
11 value: 'A divorced woman and her diabetic daughter take refuge in their ',
12 type: 'text'
13 },
14 { value: "newly-purchased house's safe", type: 'hit' },
15 {
16 value: ' room, when three men break-in, searching for a missing fortune.',
17 type: 'text'
18 }
19 ]
20 }
21 ]
22 },
23 {
24 plot: "A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need.",
25 title: 'Her',
26 highlights: [
27 {
28 score: 4.198050022125244,
29 path: 'plot',
30 texts: [
31 {
32 value: 'A lonely writer develops an unlikely relationship with his ',
33 type: 'text'
34 },
35 { value: 'newly purchased operating system', type: 'hit' },
36 {
37 value: " that's designed to meet his every ",
38 type: 'text'
39 },
40 { value: 'need', type: 'hit' },
41 { value: '.', type: 'text' }
42 ]
43 }
44 ]
45 },
46 {
47 plot: "Set in the near future when artificial organs can be bought on credit, it revolves around a man who struggles to make the payments on a heart he has purchased. He must therefore go on the run before said ticker is repossessed.",
48 title: 'Repo Men',
49 highlights: [
50 {
51 score: 2.6448397636413574,
52 path: 'plot',
53 texts: [
54 { value: 'Set in the ', type: 'text' },
55 { value: 'near future when', type: 'hit' },
56 { value: ' artificial organs can be bought on credit, it revolves around a man who struggles to make the payments on a heart he has ', type: 'text' },
57 { value: 'purchased. He must', type: 'hit' }
58 ]
59 }
60 ]
61 },
62 {
63 plot: 'A psychologically troubled novelty supplier is nudged towards a romance with an English woman, all the while being extorted by a phone-sex line run by a crooked mattress salesman, and purchasing stunning amounts of pudding.',
64 title: 'Punch-Drunk Love',
65 highlights: [
66 {
67 score: 1.2451990842819214,
68 path: 'plot',
69 texts: [
70 { value: 'A psychologically troubled ', type: 'text' },
71 { value: 'novelty supplier is', type: 'hit' },
72 { value: ' ', type: 'text' },
73 { value: 'nudged towards a', type: 'hit' },
74 {
75 value: ' romance with an English woman, all the while being extorted by a phone-sex line run by a crooked mattress salesman, and ',
76 type: 'text'
77 },
78 { value: 'purchasing stunning amounts', type: 'hit' },
79 { value: ' of pudding.', type: 'text' }
80 ]
81 }
82 ]
83 },
84 {
85 plot: 'Jack Conrad is awaiting the death penalty in a corrupt Central American prison. He is "purchased" by a wealthy television producer and taken to a desolate island where he must fight to the death against nine other condemned killers from all corners of the world, with freedom going to the sole survivor.',
86 title: 'The Condemned',
87 highlights: [
88 {
89 score: 2.94378924369812,
90 path: 'plot',
91 texts: [
92 { value: 'He is "', type: 'text' },
93 { value: 'purchased" by a', type: 'hit' },
94 {
95 value: ' wealthy television producer and taken to a desolate island where he must fight to the death against ',
96 type: 'text'
97 },
98 { value: 'nine other condemned', type: 'hit' },
99 {
100 value: ' killers from all corners of the world, with freedom going to the sole survivor.',
101 type: 'text'
102 }
103 ]
104 }
105 ]
106 }
107]
1[
2 {
3 plot: 'The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities.',
4 title: 'Music Within',
5 highlights: [
6 {
7 score: 1.9394469261169434,
8 path: 'plot',
9 texts: [
10 { value: 'The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a ', type: 'text' },
11 { value: 'new', type: 'hit' },
12 { value: ' ', type: 'text' },
13 { value: 'purpose', type: 'hit' },
14 { value: ' in his landmark efforts on the behalf of Americans with disabilities.', type: 'text' }
15 ]
16 }
17 ]
18 },
19 {
20 plot: 'The supervillain Megamind finally defeats his nemesis, the superhero Metro Man. But without a hero, he loses all purpose and must find new meaning to his life.',
21 title: 'Megamind',
22 highlights: [
23 {
24 score: 2.90376877784729,
25 path: 'plot',
26 texts: [
27 { value: 'But without a hero, he loses all ', type: 'text' },
28 { value: 'purpose', type: 'hit' },
29 { value: ' and must find ', type: 'text' },
30 { value: 'new', type: 'hit' },
31 { value: ' meaning to his life.', type: 'text' }
32 ]
33 }
34 ]
35 },
36 {
37 plot: 'An aging Pat Garrett is hired as a lawman on behalf of a group of wealthy New Mexico cattle barons--his sole purpose being to bring down his old friend Billy the Kid.',
38 title: 'Pat Garrett & Billy the Kid',
39 highlights: [
40 {
41 score: 2.115748405456543,
42 path: 'plot',
43 texts: [
44 { value: 'An aging Pat Garrett is hired as a lawman on behalf of a group of wealthy ', type: 'text' },
45 { value: 'New', type: 'hit' },
46 { value: ' Mexico cattle barons--his sole ', type: 'text' },
47 { value: 'purpose', type: 'hit' },
48 { value: ' being to bring down his old friend Billy the Kid.', type: 'text' }
49 ]
50 }
51 ]
52 }
53]
1[
2 {
3 plot: 'After the rebels have been brutally overpowered by the Empire on their newly established base, Luke Skywalker takes advanced Jedi training with Master Yoda, while his friends are pursued by Darth Vader as part of his plan to capture Luke.',
4 title: 'Star Wars: Episode V - The Empire Strikes Back'
5 },
6 {
7 plot: "The new owner of the Cleveland Indians puts together a purposely horrible team so they'll lose and she can move the team. But when the plot is uncovered, they start winning just to spite her.",
8 title: 'Major League'
9 },
10 {
11 plot: 'The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities.',
12 title: 'Music Within'
13 },
14 {
15 plot: "A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need.",
16 title: 'Her'
17 },
18 {
19 plot: 'An adrenaline junkie walks away from a whirlwind romance and embraces a new life as a thief, though he soon finds himself pursued by veteran police officer and engaged in a turf war with a local gangster.',
20 title: 'Kick'
21 }
22]
1[
2 {
3 plot: 'After the rebels have been brutally overpowered by the Empire on their newly established base, Luke Skywalker takes advanced Jedi training with Master Yoda, while his friends are pursued by Darth Vader as part of his plan to capture Luke.',
4 title: 'Star Wars: Episode V - The Empire Strikes Back'
5 },
6 {
7 plot: "The new owner of the Cleveland Indians puts together a purposely horrible team so they'll lose and she can move the team. But when the plot is uncovered, they start winning just to spite her.",
8 title: 'Major League'
9 },
10 {
11 plot: 'The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities.',
12 title: 'Music Within'
13 },
14 {
15 plot: "A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need.",
16 title: 'Her'
17 },
18 {
19 plot: 'An adrenaline junkie walks away from a whirlwind romance and embraces a new life as a thief, though he soon finds himself pursued by veteran police officer and engaged in a turf war with a local gangster.',
20 title: 'Kick'
21 }
22]
1
  1. 创建一个名为 partial-match-example 的新目录,并使用 dotnet new 命令初始化项目。

    mkdir partial-match-example
    cd partial-match-example
    dotnet new console
  2. 将 .NET/C# 驱动程序作为依赖项添加到项目中。

    dotnet add package MongoDB.Driver
2
  1. Program.cs文件的内容替换为以下代码。

    此代码示例将执行以下任务:

    • 导入mongodb包和依赖项。

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

    • 运行使用以下项的查询:

      • $search 寻找术语的阶段

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

      • $project 阶段,用于排除除以下字段之外的所有字段 title
        plot
    • 遍历游标以打印与查询匹配的文档。

    该查询允许执行以下操作,以将查询字符串 new purchase 与字段中的单词进行匹配:

    • 允许单词 newpurchase 出现在 plot 字段的任何位置。

    • 允许查询字符串中的两个字符变体将查询与字段中的单词匹配,但不允许更改查询字符串中的第一个字符。

    • 最多允许考虑 256 个相似词。

    1using MongoDB.Bson;
    2using MongoDB.Bson.Serialization.Attributes;
    3using MongoDB.Bson.Serialization.Conventions;
    4using MongoDB.Driver;
    5using MongoDB.Driver.Search;
    6
    7public class PartialAutocomplete
    8{
    9 private const string MongoConnectionString = "<connection-string>";
    10
    11 public static void Main(string[] args) {
    12 // allow automapping of the camelCase database fields to our MovieDocument
    13 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
    14 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
    15
    16 // connect to your Atlas cluster
    17 var mongoClient = new MongoClient(MongoConnectionString);
    18 var mflixDatabase = mongoClient.GetDatabase("sample_mflix");
    19 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies");
    20
    21 // define fuzzy options
    22 SearchFuzzyOptions fuzzyOptions = new SearchFuzzyOptions()
    23 {
    24 MaxEdits = 2,
    25 PrefixLength = 1,
    26 MaxExpansions = 256
    27 };
    28
    29 // define and run pipeline
    30 var results = moviesCollection.Aggregate()
    31 .Search(Builders<MovieDocument>.Search.Autocomplete(movie => movie.Plot, "new purchase", SearchAutocompleteTokenOrder.Any, fuzzy: fuzzyOptions), new SearchHighlightOptions<MovieDocument>(movie => movie.Plot),
    32 indexName: "partial-match-tutorial")
    33 .Project<MovieDocument>(Builders<MovieDocument>.Projection
    34 .Include(movie => movie.Plot)
    35 .Include(movie => movie.Title)
    36 .Exclude(movie => movie.Id)
    37 .MetaSearchHighlights("highlights"))
    38 .Limit(5)
    39 .ToList();
    40
    41 // print results
    42 foreach (var movie in results) {
    43 Console.WriteLine(movie.ToJson());
    44 }
    45 }
    46}
    47
    48[BsonIgnoreExtraElements]
    49public class MovieDocument {
    50 [BsonIgnoreIfDefault]
    51 public ObjectId Id { get; set; }
    52 public string Plot { get; set; }
    53 public string Title { get; set; }
    54 [BsonElement("highlights")]
    55 public List<SearchHighlight> Highlights { get; set; }
    56}

    查询指定了查询字符串 new purpose,其中 newpurpose 之间的位置距离最大为 5

    1using MongoDB.Bson;
    2using MongoDB.Bson.Serialization.Attributes;
    3using MongoDB.Bson.Serialization.Conventions;
    4using MongoDB.Driver;
    5using MongoDB.Driver.Search;
    6
    7public class PartialPhrase
    8{
    9 private const string MongoConnectionString = "<connection-string>";
    10
    11 public static void Main(string[] args) {
    12 // allow automapping of the camelCase database fields to our MovieDocument
    13 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
    14 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
    15
    16 // connect to your Atlas cluster
    17 var mongoClient = new MongoClient(MongoConnectionString);
    18 var mflixDatabase = mongoClient.GetDatabase("sample_mflix");
    19 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies");
    20
    21 // define and run pipeline
    22 var results = moviesCollection.Aggregate()
    23 .Search(Builders<MovieDocument>.Search.Phrase(movie => movie.Plot, "new purpose", 5), new SearchHighlightOptions<MovieDocument>(movie => movie.Plot),
    24 indexName: "partial-match-tutorial")
    25 .Project<MovieDocument>(Builders<MovieDocument>.Projection
    26 .Include(movie => movie.Plot)
    27 .Include(movie => movie.Title)
    28 .Exclude(movie => movie.Id)
    29 .MetaSearchHighlights("highlights"))
    30 .Limit(5)
    31 .ToList();
    32
    33 // print results
    34 foreach (var movie in results) {
    35 Console.WriteLine(movie.ToJson());
    36 }
    37 }
    38}
    39
    40[BsonIgnoreExtraElements]
    41public class MovieDocument {
    42 [BsonIgnoreIfDefault]
    43 public ObjectId Id { get; set; }
    44 public string Plot { get; set; }
    45 public string Title { get; set; }
    46 [BsonElement("highlights")]
    47 public List<SearchHighlight> Highlights { get; set; }
    48}

    该查询使用 (.*) 正则表达式将任意数量的字符与部分查询字符串进行匹配。

    1using MongoDB.Bson;
    2using MongoDB.Bson.Serialization.Attributes;
    3using MongoDB.Bson.Serialization.Conventions;
    4using MongoDB.Driver;
    5using MongoDB.Driver.Search;
    6
    7public class PartialRegex
    8{
    9 private const string MongoConnectionString = "<connection-string>";
    10
    11 public static void Main(string[] args) {
    12 // allow automapping of the camelCase database fields to our MovieDocument
    13 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
    14 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
    15
    16 // connect to your Atlas cluster
    17 var mongoClient = new MongoClient(MongoConnectionString);
    18 var mflixDatabase = mongoClient.GetDatabase("sample_mflix");
    19 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies");
    20
    21 // define and run pipeline
    22 var results = moviesCollection.Aggregate()
    23 .Search(Builders<MovieDocument>.Search.Regex(movie => movie.Plot, "(.*)new(.*) pur(.*)"),
    24 indexName: "partial-match-tutorial")
    25 .Project<MovieDocument>(Builders<MovieDocument>.Projection
    26 .Include(movie => movie.Plot)
    27 .Include(movie => movie.Title)
    28 .Exclude(movie => movie.Id))
    29 .Limit(5)
    30 .ToList();
    31
    32 // print results
    33 foreach (var movie in results) {
    34 Console.WriteLine(movie.ToJson());
    35 }
    36 }
    37}
    38
    39[BsonIgnoreExtraElements]
    40public class MovieDocument {
    41 [BsonIgnoreIfDefault]
    42 public ObjectId Id { get; set; }
    43 public string Plot { get; set; }
    44 public string Title { get; set; }
    45}

    查询使用查询字符串中的 * 来匹配部分查询字符串中指定单词前后的 0 个或多个字符。

    1using MongoDB.Bson;
    2using MongoDB.Bson.Serialization.Attributes;
    3using MongoDB.Bson.Serialization.Conventions;
    4using MongoDB.Driver;
    5using MongoDB.Driver.Search;
    6
    7public class PartialWildcard
    8{
    9 private const string MongoConnectionString = "<connection-string>";
    10
    11 public static void Main(string[] args) {
    12 // allow automapping of the camelCase database fields to our MovieDocument
    13 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
    14 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
    15
    16 // connect to your Atlas cluster
    17 var mongoClient = new MongoClient(MongoConnectionString);
    18 var mflixDatabase = mongoClient.GetDatabase("sample_mflix");
    19 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies");
    20
    21 // define and run pipeline
    22 var results = moviesCollection.Aggregate()
    23 .Search(Builders<MovieDocument>.Search.Wildcard(movie => movie.Plot, "*new* pur*"),
    24 indexName: "partial-match-tutorial")
    25 .Project<MovieDocument>(Builders<MovieDocument>.Projection
    26 .Include(movie => movie.Plot)
    27 .Include(movie => movie.Title)
    28 .Exclude(movie => movie.Id))
    29 .Limit(5)
    30 .ToList();
    31
    32 // print results
    33 foreach (var movie in results) {
    34 Console.WriteLine(movie.ToJson());
    35 }
    36 }
    37}
    38
    39[BsonIgnoreExtraElements]
    40public class MovieDocument {
    41 [BsonIgnoreIfDefault]
    42 public ObjectId Id { get; set; }
    43 public string Plot { get; set; }
    44 public string Title { get; set; }
    45}
  2. 在运行示例之前,请将 <connection-string> 替换为 Atlas 连接字符串。确保您的连接字符串包含数据库用户的档案。要了解详情,请参阅通过驱动程序连接。

3
dotnet run partial-match-example.csproj
{
"plot" : "A divorced woman and her diabetic daughter take refuge in
their newly-purchased house's safe room, when three men break-in,
searching for a missing fortune.",
"title" : "Panic Room",
"highlights" : [{
"path" : "plot",
"score" : 4.3644928932189941,
"texts" : [
{ "type" : "Text", "value" : "A divorced woman and her diabetic daughter take refuge in their " },
{ "type" : "Hit", "value" : "newly-purchased house's safe" },
{ "type" : "Text", "value" : " room, when three men break-in, searching for a missing fortune." }]
}]
}
{
"plot" : "A lonely writer develops an unlikely relationship with his
newly purchased operating system that's designed to meet his every
need.",
"title" : "Her",
"highlights" : [{
"path" : "plot",
"score" : 4.1980500221252441,
"texts" : [
{ "type" : "Text", "value" : "A lonely writer develops an unlikely relationship with his " },
{ "type" : "Hit", "value" : "newly purchased operating system" },
{ "type" : "Text", "value" : " that's designed to meet his every " },
{ "type" : "Hit", "value" : "need" },
{ "type" : "Text", "value" : "." }]
}]
}
{
"plot" : "Set in the near future when artificial organs can be
bought on credit, it revolves around a man who struggles to make the
payments on a heart he has purchased. He must therefore go on the
run before said ticker is repossessed.",
"title" : "Repo Men",
"highlights" : [{
"path" : "plot",
"score" : 2.6448397636413574,
"texts" : [
{ "type" : "Text", "value" : "Set in the " },
{ "type" : "Hit", "value" : "near future when" },
{ "type" : "Text", "value" : " artificial organs can be bought on credit, it revolves around a man who struggles to make the payments on a heart he has " },
{ "type" : "Hit", "value" : "purchased. He must" }]
}]
}
{
"plot" : "A psychologically troubled novelty supplier is nudged
towards a romance with an English woman, all the while being
extorted by a phone-sex line run by a crooked mattress salesman, and
purchasing stunning amounts of pudding.",
"title" : "Punch-Drunk Love",
"highlights" : [{
"path" : "plot",
"score" : 1.2451990842819214,
"texts" : [
{ "type" : "Text", "value" : "A psychologically troubled " },
{ "type" : "Hit", "value" : "novelty supplier is" },
{ "type" : "Text", "value" : " " },
{ "type" : "Hit", "value" : "nudged towards a" },
{ "type" : "Text", "value" : " romance with an English woman, all the while being extorted by a phone-sex line run by a crooked mattress salesman, and " },
{ "type" : "Hit", "value" : "purchasing stunning amounts" },
{ "type" : "Text", "value" : " of pudding." }]
}]
}
{
"plot" : "Jack Conrad is awaiting the death penalty in a corrupt
Central American prison. He is \"purchased\" by a wealthy television
producer and taken to a desolate island where he must fight to the
death against nine other condemned killers from all corners of the
world, with freedom going to the sole survivor.",
"title" : "The Condemned",
"highlights" : [{
"path" : "plot",
"score" : 2.9437892436981201,
"texts" : [
{ "type" : "Text", "value" : "He is \"" },
{ "type" : "Hit", "value" : "purchased\" by a" },
{ "type" : "Text", "value" : " wealthy television producer and taken to a desolate island where he must fight to the death against " },
{ "type" : "Hit", "value" : "nine other condemned" },
{ "type" : "Text", "value" : " killers from all corners of the world, with freedom going to the sole survivor." }]
}]
}
dotnet run partial-match-example.csproj
{
"plot" : "The true story of Richard Pimentel, a brilliant public
speaker with a troubled past, who returns from Vietnam severely
hearing -impaired and finds a new purpose in his landmark efforts on
the behalf of Americans with disabilities.",
"title" : "Music Within",
"highlights" : [{
"path" : "plot",
"score" : 1.9394469261169434,
"texts" : [
{ "type" : "Text", "value" : "The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a " },
{ "type" : "Hit", "value" : "new" },
{ "type" : "Text", "value" : " " },
{ "type" : "Hit", "value" : "purpose" },
{ "type" : "Text", "value" : " in his landmark efforts on the behalf of Americans with disabilities." }]
}]
}
{
"plot" : "The supervillain Megamind finally defeats his nemesis, the
superhero Metro Man. But without a hero, he loses all purpose and
must find new meaning to his life.",
"title" : "Megamind",
"highlights" : [{
"path" : "plot",
"score" : 2.90376877784729,
"texts" : [
{ "type" : "Text", "value" : "But without a hero, he loses all " },
{ "type" : "Hit", "value" : "purpose" },
{ "type" : "Text", "value" : " and must find " },
{ "type" : "Hit", "value" : "new" },
{ "type" : "Text", "value" : " meaning to his life." }]
}]
}
{
"plot" : "An aging Pat Garrett is hired as a lawman on behalf of a
group of wealthy New Mexico cattle barons--his sole purpose being to
bring down his old friend Billy the Kid.",
"title" : "Pat Garrett & Billy the Kid",
"highlights" : [{
"path" : "plot",
"score" : 2.115748405456543,
"texts" : [
{ "type" : "Text", "value" : "An aging Pat Garrett is hired as a lawman on behalf of a group of wealthy " },
{ "type" : "Hit", "value" : "New" },
{ "type" : "Text", "value" : " Mexico cattle barons--his sole " },
{ "type" : "Hit", "value" : "purpose" },
{ "type" : "Text", "value" : " being to bring down his old friend Billy the Kid." }]
}]
}
dotnet run partial-match-example.csproj
{
"plot" : "After the rebels have been brutally overpowered by the
Empire on their newly established base, Luke Skywalker takes
advanced Jedi training with Master Yoda, while his friends are
pursued by Darth Vader as part of his plan to capture Luke.",
"title" : "Star Wars: Episode V - The Empire Strikes Back"
}
{
"plot" : "The new owner of the Cleveland Indians puts together a
purposely horrible team so they'll lose and she can move the team.
But when the plot is uncovered, they start winning just to spite
her.",
"title" : "Major League"
}
{
"plot" : "The true story of Richard Pimentel, a brilliant public
speaker with a troubled past, who returns from Vietnam severely
hearing -impaired and finds a new purpose in his landmark efforts on
the behalf of Americans with disabilities.",
"title" : "Music Within"
}
{
"plot" : "A lonely writer develops an unlikely relationship with his
newly purchased operating system that's designed to meet his every
need.",
"title" : "Her"
}
{
"plot" : "An adrenaline junkie walks away from a whirlwind romance
and embraces a new life as a thief, though he soon finds himself
pursued by veteran police officer and engaged in a turf war with a
local gangster.",
"title" : "Kick"
}
dotnet run partial-match-example.csproj
{
"plot" : "After the rebels have been brutally overpowered by the
Empire on their newly established base, Luke Skywalker takes
advanced Jedi training with Master Yoda, while his friends are
pursued by Darth Vader as part of his plan to capture Luke.",
"title" : "Star Wars: Episode V - The Empire Strikes Back"
}
{
"plot" : "The new owner of the Cleveland Indians puts together a
purposely horrible team so they'll lose and she can move the team.
But when the plot is uncovered, they start winning just to spite
her.",
"title" : "Major League"
}
{
"plot" : "The true story of Richard Pimentel, a brilliant public
speaker with a troubled past, who returns from Vietnam severely
hearing -impaired and finds a new purpose in his landmark efforts on
the behalf of Americans with disabilities.",
"title" : "Music Within"
}
{
"plot" : "A lonely writer develops an unlikely relationship with his
newly purchased operating system that's designed to meet his every
need.",
"title" : "Her"
}
{
"plot" : "An adrenaline junkie walks away from a whirlwind romance
and embraces a new life as a thief, though he soon finds himself
pursued by veteran police officer and engaged in a turf war with a
local gangster.",
"title" : "Kick"
}
1
2

以下查询使用该操作符查询 sample_mflix.movies 集合的 plot 字段。该查询包括:

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

  • $project 阶段排除 titleplot 以外的所有字段。

该查询允许执行以下操作,以将查询字符串 new purchase 与字段中的单词进行匹配:

  • 允许单词 newpurchase 出现在 plot 字段的任何位置。

  • 允许查询字符串中的两个字符变体将查询与字段中的单词匹配,但不允许更改查询字符串中的第一个字符。

  • 最多允许考虑 256 个相似词。

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 plot string `bson:"Plot,omitempty"`
17}
18
19func main() {
20 var err error
21 // connect to the Atlas cluster
22 ctx := context.Background()
23 client, err := mongo.Connect(ctx, options.Client().ApplyURI("<connection-string>"))
24 if err != nil {
25 panic(err)
26 }
27 defer client.Disconnect(ctx)
28 // set namespace
29 collection := client.Database("sample_mflix").Collection("movies")
30 // define pipeline
31 searchStage := bson.D{{"$search", bson.M{
32 "index": "partial-match-tutorial",
33 "autocomplete": bson.M{
34 "path": "plot", "query": "new purchase", "tokenOrder": "any", "fuzzy": bson.M{
35 "maxEdits": 2, "prefixLength": 1, "maxExpansions": 256},
36 },
37 "highlight": bson.D{
38 {"path", "plot"},
39 },
40 }}}
41 limitStage := bson.D{{"$limit", 5}}
42 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"plot", 1}, {"_id", 0}, {"highlights", bson.D{{"$meta", "searchHighlights"}}}}}}
43 // specify the amount of time the operation can run on the server
44 opts := options.Aggregate().SetMaxTime(5 * time.Second)
45 // run pipeline
46 cursor, err := collection.Aggregate(ctx, mongo.Pipeline{searchStage, limitStage, projectStage}, opts)
47 if err != nil {
48 panic(err)
49 }
50 // print results
51 var results []bson.D
52 if err = cursor.All(context.TODO(), &results); err != nil {
53 panic(err)
54 }
55 for _, result := range results {
56 fmt.Println(result)
57 }
58}

查询指定了查询字符串 new purpose,其中 newpurpose 之间的位置距离最大为 5

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 plot string `bson:"Plot,omitempty"`
17}
18
19func main() {
20 var err error
21 // connect to the Atlas cluster
22 ctx := context.Background()
23 client, err := mongo.Connect(ctx, options.Client().ApplyURI("<connection-string>"))
24 if err != nil {
25 panic(err)
26 }
27 defer client.Disconnect(ctx)
28 // set namespace
29 collection := client.Database("sample_mflix").Collection("movies")
30 // define pipeline
31 searchStage := bson.D{{"$search", bson.M{
32 "index": "partial-match-tutorial",
33 "phrase": bson.D{{"path", "plot"}, {"query", "new purpose"}, {"slop", 5}},
34 "highlight": bson.D{{"path", "plot"}},
35 }}}
36 limitStage := bson.D{{"$limit", 5}}
37 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"plot", 1}, {"_id", 0}, {"highlights", bson.D{{"$meta", "searchHighlights"}}}}}}
38 // specify the amount of time the operation can run on the server
39 opts := options.Aggregate().SetMaxTime(5 * time.Second)
40 // run pipeline
41 cursor, err := collection.Aggregate(ctx, mongo.Pipeline{searchStage, limitStage, projectStage}, opts)
42 if err != nil {
43 panic(err)
44 }
45 // print results
46 var results []bson.D
47 if err = cursor.All(context.TODO(), &results); err != nil {
48 panic(err)
49 }
50 for _, result := range results {
51 fmt.Println(result)
52 }
53}

该查询使用 (.*) 正则表达式将任意数量的字符与部分查询字符串进行匹配。

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 plot string `bson:"Plot,omitempty"`
17}
18
19func main() {
20 var err error
21 // connect to the Atlas cluster
22 ctx := context.Background()
23 client, err := mongo.Connect(ctx, options.Client().ApplyURI("<connection-string>"))
24 if err != nil {
25 panic(err)
26 }
27 defer client.Disconnect(ctx)
28 // set namespace
29 collection := client.Database("sample_mflix").Collection("movies")
30 // define pipeline
31 searchStage := bson.D{{"$search", bson.M{
32 "index": "partial-match-tutorial",
33 "regex": bson.D{{"path", "plot"}, {"query", "(.*)new(.*) pur(.*)"}},
34 }}}
35 limitStage := bson.D{{"$limit", 5}}
36 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"plot", 1}, {"_id", 0}}}}
37 // specify the amount of time the operation can run on the server
38 opts := options.Aggregate().SetMaxTime(5 * time.Second)
39 // run pipeline
40 cursor, err := collection.Aggregate(ctx, mongo.Pipeline{searchStage, limitStage, projectStage}, opts)
41 if err != nil {
42 panic(err)
43 }
44 // print results
45 var results []bson.D
46 if err = cursor.All(context.TODO(), &results); err != nil {
47 panic(err)
48 }
49 for _, result := range results {
50 fmt.Println(result)
51 }
52}

查询使用查询字符串中的 * 来匹配部分查询字符串中指定单词前后的 0 个或多个字符。

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 plot string `bson:"Plot,omitempty"`
17}
18
19func main() {
20 var err error
21 // connect to the Atlas cluster
22 ctx := context.Background()
23 client, err := mongo.Connect(ctx, options.Client().ApplyURI("<connection-string>"))
24 if err != nil {
25 panic(err)
26 }
27 defer client.Disconnect(ctx)
28 // set namespace
29 collection := client.Database("sample_mflix").Collection("movies")
30 // define pipeline
31 searchStage := bson.D{{"$search", bson.M{
32 "index": "partial-match-tutorial",
33 "wildcard": bson.D{{"path", "plot"}, {"query", "*new* pur*"}},
34 }}}
35 limitStage := bson.D{{"$limit", 5}}
36 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"plot", 1}, {"_id", 0}}}}
37 // specify the amount of time the operation can run on the server
38 opts := options.Aggregate().SetMaxTime(5 * time.Second)
39 // run pipeline
40 cursor, err := collection.Aggregate(ctx, mongo.Pipeline{searchStage, limitStage, projectStage}, opts)
41 if err != nil {
42 panic(err)
43 }
44 // print results
45 var results []bson.D
46 if err = cursor.All(context.TODO(), &results); err != nil {
47 panic(err)
48 }
49 for _, result := range results {
50 fmt.Println(result)
51 }
52}

注意

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

3
go run partial-match-query.go
[
{plot A divorced woman and her diabetic daughter take refuge in their newly-purchased house's safe room, when three men break-in, searching for a missing fortune.}
{title Panic Room}
{highlights [
[
{score 4.364492893218994}
{path plot}
{texts [
[{value A divorced woman and her diabetic daughter take refuge in their } {type text}]
[{value newly-purchased house's safe} {type hit}]
[{value room, when three men break-in, searching for a missing fortune.} {type text}]
]}
]
]}
]
[
{plot A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need.}
{title Her}
{highlights [
[
{score 4.198050022125244}
{path plot}
{texts [
[{value A lonely writer develops an unlikely relationship with his } {type text}]
[{value newly purchased operating system} {type hit}]
[{value that's designed to meet his every } {type text}]
[{value need} {type hit}]
[{value .} {type text}]
]}
]
]}
]
[
{plot Set in the near future when artificial organs can be bought on credit, it revolves around a man who struggles to make the payments on a heart he has purchased. He must therefore go on the run before said ticker is repossessed.}
{title Repo Men}
{highlights [
[
{score 2.6448397636413574}
{path plot}
{texts [
[{value Set in the } {type text}]
[{value near future when} {type hit}]
[{value artificial organs can be bought on credit, it revolves around a man who struggles to make the payments on a heart he has } {type text}]
[{value purchased. He must} {type hit}]
]}
]
]}
]
[
{plot A psychologically troubled novelty supplier is nudged towards a romance with an English woman, all the while being extorted by a phone-sex line run by a crooked mattress salesman, and purchasing stunning amounts of pudding.}
{title Punch-Drunk Love}
{highlights [
[
{score 1.2451990842819214}
{path plot}
{texts [
[{value A psychologically troubled } {type text}]
[{value novelty supplier is} {type hit}]
[{value } {type text}]
[{value nudged towards a} {type hit}]
[{value romance with an English woman, all the while being extorted by a phone-sex line run by a crooked mattress salesman, and } {type text}]
[{value purchasing stunning amounts} {type hit}]
[{value of pudding.} {type text}]
]}
]
]}
]
[
{plot Jack Conrad is awaiting the death penalty in a corrupt Central American prison. He is "purchased" by a wealthy television producer and taken to a desolate island where he must fight to the death against nine other condemned killers from all corners of the world, with freedom going to the sole survivor.}
{title The Condemned}
{highlights [
[
{score 2.94378924369812}
{path plot}
{texts [
[{value He is "} {type text}]
[{value purchased" by a} {type hit}]
[{value wealthy television producer and taken to a desolate island where he must fight to the death against } {type text}]
[{value nine other condemned} {type hit}]
[{value killers from all corners of the world, with freedom going to the sole survivor.} {type text}]
]}
]
]}
]
go run partial-match-query.go
[
{plot The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities.}
{title Music Within}
{highlights [[
{score 1.9394469261169434}
{path plot}
{texts [
[{value The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a } {type text}]
[{value new} {type hit}]
[{value } {type text}]
[{value purpose} {type hit}]
[{value in his landmark efforts on the behalf of Americans with disabilities.} {type text}
]
]}
]]}
]
[
{plot The supervillain Megamind finally defeats his nemesis, the superhero Metro Man. But without a hero, he loses all purpose and must find new meaning to his life.}
{title Megamind}
{highlights [[
{score 2.90376877784729}
{path plot}
{texts [
[{value But without a hero, he loses all } {type text}]
[{value purpose} {type hit}]
[{value and must find } {type text}]
[{value new} {type hit}]
[{value meaning to his life.} {type text}]
]}
]]}
]
[
{plot An aging Pat Garrett is hired as a lawman on behalf of a group of wealthy New Mexico cattle barons--his sole purpose being to bring down his old friend Billy the Kid.}
{title Pat Garrett & Billy the Kid}
{highlights [[
{score 2.115748405456543}
{path plot}
{texts [
[{value An aging Pat Garrett is hired as a lawman on behalf of a group of wealthy } {type text}]
[{value New} {type hit}]
[{value Mexico cattle barons--his sole } {type text}]
[{value purpose} {type hit}]
[{value being to bring down his old friend Billy the Kid.} {type text}]
]}
]]}
]
go run partial-match-query.go
[
{plot After the rebels have been brutally overpowered by the Empire on their newly established base, Luke Skywalker takes advanced Jedi training with Master Yoda, while his friends are pursued by Darth Vader as part of his plan to capture Luke.}
{title Star Wars: Episode V - The Empire Strikes Back}
]
[
{plot The new owner of the Cleveland Indians puts together a purposely horrible team so they'll lose and she can move the team. But when the plot is uncovered, they start winning just to spite her.}
{title Major League}
]
[
{plot The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities.}
{title Music Within}
]
[
{plot A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need.}
{title Her}
]
[
{plot An adrenaline junkie walks away from a whirlwind romance and embraces a new life as a thief, though he soon finds himself pursued by veteran police officer and engaged in a turf war with a local gangster.}
{title Kick}
]
go run partial-match-query.go
[
{plot After the rebels have been brutally overpowered by the Empire on their newly established base, Luke Skywalker takes advanced Jedi training with Master Yoda, while his friends are pursued by Darth Vader as part of his plan to capture Luke.}
{title Star Wars: Episode V - The Empire Strikes Back}
]
[
{plot The new owner of the Cleveland Indians puts together a purposely horrible team so they'll lose and she can move the team. But when the plot is uncovered, they start winning just to spite her.}
{title Major League}
]
[
{plot The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities.}
{title Music Within}
]
[
{plot A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need.}
{title Her}
]
[
{plot An adrenaline junkie walks away from a whirlwind romance and embraces a new life as a thief, though he soon finds himself pursued by veteran police officer and engaged in a turf war with a local gangster.}
{title Kick}
]
1
junit
4.11 或更高版本
mongodb-driver-sync
4.3.0 或更高版本
slf4j-log4j12
1.7.30 或更高版本
2
3

此代码示例将执行以下任务:

  • 导入mongodb包和依赖项。

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

  • 运行使用以下项的查询:

    • $search 寻找术语的阶段

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

    • $project 阶段排除 titleplot 以外的所有字段。

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

该查询允许执行以下操作,以将查询字符串 new purchase 与字段中的单词进行匹配:

  • 允许单词 newpurchase 出现在 plot 字段的任何位置。

  • 允许查询字符串中的两个字符变体将查询与字段中的单词匹配,但不允许更改查询字符串中的第一个字符。

  • 最多允许考虑 256 个相似词。

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

查询指定了查询字符串 new purpose,其中 newpurpose 之间的位置距离最大为 5

1import java.util.Arrays;
2
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 com.mongodb.client.MongoClient;
9import com.mongodb.client.MongoClients;
10import com.mongodb.client.MongoCollection;
11import com.mongodb.client.MongoDatabase;
12import org.bson.Document;
13
14public class PartialMatchQuery {
15 public static void main( String[] args ) {
16 // define query
17 Document agg = new Document("$search",
18 new Document("index", "partial-match-tutorial")
19 .append("phrase",
20 new Document("path", "plot")
21 .append("query", "new purpose")
22 .append("slop", 5)));
23
24 // specify connection
25 String uri = "<connection-string>";
26
27 // establish connection and set namespace
28 try (MongoClient mongoClient = MongoClients.create(uri)) {
29 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
30 MongoCollection<Document> collection = database.getCollection("movies");
31
32 // run query and print results
33 collection.aggregate(Arrays.asList(agg,
34 limit(5),
35 project(fields(excludeId(), include("title", "plot")))))
36 .forEach(doc -> System.out.println(doc.toJson()));
37 }
38 }
39}

该查询使用 (.*) 正则表达式将任意数量的字符与部分查询字符串进行匹配。

1import java.util.Arrays;
2
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 com.mongodb.client.MongoClient;
9import com.mongodb.client.MongoClients;
10import com.mongodb.client.MongoCollection;
11import com.mongodb.client.MongoDatabase;
12import org.bson.Document;
13
14public class PartialMatchQuery {
15 public static void main( String[] args ) {
16 // define query
17 Document agg = new Document("$search",
18 new Document ("index", "partial-match-tutorial")
19 .append("regex",
20 new Document("path", "plot")
21 .append("query", "(.*)new(.*) pur(.*)")));
22 // specify connection
23 String uri = "<connection-string>";
24 // establish connection and set namespace
25 try (MongoClient mongoClient = MongoClients.create(uri)) {
26 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
27 MongoCollection<Document> collection = database.getCollection("movies");
28 // run query and print results
29 collection.aggregate(Arrays.asList(agg,
30 limit(5),
31 project(fields(excludeId(), include("title", "plot")))))
32 .forEach(doc -> System.out.println(doc.toJson()));
33 }
34 }
35}

查询使用查询字符串中的 * 来匹配部分查询字符串中指定单词前后的 0 个或多个字符。

1import java.util.Arrays;
2
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 com.mongodb.client.MongoClient;
9import com.mongodb.client.MongoClients;
10import com.mongodb.client.MongoCollection;
11import com.mongodb.client.MongoDatabase;
12import org.bson.Document;
13
14public class PartialMatchQuery {
15 public static void main( String[] args ) {
16 // define query
17 Document agg = new Document("$search",
18 new Document ("index", "partial-match-tutorial")
19 .append("wildcard",
20 new Document("path", "plot")
21 .append("query", "*new* pur*")));
22 // specify connection
23 String uri = "<connection-string>";
24 // establish connection and set namespace
25 try (MongoClient mongoClient = MongoClients.create(uri)) {
26 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
27 MongoCollection<Document> collection = database.getCollection("movies");
28 // run query and print results
29 collection.aggregate(Arrays.asList(agg,
30 limit(5),
31 project(fields(excludeId(), include("title", "plot")))))
32 .forEach(doc -> System.out.println(doc.toJson()));
33 }
34 }
35}

注意

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

package com.mongodb.drivers;

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

4
javac PartialMatchQuery.java
java PartialMatchQuery
{
"plot": "A divorced woman and her diabetic daughter take refuge in their newly-purchased house's safe room, when three men break-in, searching for a missing fortune.",
"title": "Panic Room"
}
{
"plot": "A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need.",
"title": "Her"
}
{
"plot": "Set in the near future when artificial organs can be bought on credit, it revolves around a man who struggles to make the payments on a heart he has purchased. He must therefore go on the run before said ticker is repossessed.",
"title": "Repo Men"
}
{
"plot": "A psychologically troubled novelty supplier is nudged towards a romance with an English woman, all the while being extorted by a phone-sex line run by a crooked mattress salesman, and purchasing stunning amounts of pudding.",
"title": "Punch-Drunk Love"
}
{
"plot": "Jack Conrad is awaiting the death penalty in a corrupt Central American prison. He is \"purchased\" by a wealthy television producer and taken to a desolate island where he must fight to the death against nine other condemned killers from all corners of the world, with freedom going to the sole survivor.",
"title": "The Condemned"
}
javac PartialMatchQuery.java
java PartialMatchQuery
{
"plot": "The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities.",
"title": "Music Within"
}
{
"plot": "The supervillain Megamind finally defeats his nemesis, the superhero Metro Man. But without a hero, he loses all purpose and must find new meaning to his life.",
"title": "Megamind"
}
{
"plot": "An aging Pat Garrett is hired as a lawman on behalf of a group of wealthy New Mexico cattle barons--his sole purpose being to bring down his old friend Billy the Kid.",
"title": "Pat Garrett & Billy the Kid"
}
javac PartialMatchQuery.java
java PartialMatchQuery
{
"plot": "After the rebels have been brutally overpowered by the Empire on their newly established base, Luke Skywalker takes advanced Jedi training with Master Yoda, while his friends are pursued by Darth Vader as part of his plan to capture Luke.",
"title": "Star Wars: Episode V - The Empire Strikes Back"
}
{
"plot": "The new owner of the Cleveland Indians puts together a purposely horrible team so they'll lose and she can move the team. But when the plot is uncovered, they start winning just to spite her.",
"title": "Major League"
}
{
"plot": "The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities.",
"title": "Music Within"
}
{
"plot": "A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need.",
"title": "Her"
}
{
"plot": "An adrenaline junkie walks away from a whirlwind romance and embraces a new life as a thief, though he soon finds himself pursued by veteran police officer and engaged in a turf war with a local gangster.",
"title": "Kick"
}
javac PartialMatchQuery.java
java PartialMatchQuery
{
"plot": "After the rebels have been brutally overpowered by the Empire on their newly established base, Luke Skywalker takes advanced Jedi training with Master Yoda, while his friends are pursued by Darth Vader as part of his plan to capture Luke.",
"title": "Star Wars: Episode V - The Empire Strikes Back"
}
{
"plot": "The new owner of the Cleveland Indians puts together a purposely horrible team so they'll lose and she can move the team. But when the plot is uncovered, they start winning just to spite her.",
"title": "Major League"
}
{
"plot": "The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities.",
"title": "Music Within"
}
{
"plot": "A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need.",
"title": "Her"
}
{
"plot": "An adrenaline junkie walks away from a whirlwind romance and embraces a new life as a thief, though he soon finds himself pursued by veteran police officer and engaged in a turf war with a local gangster.",
"title": "Kick"
}
1
mongodb-driver-kotlin-coroutine
4.10.0 或更高版本
2
3

此代码示例将执行以下任务:

  • 导入mongodb包和依赖项。

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

  • 运行使用以下项的查询:

    • $search 寻找术语的阶段

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

    • $project 阶段排除 titleplot 以外的所有字段。

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

该查询允许执行以下操作,以将查询字符串 new purchase 与字段中的单词进行匹配:

  • 允许单词 newpurchase 出现在 plot 字段的任何位置。

  • 允许查询字符串中的两个字符变体将查询与字段中的单词匹配,但不允许更改查询字符串中的第一个字符。

  • 最多允许考虑 256 个相似词。

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", "partial-match-tutorial")
20 .append(
21 "autocomplete",
22 Document("path", "plot")
23 .append("query", "new purchase")
24 .append("tokenOrder", "any")
25 .append(
26 "fuzzy",
27 Document("maxEdits", 2)
28 .append("prefixLength", 1)
29 .append("maxExpansions", 256)
30 )
31 )
32 )
33
34 // run query and print results
35 val resultsFlow = collection.aggregate<Document>(
36 listOf(
37 agg,
38 limit(5),
39 project(fields(excludeId(), include("title", "plot")))
40 )
41 )
42 resultsFlow.collect { println(it) }
43 }
44 mongoClient.close()
45}

查询指定了查询字符串 new purpose,其中 newpurpose 之间的位置距离最大为 5

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", "partial-match-tutorial")
20 .append(
21 "phrase",
22 Document("path", "plot")
23 .append("query", "new purpose")
24 .append("slop", 5)
25 )
26 )
27
28 // run query and print results
29 val resultsFlow = collection.aggregate<Document>(
30 listOf(
31 agg,
32 limit(5),
33 project(fields(excludeId(), include("title", "plot")))
34 )
35 )
36 resultsFlow.collect { println(it) }
37 }
38 mongoClient.close()
39}

该查询使用 (.*) 正则表达式将任意数量的字符与部分查询字符串进行匹配。

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", "partial-match-tutorial")
20 .append(
21 "regex",
22 Document("path", "plot")
23 .append("query", "(.*)new(.*) pur(.*)")
24 )
25 )
26
27 // run query and print results
28 val resultsFlow = collection.aggregate<Document>(
29 listOf(
30 agg,
31 limit(5),
32 project(fields(excludeId(), include("title", "plot")))
33 )
34 )
35 resultsFlow.collect { println(it) }
36 }
37 mongoClient.close()
38}

查询使用查询字符串中的 * 来匹配部分查询字符串中指定单词前后的 0 个或多个字符。

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", "partial-match-tutorial")
20 .append(
21 "wildcard",
22 Document("path", "plot")
23 .append("query", "*new* pur*")
24 )
25 )
26
27 // run query and print results
28 val resultsFlow = collection.aggregate<Document>(
29 listOf(
30 agg,
31 limit(5),
32 project(fields(excludeId(), include("title", "plot")))
33 )
34 )
35 resultsFlow.collect { println(it) }
36 }
37 mongoClient.close()
38}

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

4

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

Document{{plot=A divorced woman and her diabetic daughter take refuge in their newly-purchased house's safe room, when three men break-in, searching for a missing fortune., title=Panic Room}}
Document{{plot=A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need., title=Her}}
Document{{plot=A country boy becomes the head of a gang through the purchase of some lucky roses from an old lady. He and a singer at the gang's nightclub try to do a good deed for the old lady when her daughter comes to visit., title=Miracles - Mr. Canton and Lady Rose}}
Document{{plot=A psychologically troubled novelty supplier is nudged towards a romance with an English woman, all the while being extorted by a phone-sex line run by a crooked mattress salesman, and purchasing stunning amounts of pudding., title=Punch-Drunk Love}}
Document{{plot=Jack Conrad is awaiting the death penalty in a corrupt Central American prison. He is "purchased" by a wealthy television producer and taken to a desolate island where he must fight to the death against nine other condemned killers from all corners of the world, with freedom going to the sole survivor., title=The Condemned}}
Document{{plot=The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities., title=Music Within}}
Document{{plot=The supervillain Megamind finally defeats his nemesis, the superhero Metro Man. But without a hero, he loses all purpose and must find new meaning to his life., title=Megamind}}
Document{{plot=An aging Pat Garrett is hired as a lawman on behalf of a group of wealthy New Mexico cattle barons--his sole purpose being to bring down his old friend Billy the Kid., title=Pat Garrett & Billy the Kid}}
Document{{plot=After the rebels have been brutally overpowered by the Empire on their newly established base, Luke Skywalker takes advanced Jedi training with Master Yoda, while his friends are pursued by Darth Vader as part of his plan to capture Luke., title=Star Wars: Episode V - The Empire Strikes Back}}
Document{{plot=The new owner of the Cleveland Indians puts together a purposely horrible team so they'll lose and she can move the team. But when the plot is uncovered, they start winning just to spite her., title=Major League}}
Document{{plot=The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities., title=Music Within}}
Document{{plot=A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need., title=Her}}
Document{{plot=An adrenaline junkie walks away from a whirlwind romance and embraces a new life as a thief, though he soon finds himself pursued by veteran police officer and engaged in a turf war with a local gangster., title=Kick}}
Document{{plot=After the rebels have been brutally overpowered by the Empire on their newly established base, Luke Skywalker takes advanced Jedi training with Master Yoda, while his friends are pursued by Darth Vader as part of his plan to capture Luke., title=Star Wars: Episode V - The Empire Strikes Back}}
Document{{plot=The new owner of the Cleveland Indians puts together a purposely horrible team so they'll lose and she can move the team. But when the plot is uncovered, they start winning just to spite her., title=Major League}}
Document{{plot=The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities., title=Music Within}}
Document{{plot=A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need., title=Her}}
Document{{plot=An adrenaline junkie walks away from a whirlwind romance and embraces a new life as a thief, though he soon finds himself pursued by veteran police officer and engaged in a turf war with a local gangster., title=Kick}}
1
2

此代码示例将执行以下任务:

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

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

  • 运行使用以下项的查询:

    • $search 寻找术语的阶段

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

    • $project 阶段排除 titleplot 以外的所有字段。

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

该查询允许执行以下操作,以将查询字符串 new purchase 与字段中的单词进行匹配:

  • 允许单词 newpurchase 出现在 plot 字段的任何位置。

  • 允许查询字符串中的两个字符变体将查询与字段中的单词匹配,但不允许更改查询字符串中的第一个字符。

  • 最多允许考虑 256 个相似词。

1const MongoClient = require("mongodb").MongoClient;
2const assert = require("assert");
3
4const agg = [
5 {
6 '$search': {
7 'index': 'partial-match-tutorial',
8 'autocomplete': {
9 'path': 'plot',
10 'query': 'new purchase',
11 'tokenOrder': 'any',
12 'fuzzy': {
13 'maxEdits': 2,
14 'prefixLength': 1,
15 'maxExpansions': 256
16 }
17 },
18 'highlight': {
19 'path': 'plot'
20 }
21 }
22 }, {
23 '$limit': 5
24 }, {
25 '$project': {
26 '_id': 0,
27 'title': 1,
28 'plot': 1,
29 'highlights': {
30 '$meta': 'searchHighlights'
31 }
32 }
33 }
34];
35
36MongoClient.connect(
37 "<connection-string>",
38 { useNewUrlParser: true, useUnifiedTopology: true },
39 async function (connectErr, client) {
40 assert.equal(null, connectErr);
41 const coll = client.db("sample_mflix").collection("movies");
42 let cursor = await coll.aggregate(agg);
43 await cursor.forEach((doc) => console.log(doc));
44 client.close();
45 }
46);

查询指定了查询字符串 new purpose,其中 newpurpose 之间的位置距离最大为 5

1const MongoClient = require("mongodb").MongoClient;
2const assert = require("assert");
3
4const agg = [
5 {
6 '$search': {
7 'index': 'partial-match-tutorial',
8 'phrase': {
9 'path': 'plot',
10 'query': 'new purpose',
11 'slop': 5
12 },
13 'highlight': {
14 'path': 'plot'
15 }
16 }
17 }, {
18 '$limit': 5
19 }, {
20 '$project': {
21 '_id': 0,
22 'plot': 1,
23 'title': 1,
24 'highlights': {
25 '$meta': 'searchHighlights'
26 }
27 }
28 }
29];
30
31MongoClient.connect(
32 "<connection-string>",
33 { useNewUrlParser: true, useUnifiedTopology: true },
34 async function (connectErr, client) {
35 assert.equal(null, connectErr);
36 const coll = client.db("sample_mflix").collection("movies");
37 let cursor = await coll.aggregate(agg);
38 await cursor.forEach((doc) => console.log(doc));
39 client.close();
40 }
41);

该查询使用 (.*) 正则表达式将任意数量的字符与部分查询字符串进行匹配。

1const MongoClient = require("mongodb").MongoClient;
2const assert = require("assert");
3
4const agg = [
5 {
6 '$search': {
7 'index': 'partial-match-tutorial',
8 'regex': {
9 'path': 'plot',
10 'query': '(.*)new(.*) pur(.*)'
11 }
12 }
13 }, {
14 '$limit': 5
15 }, {
16 '$project': {
17 '_id': 0,
18 'plot': 1,
19 'title': 1
20 }
21 }
22];
23
24MongoClient.connect(
25 "<connection-string>",
26 { useNewUrlParser: true, useUnifiedTopology: true },
27 async function (connectErr, client) {
28 assert.equal(null, connectErr);
29 const coll = client.db("sample_mflix").collection("movies");
30 let cursor = await coll.aggregate(agg);
31 await cursor.forEach((doc) => console.log(doc));
32 client.close();
33 }
34);

查询使用查询字符串中的 * 来匹配部分查询字符串中指定单词前后的 0 个或多个字符。

1const MongoClient = require("mongodb").MongoClient;
2const assert = require("assert");
3
4const agg = [
5 {
6 '$search': {
7 'index': 'partial-match-tutorial',
8 'wildcard': {
9 'path': 'plot',
10 'query': '*new* pur*'
11 }
12 }
13 }, {
14 '$limit': 5
15 }, {
16 '$project': {
17 '_id': 0,
18 'plot': 1,
19 'title': 1
20 }
21 }
22];
23
24MongoClient.connect(
25 "<connection-string>",
26 { useNewUrlParser: true, useUnifiedTopology: true },
27 async function (connectErr, client) {
28 assert.equal(null, connectErr);
29 const coll = client.db("sample_mflix").collection("movies");
30 let cursor = await coll.aggregate(agg);
31 await cursor.forEach((doc) => console.log(doc));
32 client.close();
33 }
34);

注意

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

3
node partial-match-query.js
{
plot: "A divorced woman and her diabetic daughter take refuge in their newly-purchased house's safe room, when three men break-in, searching for a missing fortune.",
title: 'Panic Room',
highlights: [ { score: 4.364492893218994, path: 'plot', texts: [Array] } ]
}
{
plot: "A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need.",
title: 'Her',
highlights: [ { score: 4.198050022125244, path: 'plot', texts: [Array] } ]
}
{
plot: "Set in the near future when artificial organs can be bought on credit, it revolves around a man who struggles to make the payments on a heart he has purchased. He must therefore go on the run before said ticker is repossessed.",
title: 'Repo Men',
highlights: [
{ score: 2.6448397636413574, path: 'plot', texts: [Array] }
]
}
{
plot: 'A psychologically troubled novelty supplier is nudged towards a romance with an English woman, all the while being extorted by a phone-sex line run by a crooked mattress salesman, and purchasing stunning amounts of pudding.',
title: 'Punch-Drunk Love',
highlights: [ { score: 1.2451990842819214, path: 'plot', texts: [Array] } ]
}
{
plot: 'Jack Conrad is awaiting the death penalty in a corrupt Central American prison. He is "purchased" by a wealthy television producer and taken to a desolate island where he must fight to the death against nine other condemned killers from all corners of the world, with freedom going to the sole survivor.',
title: 'The Condemned',
highlights: [ { score: 2.94378924369812, path: 'plot', texts: [Array] } ]
}
node partial-match-query.js
{
plot: 'The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities.',
title: 'Music Within',
highlights: [ { score: 1.9394469261169434, path: 'plot', texts: [Array] } ]
}
{
plot: 'The supervillain Megamind finally defeats his nemesis, the superhero Metro Man. But without a hero, he loses all purpose and must find new meaning to his life.',
title: 'Megamind',
highlights: [ { score: 2.90376877784729, path: 'plot', texts: [Array] } ]
}
{
plot: 'An aging Pat Garrett is hired as a lawman on behalf of a group of wealthy New Mexico cattle barons--his sole purpose being to bring down his old friend Billy the Kid.',
title: 'Pat Garrett & Billy the Kid',
highlights: [ { score: 2.115748405456543, path: 'plot', texts: [Array] } ]
}
node partial-match-query.js
{
plot: 'After the rebels have been brutally overpowered by the Empire on their newly established base, Luke Skywalker takes advanced Jedi training with Master Yoda, while his friends are pursued by Darth Vader as part of his plan to capture Luke.',
title: 'Star Wars: Episode V - The Empire Strikes Back'
}
{
plot: "The new owner of the Cleveland Indians puts together a purposely horrible team so they'll lose and she can move the team. But when the plot is uncovered, they start winning just to spite her.",
title: 'Major League'
}
{
plot: 'The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities.',
title: 'Music Within'
}
{
plot: "A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need.",
title: 'Her'
}
{
plot: 'An adrenaline junkie walks away from a whirlwind romance and embraces a new life as a thief, though he soon finds himself pursued by veteran police officer and engaged in a turf war with a local gangster.',
title: 'Kick'
}
node partial-match-query.js
{
plot: 'After the rebels have been brutally overpowered by the Empire on their newly established base, Luke Skywalker takes advanced Jedi training with Master Yoda, while his friends are pursued by Darth Vader as part of his plan to capture Luke.',
title: 'Star Wars: Episode V - The Empire Strikes Back'
}
{
plot: "The new owner of the Cleveland Indians puts together a purposely horrible team so they'll lose and she can move the team. But when the plot is uncovered, they start winning just to spite her.",
title: 'Major League'
}
{
plot: 'The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities.',
title: 'Music Within'
}
{
plot: "A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need.",
title: 'Her'
}
{
plot: 'An adrenaline junkie walks away from a whirlwind romance and embraces a new life as a thief, though he soon finds himself pursued by veteran police officer and engaged in a turf war with a local gangster.',
title: 'Kick'
}
1
2

以下代码示例:

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

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

  • 运行使用以下项的查询:

    • $search 寻找术语的阶段

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

    • $project 阶段排除 titleplot 以外的所有字段。

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

该查询允许执行以下操作,以将查询字符串 new purchase 与字段中的单词进行匹配:

  • 允许单词 newpurchase 出现在 plot 字段的任何位置。

  • 允许查询字符串中的两个字符变体将查询与字段中的单词匹配,但不允许更改查询字符串中的第一个字符。

  • 最多允许考虑 256 个相似词。

1import pymongo
2import dns
3
4client = pymongo.MongoClient('<connection-string>')
5result = client['sample_mflix']['movies'].aggregate([
6 {
7 '$search': {
8 'index': 'partial-match-tutorial',
9 'autocomplete': {
10 'path': 'plot',
11 'query': 'new purchase',
12 'tokenOrder': 'any',
13 'fuzzy': {
14 'maxEdits': 2,
15 'prefixLength': 1,
16 'maxExpansions': 256
17 }
18 },
19 'highlight': {
20 'path': 'plot'
21 }
22 }
23 }, {
24 '$limit': 5
25 }, {
26 '$project': {
27 '_id': 0,
28 'title': 1,
29 'plot': 1,
30 'highlights': {
31 '$meta': 'searchHighlights'
32 }
33 }
34 }
35])
36
37for i in result:
38 print(i)

查询指定了查询字符串 new purpose,其中 newpurpose 之间的位置距离最大为 5

1import pymongo
2import dns
3
4client = pymongo.MongoClient('<connection-string>')
5result = client['sample_mflix']['movies'].aggregate([
6 {
7 '$search': {
8 'index': 'partial-match-tutorial',
9 'phrase': {
10 'path': 'plot',
11 'query': 'new purpose',
12 'slop': 5
13 },
14 'highlight': {
15 'path': 'plot'
16 }
17 }
18 }, {
19 '$limit': 5
20 }, {
21 '$project': {
22 '_id': 0,
23 'plot': 1,
24 'title': 1,
25 'highlights': {
26 '$meta': 'searchHighlights'
27 }
28 }
29 }
30])
31
32for i in result:
33 print(i)

该查询使用 (.*) 正则表达式将任意数量的字符与部分查询字符串进行匹配。

1import pymongo
2import dns
3
4client = pymongo.MongoClient('<connection-string>')
5result = client['sample_mflix']['movies'].aggregate([
6 {
7 '$search': {
8 'index': 'partial-match-tutorial',
9 'regex': {
10 'path': 'plot',
11 'query': '(.*)new(.*) pur(.*)'
12 }
13 }
14 }, {
15 '$limit': 5
16 }, {
17 '$project': {
18 '_id': 0,
19 'plot': 1,
20 'title': 1
21 }
22 }
23])
24
25for i in result:
26 print(i)

查询使用查询字符串中的 * 来匹配部分查询字符串中指定单词前后的 0 个或多个字符。

1import pymongo
2import dns
3
4client = pymongo.MongoClient('<connection-string>')
5result = client['sample_mflix']['movies'].aggregate([
6 {
7 '$search': {
8 'index': 'partial-match-tutorial',
9 'wildcard': {
10 'path': 'plot',
11 'query': '*new* pur*'
12 }
13 }
14 }, {
15 '$limit': 5
16 }, {
17 '$project': {
18 '_id': 0,
19 'plot': 1,
20 'title': 1
21 }
22 }
23])
24
25for i in result:
26 print(i)

注意

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

3
python partial-match-query.py
{
'plot': "A divorced woman and her diabetic daughter take refuge in their newly-purchased house's safe room, when three men break-in, searching for a missing fortune.",
'title': 'Panic Room',
'highlights': [{
'score': 4.364492893218994,
'path': 'plot',
'texts': [
{'value': 'A divorced woman and her diabetic daughter take refuge in their ', 'type': 'text'},
{'value': "newly-purchased house's safe", 'type': 'hit'},
{'value': ' room, when three men break-in, searching for a missing fortune.', 'type': 'text'}
]
}]
}
{
'plot': "A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need.",
'title': 'Her',
'highlights': [{
'score': 4.198050022125244,
'path': 'plot',
'texts': [
{'value': 'A lonely writer develops an unlikely relationship with his ', 'type': 'text'},
{'value': 'newly purchased operating system', 'type': 'hit'},
{'value': " that's designed to meet his every ", 'type': 'text'},
{'value': 'need', 'type': 'hit'},
{'value': '.', 'type': 'text'}
]
}]
}
{
'plot': "Set in the near future when artificial organs can be bought on credit, it revolves around a man who struggles to make the payments on a heart he has purchased. He must therefore go on the run before said ticker is repossessed.",
'title': 'Repo Men',
'highlights': [{
'score': 2.6448397636413574,
'path': 'plot',
'texts': [
{'value': 'Set in the ', 'type': 'text'},
{'value': 'near future when', 'type': 'hit'},
{'value': ' artificial organs can be bought on credit, it revolves around a man who struggles to make the payments on a heart he has ', 'type': 'text'},
{'value': 'purchased. He must', 'type': 'hit'}
]
}]
}
{
'plot': 'A psychologically troubled novelty supplier is nudged towards a romance with an English woman, all the while being extorted by a phone-sex line run by a crooked mattress salesman, and purchasing stunning amounts of pudding.',
'title': 'Punch-Drunk Love',
'highlights': [{
'score': 1.2451990842819214,
'path': 'plot',
'texts': [
{'value': 'A psychologically troubled ', 'type': 'text'},
{'value': 'novelty supplier is', 'type': 'hit'},
{'value': ' ', 'type': 'text'},
{'value': 'nudged towards a', 'type': 'hit'},
{'value': ' romance with an English woman, all the while being extorted by a phone-sex line run by a crooked mattress salesman, and ', 'type': 'text'},
{'value': 'purchasing stunning amounts', 'type': 'hit'},
{'value': ' of pudding.', 'type': 'text'}
]
}]
}
{
'plot': 'Jack Conrad is awaiting the death penalty in a corrupt Central American prison. He is "purchased" by a wealthy television producer and taken to a desolate island where he must fight to the death against nine other condemned killers from all corners of the world, with freedom going to the sole survivor.',
'title': 'The Condemned',
'highlights': [{
'score': 2.94378924369812,
'path': 'plot',
'texts': [
{'value': 'He is "', 'type': 'text'},
{'value': 'purchased" by a', 'type': 'hit'},
{'value': ' wealthy television producer and taken to a desolate island where he must fight to the death against ', 'type': 'text'},
{'value': 'nine other condemned', 'type': 'hit'},
{'value': ' killers from all corners of the world, with freedom going to the sole survivor.', 'type': 'text'}
]
}]
}
python partial-match-query.py
{
'plot': 'The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities.',
'title': 'Music Within',
'highlights': [{
'score': 1.9394469261169434,
'path': 'plot',
'texts': [
{'value': 'The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a ', 'type': 'text'},
{'value': 'new', 'type': 'hit'},
{'value': ' ', 'type': 'text'},
{'value': 'purpose', 'type': 'hit'},
{'value': ' in his landmark efforts on the behalf of Americans with disabilities.', 'type': 'text'}
]
}]
}
{
'plot': 'The supervillain Megamind finally defeats his nemesis, the superhero Metro Man. But without a hero, he loses all purpose and must find new meaning to his life.',
'title': 'Megamind',
'highlights': [{
'score': 2.90376877784729,
'path': 'plot',
'texts': [
{'value': 'But without a hero, he loses all ', 'type': 'text'},
{'value': 'purpose', 'type': 'hit'},
{'value': ' and must find ', 'type': 'text'},
{'value': 'new', 'type': 'hit'},
{'value': ' meaning to his life.', 'type': 'text'}
]
}]
}
{
'plot': 'An aging Pat Garrett is hired as a lawman on behalf of a group of wealthy New Mexico cattle barons--his sole purpose being to bring down his old friend Billy the Kid.',
'title': 'Pat Garrett & Billy the Kid',
'highlights': [{
'score': 2.115748405456543,
'path': 'plot',
'texts': [
{'value': 'An aging Pat Garrett is hired as a lawman on behalf of a group of wealthy ', 'type': 'text'},
{'value': 'New', 'type': 'hit'},
{'value': ' Mexico cattle barons--his sole ', 'type': 'text'},
{'value': 'purpose', 'type': 'hit'},
{'value': ' being to bring down his old friend Billy the Kid.', 'type': 'text'}
]
}]
}
python partial-match-query.py
{
'plot': 'After the rebels have been brutally overpowered by the Empire on their newly established base, Luke Skywalker takes advanced Jedi training with Master Yoda, while his friends are pursued by Darth Vader as part of his plan to capture Luke.',
'title': 'Star Wars: Episode V - The Empire Strikes Back'
}
{
'plot': "The new owner of the Cleveland Indians puts together a purposely horrible team so they'll lose and she can move the team. But when the plot is uncovered, they start winning just to spite her.",
'title': 'Major League'
}
{
'plot': 'The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities.',
'title': 'Music Within'
}
{
'plot': "A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need.",
'title': 'Her'
}
{
'plot': 'An adrenaline junkie walks away from a whirlwind romance and embraces a new life as a thief, though he soon finds himself pursued by veteran police officer and engaged in a turf war with a local gangster.',
'title': 'Kick'
}
python partial-match-query.py
{
'plot': 'After the rebels have been brutally overpowered by the Empire on their newly established base, Luke Skywalker takes advanced Jedi training with Master Yoda, while his friends are pursued by Darth Vader as part of his plan to capture Luke.',
'title': 'Star Wars: Episode V - The Empire Strikes Back'
}
{
'plot': "The new owner of the Cleveland Indians puts together a purposely horrible team so they'll lose and she can move the team. But when the plot is uncovered, they start winning just to spite her.",
'title': 'Major League'
}
{
'plot': 'The true story of Richard Pimentel, a brilliant public speaker with a troubled past, who returns from Vietnam severely hearing -impaired and finds a new purpose in his landmark efforts on the behalf of Americans with disabilities.',
'title': 'Music Within'
}
{
'plot': "A lonely writer develops an unlikely relationship with his newly purchased operating system that's designed to meet his every need.",
'title': 'Her'
}
{
'plot': 'An adrenaline junkie walks away from a whirlwind romance and embraces a new life as a thief, though he soon finds himself pursued by veteran police officer and engaged in a turf war with a local gangster.',
'title': 'Kick'
}

后退

多语言