Docs Menu
Docs Home
/
MongoDB Atlas
/ /

How to Run Partial Match Atlas Search Queries

On this page

  • Create the Atlas Search Index
  • Run a Case-Sensitive Partial Match Query

This tutorial describes how to create an index on the sample_mflix.movies collection and run partial string queries against the plot field. To return matches for partial string queries, you can use one of the following operators:

  • The autocomplete operator, which allows you to search the specified fields for a word or phrase that contains the sequence of characters that you specify with your query.

  • The phrase operator, which allows you to search the specified fields for documents that contain the terms in your query string at the distance you specify between the terms.

  • The regex operator, which allows you to search the specified fields for strings using regular expression.

  • The wildcard operator, which allows you to search the specified fields using special characters in your query to match any character.

This tutorial takes you through the following steps:

  1. Set up an Atlas Search index on the plot field in the sample_mflix.movies collection.

  2. Run Atlas Search query for a partial string against the plot field in the sample_mflix.movies collection using autocomplete, phrase, regex, and wildcard operators.

Before you begin, ensure that your Atlas cluster meets the requirements described in the Prerequisites.

To create an Atlas Search index, you must have Project Data Access Admin or higher access to the project.

In this section, you will create an Atlas Search index on the plot field in the sample_mflix.movies collection for running partial match queries against those fields.

1
  1. If it is not already displayed, select the organization that contains your desired project from the Organizations menu in the navigation bar.

  2. If it is not already displayed, select your desired project from the Projects menu in the navigation bar.

  3. If the Clusters page is not already displayed, click Database in the sidebar.

2

You can go the Atlas Search page from the sidebar, the Data Explorer, or your cluster details page.

  1. In the sidebar, click Atlas Search under the Services heading.

  2. From the Select data source dropdown, select your cluster and click Go to Atlas Search.

  1. Click the Browse Collections button for your cluster.

  2. Expand the database and select the collection.

  3. Click the Search Indexes tab for the collection.

  1. Click the cluster's name.

  2. Click the Atlas Search tab.

3
4
  • For a guided experience, select the Atlas Search Visual Editor.

  • To edit the raw index definition, select the Atlas Search JSON Editor.

5
  1. In the Index Name field, enter partial-match-tutorial.

    Note

    If you name your index default, you don't need to specify an index parameter when using the $search pipeline stage. Otherwise, you must specify the index name using the index parameter.

  2. In the Database and Collection section, find the sample_mflix database, and select the movies collection.

6

You can use the Atlas Search Visual Editor or the Atlas Search JSON Editor in the Atlas user interface to create the index.

  1. Click Next.

  2. Click Refine Your Index.

  3. In the Index Configurations section, toggle to disable Dynamic Mapping.

  4. In the Field Mappings section, click

  5. Add Field to display the Add Field Mapping window.

  6. Select plot from the Field Name dropdown.

  7. Click the Data Type dropdown to specify the field type and the settings for the operator you want to use to run the query.

    1. Select Autocomplete from the dropdown to run the query using the autocomplete operator.

    2. Modify the default settings for the data type as shown below:

      UI Field Name
      Configuration
      Max Grams
      15
      Min Grams
      2
      Tokenization
      edgeGram
      Fold Diacritics
      true

      To learn more about these settings, see How to Index Fields for Autocompletion.

    1. Select String from the dropdown to run the query using the phrase operator.

    2. Modify the default settings for the data type as shown below:

      UI Field Name
      Configuration
      Index Analyzer
      lucene.standard
      Search Analyzer
      lucene.standard
      Index Options
      offsets
      Store
      true
      Ignore Above
      None
      Norms
      include

      To learn more about these settings, see How to Index String Fields.

    1. Select String from the dropdown to run the query using the regex operator.

    2. Modify the default settings for the data type as shown below:

      UI Field Name
      Configuration
      Index Analyzer
      lucene.keyword
      Search Analyzer
      lucene.keyword
      Index Options
      offsets
      Store
      true
      Ignore Above
      None
      Norms
      include

      To learn more about these settings, see How to Index String Fields.

    1. Select String from the dropdown to run the query using the wildcard operator.

    2. Modify the default settings for the data type as shown below:

      UI Field Name
      Configuration
      Index Analyzer
      lucene.keyword
      Search Analyzer
      lucene.keyword
      Index Options
      offsets
      Store
      true
      Ignore Above
      None
      Norms
      include

      To learn more about these settings, see How to Index String Fields.

  8. Click Add to add the field to the list in Field Mappings section.

  9. Click Save Changes.

  1. Replace the default index definition with the following example index definition for the operator you intend to use for running the query.

    {
    "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. Click Next.

7
8

A modal window appears to let you know your index is building. Click the Close button.

9

The index should take about one minute to build. While it is building, the Status column reads Build in Progress. When it is finished building, the Status column reads Active.


➤ Use the Select your language drop-down menu on this page to set the language of the examples in this section.


You can use the autocomplete, phrase, regex, and wildcard operators to run a case-sensitive partial match query. This tutorial uses these operators to search for movies whose plot contain the specified partial string.

In this section, you will connect to your Atlas cluster and run the sample query using the operator against the plot field in the sample_mflix.movies collection.

1
  1. If it is not already displayed, select the organization that contains your desired project from the Organizations menu in the navigation bar.

  2. If it is not already displayed, select your desired project from the Projects menu in the navigation bar.

  3. If the Clusters page is not already displayed, click Database in the sidebar.

2

You can go the Atlas Search page from the sidebar, the Data Explorer, or your cluster details page.

  1. In the sidebar, click Atlas Search under the Services heading.

  2. From the Select data source dropdown, select your cluster and click Go to Atlas Search.

  1. Click the Browse Collections button for your cluster.

  2. Expand the database and select the collection.

  3. Click the Search Indexes tab for the collection.

  1. Click the cluster's name.

  2. Click the Atlas Search tab.

3

Click the Query button to the right of the index to query.

4

Click Edit Query to view a default query syntax sample in JSON format.

5

The following query uses the operator to query the plot field of the sample_mflix.movies collection.

Copy and paste the following query into the Query Editor, and then click the Search button in the Query Editor.

The query allows the following for matching the query string new purchase to a word in the field:

  • Allows the words new and purchase to appear anywhere in the plot field.

  • Allows two character variation in the query string to match the query to a word in the field, but doesn't allow the first character in the query string to change.

  • Allows up to two hundred and fifty six similar terms to be considered.

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

The query specifies the query string new purpose with a positional distance of up to 5 between new and purpose.

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

The query uses (.*) regular expression to match any number of characters with the partial query string.

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

The query uses * in the query string to match 0 or more characters before and after the specified words in the partial query string.

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

The Search Tester might not display all the fields in the documents it returns. To view all the fields, including the field that you specify in the query path, expand the document in the results.

1

Open mongosh in a terminal window and connect to your cluster. For detailed instructions on connecting, see Connect via mongosh.

2

Run the following command at mongosh prompt:

use sample_mflix
3

The following query uses the operator to query the plot field of the sample_mflix.movies collection. The query includes a:

  • $limit stage to limit the output to 5 results

  • $project stage to exclude all fields except title and plot

The query allows the following for matching the query string new purchase to a word in the field:

  • Allows the words new and purchase to appear anywhere in the plot field.

  • Allows two character variation in the query string to match the query to a word in the field, but doesn't allow the first character in the query string to change.

  • Allows up to two hundred and fifty six similar terms to be considered.

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'
}
]
}
]
}
]

The query specifies the query string new purpose with a positional distance of up to 5 between new and purpose.

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' }
]
}
]
}
]

The query uses (.*) regular expression to match any number of characters with the partial query string.

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'
}
]

The query uses * in the query string to match 0 or more characters before and after the specified words in the partial query string.

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

Open MongoDB Compass and connect to your cluster. For detailed instructions on connecting, see Connect via Compass.

2

On the Database screen, click the sample_mflix database, then click the movies collection.

3

The following query uses the operator to query the plot field of the sample_mflix.movies collection. The query includes a:

  • $limit stage to limit the output to 5 results

  • $project stage to exclude all fields except title and plot

To run this query in MongoDB Compass:

  1. Click the Aggregations tab.

  2. Click Select..., then configure each of the following pipeline stages by selecting the stage from the dropdown and adding the query for that stage. Click Add Stage to add additional stages.

    The query allows the following for matching the query string new purchase to a word in the field:

    • Allows the words new and purchase to appear anywhere in the plot field.

    • Allows two character variation in the query string to match the query to a word in the field, but doesn't allow the first character in the query string to change.

    • Allows up to two hundred and fifty six similar terms to be considered.

    Pipeline Stage
    Query
    $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" }
    }

    The query specifies the query string new purpose with a positional distance of up to 5 between new and purpose.

    Pipeline Stage
    Query
    $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" }
    }

    The query uses (.*) regular expression to match any number of characters with the partial query string.

    Pipeline Stage
    Query
    $search
    {
    "index": "partial-match-tutorial",
    "regex": {
    "path": "plot",
    "query": "(.*)new(.*) pur(.*)"
    }
    }
    $limit
    5
    $project
    {
    "_id": 0,
    "title": 1,
    "plot": 1
    }

    The query uses * in the query string to match 0 or more characters before and after the specified words in the partial query string.

    Pipeline Stage
    Query
    $search
    {
    "index": "partial-match-tutorial",
    "wildcard": {
    "path": "plot",
    "query": "*new* pur*"
    }
    }
    $limit
    5
    $project
    {
    "_id": 0,
    "title": 1,
    "plot": 1
    }

If you enabled Auto Preview, MongoDB Compass displays the following documents next to the $project pipeline stage:

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. Create a new directory called partial-match-example and initialize your project with the dotnet new command.

    mkdir partial-match-example
    cd partial-match-example
    dotnet new console
  2. Add the .NET/C# Driver to your project as a dependency.

    dotnet add package MongoDB.Driver
2
  1. Replace the contents of the Program.cs file with the following code.

    The code example performs the following tasks:

    • Imports mongodb packages and dependencies.

    • Establishes a connection to your Atlas cluster.

    • Runs a query that uses:

      • $search stage to look for a term

      • $limit stage to limit the output to 5 results

      • $project stage to exclude all fields except title
        and plot
    • Iterates over the cursor to print the documents that match the query.

    The query allows the following for matching the query string new purchase to a word in the field:

    • Allows the words new and purchase to appear anywhere in the plot field.

    • Allows two character variation in the query string to match the query to a word in the field, but doesn't allow the first character in the query string to change.

    • Allows up to two hundred and fifty six similar terms to be considered.

    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}

    The query specifies the query string new purpose with a positional distance of up to 5 between new and purpose.

    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}

    The query uses (.*) regular expression to match any number of characters with the partial query string.

    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}

    The query uses * in the query string to match 0 or more characters before and after the specified words in the partial query string.

    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. Before you run the sample, replace <connection-string> with your Atlas connection string. Ensure that your connection string includes your database user's credentials. To learn more, see Connect via Drivers.

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

The following query uses the operator to query the plot field of the sample_mflix.movies collection. The query includes a:

  • $limit stage to limit the output to 5 results

  • $project stage to exclude all fields except title and plot

The query allows the following for matching the query string new purchase to a word in the field:

  • Allows the words new and purchase to appear anywhere in the plot field.

  • Allows two character variation in the query string to match the query to a word in the field, but doesn't allow the first character in the query string to change.

  • Allows up to two hundred and fifty six similar terms to be considered.

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}

The query specifies the query string new purpose with a positional distance of up to 5 between new and purpose.

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}

The query uses (.*) regular expression to match any number of characters with the partial query string.

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}

The query uses * in the query string to match 0 or more characters before and after the specified words in the partial query string.

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}

Note

Before you run the sample, replace <connection-string> with your Atlas connection string. Ensure that your connection string includes your database user's credentials. To learn more, see Connect via Drivers.

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 or higher version
mongodb-driver-sync
4.3.0 or higher version
slf4j-log4j12
1.7.30 or higher version
2
3

The code example performs the following tasks:

  • Imports mongodb packages and dependencies.

  • Establishes a connection to your Atlas cluster.

  • Runs a query that uses:

    • $search stage to look for a term

    • $limit stage to limit the output to 5 results

    • $project stage to exclude all fields except title and plot

  • Iterates over the cursor to print the documents that match the query.

The query allows the following for matching the query string new purchase to a word in the field:

  • Allows the words new and purchase to appear anywhere in the plot field.

  • Allows two character variation in the query string to match the query to a word in the field, but doesn't allow the first character in the query string to change.

  • Allows up to two hundred and fifty six similar terms to be considered.

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}

The query specifies the query string new purpose with a positional distance of up to 5 between new and purpose.

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}

The query uses (.*) regular expression to match any number of characters with the partial query string.

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}

The query uses * in the query string to match 0 or more characters before and after the specified words in the partial query string.

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}

Note

To run the sample code in your Maven environment, add the following above the import statements in your file.

package com.mongodb.drivers;

Before you run the sample, replace <connection-string> with your Atlas connection string. Ensure that your connection string includes your database user's credentials. To learn more, see Connect via Drivers.

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 or higher version
2
3

The code example performs the following tasks:

  • Imports mongodb packages and dependencies.

  • Establishes a connection to your Atlas cluster.

  • Runs a query that uses:

    • $search stage to look for a term

    • $limit stage to limit the output to 5 results

    • $project stage to exclude all fields except title and plot

  • Prints the documents that match the query from the AggregateFlow instance.

The query allows the following for matching the query string new purchase to a word in the field:

  • Allows the words new and purchase to appear anywhere in the plot field.

  • Allows two character variation in the query string to match the query to a word in the field, but doesn't allow the first character in the query string to change.

  • Allows up to two hundred and fifty six similar terms to be considered.

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}

The query specifies the query string new purpose with a positional distance of up to 5 between new and purpose.

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}

The query uses (.*) regular expression to match any number of characters with the partial query string.

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}

The query uses * in the query string to match 0 or more characters before and after the specified words in the partial query string.

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}

Before you run the sample, replace <connection-string> with your Atlas connection string. Ensure that your connection string includes your database user's credentials. To learn more, see Connect via Drivers.

4

When you run the PartialMatchQuery.kt program in your IDE, it prints the following documents:

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

The code example performs the following tasks:

  • Imports mongodb, MongoDB's Node.js driver.

  • Creates an instance of the MongoClient class to establish a connection to your Atlas cluster.

  • Runs a query that uses:

    • $search stage to look for a term

    • $limit stage to limit the output to 5 results

    • $project stage to exclude all fields except title and plot

  • Iterates over the cursor to print the documents that match the query.

The query allows the following for matching the query string new purchase to a word in the field:

  • Allows the words new and purchase to appear anywhere in the plot field.

  • Allows two character variation in the query string to match the query to a word in the field, but doesn't allow the first character in the query string to change.

  • Allows up to two hundred and fifty six similar terms to be considered.

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);

The query specifies the query string new purpose with a positional distance of up to 5 between new and purpose.

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);

The query uses (.*) regular expression to match any number of characters with the partial query string.

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);

The query uses * in the query string to match 0 or more characters before and after the specified words in the partial query string.

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);

Note

Before you run the sample, replace <connection-string> with your Atlas connection string. Ensure that your connection string includes your database user's credentials. To learn more, see Connect via Drivers.

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

The following code example:

  • Imports pymongo, MongoDB's Python driver, and the dns module, which is required to connect pymongo to Atlas using a DNS seed list connection string.

  • Creates an instance of the MongoClient class to establish a connection to your Atlas cluster.

  • Runs a query that uses:

    • $search stage to look for a term

    • $limit stage to limit the output to 5 results

    • $project stage to exclude all fields except title and plot

  • Iterates over the cursor to print the documents that match the query.

The query allows the following for matching the query string new purchase to a word in the field:

  • Allows the words new and purchase to appear anywhere in the plot field.

  • Allows two character variation in the query string to match the query to a word in the field, but doesn't allow the first character in the query string to change.

  • Allows up to two hundred and fifty six similar terms to be considered.

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)

The query specifies the query string new purpose with a positional distance of up to 5 between new and purpose.

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)

The query uses (.*) regular expression to match any number of characters with the partial query string.

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)

The query uses * in the query string to match 0 or more characters before and after the specified words in the partial query string.

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)

Note

Before you run the sample, replace <connection-string> with your Atlas connection string. Ensure that your connection string includes your database user's credentials. To learn more, see Connect via Drivers.

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'
}

Back

Multilingual

Next

Across Collections