tokenizers
For the complete MongoDB documentation index, see www.mongodb.com/docs/llms.txt
<!-- Tab options on this page. Append to the .md URL to filter: ?tabs=<id,...> select specific tabs (e.g. ?tabs=nodejs,shell) ?allTabs=true include every tab (no param) default: one tab per tabset
Available tabs: other tabs: vib, jsoneditor, visual-editor, json-editor -->
Tokenizers for Custom Search Analyzers
A custom analyzer's tokenizer determines how MongoDB Search splits up text into discrete chunks for indexing. Tokenizers require a type field, and some take additional options as well.
"tokenizer": {
"type": "<tokenizer-type>",
"<additional-option>": "<value>"
}
The sample index definitions and queries on this page use the [sample collection](https://www.mongodb.com/docs/search/indexes/analyzers/custom.md#std-label-custom-analyzers-eg-coll named minutes. To try these examples, load the minutes collection on your cluster and navigate to the Create a Search Index page in the Atlas UI following the steps in the [Create a MongoDB Search Index](https://www.mongodb.com/docs/search/tutorial.md#std-label-create-fts-index tutorial. Then, select the minutes collection as your data source, and follow the example procedure to create an index from the Atlas UI or using [mongosh.](https://www.mongodb.com/docs/mongodb-shell.md#mongodb-binary-bin.mongosh
edgeGram
The edgeGram tokenizer tokenizes input from the left side, or “edge”, of a text input into n-grams of given sizes. You can't use a custom analyzer with [edgeGram](https://www.mongodb.com/docs/search/indexes/analyzers/tokenizers.md#std-label-edgeGram-tokenizer-ref tokenizer in the analyzer field for [synonym](https://www.mongodb.com/docs/search/indexes/synonyms.md#std-label-synonyms-ref or [autocomplete](https://www.mongodb.com/docs/search/indexes/field-types/autocomplete-type.md#std-label-bson-data-types-autocomplete [field mapping definitions.](https://www.mongodb.com/docs/search/indexes/define-field-mappings.md#std-label-fts-field-mappings
Attributes
The edgeGram tokenizer has the following attributes:
Note:
The edgeGram tokenizer yields multiple output tokens per word and across words in input text, producing token graphs.
Because autocomplete.
| Name | Type | Required? | Description |
|---|---|---|---|
type |
string | yes | Human-readable label that identifies this tokenizer type. Value must be edgeGram. |
minGram |
integer | yes | Number of characters to include in the shortest token created. |
maxGram |
integer | yes | Number of characters to include in the longest token created. |
Example
The following index definition indexes the message field in the minutes collection using a custom analyzer named edgegramExample. It uses the edgeGram tokenizer to create tokens (searchable terms) between 2 and 7 characters long starting from the first character on the left side of words in the message field.
Visual Editor
-
In the Custom Analyzers section, click Add Custom Analyzer.
-
Select the Create Your Own radio button and click Next.
-
Type
edgegramExamplein the Analyzer Name field. -
Expand Tokenizer if it's collapsed.
-
Select edgeGram from the dropdown and type the value for the following fields:
| Field | Value |
|---|---|
| minGram | 2 |
| maxGram | 7 |
-
Click Add to add the custom analyzer to your index.
-
In the Field Mappings section, click Add Field Mapping to apply the custom analyzer on the message field.
-
Select message from the Field Name dropdown and String from the Data Type dropdown.
-
In the properties section for the data type, select
edgegramExamplefrom the Index Analyzer and Search Analyzer dropdowns. -
Click Add, then Save Changes.
db.minutes.createSearchIndex(
"default",
{
"mappings": {
"dynamic": true,
"fields": {
"message": {
"analyzer": "edgegramExample",
"type": "string"
}
}
},
"analyzers": [
{
"charFilters": [],
"name": "edgegramExample",
"tokenFilters": [],
"tokenizer": {
"maxGram": 7,
"minGram": 2,
"type": "edgeGram"
}
}
]
}
)
The following query searches the message field in the minutes collection for text that begin with tr.
-
Click the Query button for your index.
-
Click Edit Query to edit the query.
-
Click on the query bar and select the database and collection.
-
Replace the default query with the following and click Find:
json
{
"$search": {
"text": {
"query": "tr",
"path": "message"
}
}
}
Output:
```js SCORE: 0.3150668740272522 _id: "1" message: "try to siGn-In" page_updated_by: Object last_name: "AUERBACH" first_name: "Siân" email: "auerbach@example.com" phone: "(123)-456-7890" text: Object en_US: " This page deals with department meetings." sv_FI: "Den här sidan behandlar avdelningsmöten" fr_CA: "Cette page traite des réunions de département"
SCORE: 0.3150668740272522 _id: "3" message: "try to sign-in" page_updated_by: Object last_name: "LEWINSKY" first_name: "Brièle" email: "lewinsky@example.com" phone: "(123).456.9870" text: Object en_US: "We'll head out to the conference room by noon." ```
db.minutes.aggregate([
{
"$search": {
"text": {
"query": "tr",
"path": "message"
}
}
},
{
"$project": {
"_id": 1,
"message": 1
}
}
])
Output:
{ _id: 1, message: 'try to siGn-In' },
{ _id: 3, message: 'try to sign-in' }
MongoDB Search returns documents with _id: 1 and _id: 3 in the results because MongoDB Search created a token with the value tr using the edgeGram tokenizer for the documents, which matches the search term. If you index the message field using the standard tokenizer, MongoDB Search would not return any results for the search term tr.
The following table shows the tokens that the edgeGram tokenizer and by comparison, the standard tokenizer, create for the documents in the results:
| Tokenizer | Token Outputs |
|---|---|
standard |
try, to, sign, in |
edgeGram |
tr, try, try{SPACE}, try t, try to, try to{SPACE}, to, to{SPACE}, to s, to si, to sig, to sign, si, sig, sign, sign{SPACE}, sign i, sign in, in |
Use the edgeGram tokenizer when your search terms begin at the start of a word, such as a search for tr matching try. Use the [nGram](https://www.mongodb.com/docs/search/indexes/analyzers/tokenizers.md#std-label-nGram-tokenizer-ref tokenizer when your search terms can begin in the middle of a word, such as a search for eek matching weekly.
keyword
The keyword tokenizer tokenizes the entire input as a single token. MongoDB Search doesn't index string fields that exceed 32766 characters using the keyword tokenizer.
Attributes
The keyword tokenizer has the following attributes:
| Name | Type | Required? | Description |
|---|---|---|---|
type |
string | yes | Human-readable label that identifies this tokenizer type. Value must be keyword. |
Example
The following index definition indexes the message field in the minutes collection using a custom analyzer named keywordExample. It uses the keyword tokenizer to create a token (searchable terms) on the entire field as a single term.
Visual Editor
-
In the Custom Analyzers section, click Add Custom Analyzer.
-
Select the Create Your Own radio button and click Next.
-
Type
keywordExamplein the Analyzer Name field. -
Expand Tokenizer if it's collapsed.
-
Select keyword from the dropdown.
-
Click Add to add the custom analyzer to your index.
-
In the Field Mappings section, click Add Field Mapping to apply the custom analyzer on the message field.
-
Select message from the Field Name dropdown and String from the Data Type dropdown.
-
In the properties section for the data type, select
keywordExamplefrom the Index Analyzer and Search Analyzer dropdowns. -
Click Add, then Save Changes.
db.minutes.createSearchIndex(
"default",
{
"mappings": {
"dynamic": true,
"fields": {
"message": {
"analyzer": "keywordExample",
"type": "string"
}
}
},
"analyzers": [
{
"charFilters": [],
"name": "keywordExample",
"tokenFilters": [],
"tokenizer": {
"type": "keyword"
}
}
]
}
)
The following query searches the message field in the minutes collection for the phrase try to sign-in.
-
Click the Query button for your index.
-
Click Edit Query to edit the query.
-
Click on the query bar and select the database and collection.
-
Replace the default query with the following and click Find:
json
{
"$search": {
"text": {
"query": "try to sign-in",
"path": "message"
}
}
}
Output:
js
SCORE: 0.5472603440284729 _id: "3"
message: "try to sign-in"
page_updated_by: Object
last_name: "LEWINSKY"
first_name: "Brièle"
email: "lewinsky@example.com"
phone: "(123).456.9870"
text: Object
en_US: "<body>We'll head out to the conference room by noon.</body>"
db.minutes.aggregate([
{
"$search": {
"text": {
"query": "try to sign-in",
"path": "message"
}
}
},
{
"$project": {
"_id": 1,
"message": 1
}
}
])
Output:
{ _id: 3, message: 'try to sign-in' }
MongoDB Search returns the document with _id: 3 in the results because MongoDB Search created a token with the value try to sign-in using the keyword tokenizer for the documents, which matches the search term. If you index the message field using the standard tokenizer, MongoDB Search returns documents with _id: 1, _id: 2 and _id: 3 for the search term try to sign-in because each document contains some of the tokens the standard tokenizer creates.
The following table shows the tokens that the keyword tokenizer and by comparison, the standard tokenizer, create for the document with _id: 3:
| Tokenizer | Token Outputs |
|---|---|
standard |
try, to, sign, in |
keyword |
try to sign-in |
nGram
The nGram tokenizer tokenizes into text chunks, or “n-grams”, of given sizes. You can't use a custom analyzer with [nGram](https://www.mongodb.com/docs/search/indexes/analyzers/tokenizers.md#std-label-nGram-tokenizer-ref tokenizer in the analyzer field for [synonym](https://www.mongodb.com/docs/search/indexes/synonyms.md#std-label-synonyms-ref or [autocomplete](https://www.mongodb.com/docs/search/indexes/field-types/autocomplete-type.md#std-label-bson-data-types-autocomplete [field mapping definitions.](https://www.mongodb.com/docs/search/indexes/define-field-mappings.md#std-label-fts-field-mappings
Attributes
The nGram tokenizer has the following attributes:
| Name | Type | Required? | Description |
|---|---|---|---|
type |
string | yes | Human-readable label that identifies this tokenizer type. Value must be nGram. |
minGram |
integer | yes | Number of characters to include in the shortest token created. |
maxGram |
integer | yes | Number of characters to include in the longest token created. |
Example
The following index definition indexes the title field in the minutes collection using a custom analyzer named ngramExample. It uses the nGram tokenizer to create tokens (searchable terms) between 4 and 6 characters long in the title field.
Visual Editor
-
In the Custom Analyzers section, click Add Custom Analyzer.
-
Select the Create Your Own radio button and click Next.
-
Type
ngramAnalyzerin the Analyzer Name field. -
Expand Tokenizer if it's collapsed.
-
Select nGram from the dropdown and type the value for the following fields:
| Field | Value |
|---|---|
| minGram | 4 |
| maxGram | 6 |
-
Click Add to add the custom analyzer to your index.
-
In the Field Mappings section, click Add Field Mapping to apply the custom analyzer on the message field.
-
Select message from the Field Name dropdown and String from the Data Type dropdown.
-
In the properties section for the data type, select
ngramAnalyzerfrom the Index Analyzer and Search Analyzer dropdowns. -
Click Add, then Save Changes.
db.minutes.createSearchIndex("default", {
"mappings": {
"dynamic": true,
"fields": {
"title": {
"analyzer": "ngramExample",
"type": "string"
}
}
},
"analyzers": [
{
"charFilters": [],
"name": "ngramExample",
"tokenFilters": [],
"tokenizer": {
"maxGram": 6,
"minGram": 4,
"type": "nGram"
}
}
]
})
The following query searches the title field in the minutes collection for the term ekly.
-
Click the Query button for your index.
-
Click Edit Query to edit the query.
-
Click on the query bar and select the database and collection.
-
Replace the default query with the following and click Find:
json
{
"$search": {
"index": "default",
"text": {
"query": "ekly",
"path": "title"
}
}
}
Output:
js
SCORE: 0.5895273089408875 _id: "1"
message: "try to siGn-In"
page_updated_by: Object
last_name: "AUERBACH"
first_name: "Siân"
email: "auerbach@example.com"
phone: "(123)-456-7890"
text: Object
en_US: "<head> This page deals with department meetings.</head>"
sv_FI: "Den här sidan behandlar avdelningsmöten"
fr_CA: "Cette page traite des réunions de département"
db.minutes.aggregate([
{
"$search": {
"text": {
"query": "ekly",
"path": "title"
}
}
},
{
"$project": {
"_id": 1,
"title": 1
}
}
])
Output:
{ _id: 1, title: "The team's weekly meeting" }
MongoDB Search returns the document with _id: 1 in the results because MongoDB Search created a token with the value ekly using the nGram tokenizer for the documents, which matches the search term. If you index the title field using the standard or edgeGram tokenizer, MongoDB Search would not return any results for the search term ekly.
The following table shows the tokens that the nGram tokenizer and by comparison, the standard and edgeGram tokenizer create for the document with _id: 1:
| Tokenizer | Token Outputs |
|---|---|
standard |
The, team's, weekly, meeting |
edgeGram |
The{SPACE}, The t, The te, team, team', team's, week, weekl, weekly, meet, meeti, meetin |
nGram |
The{SPACE}, The t, The te, he t, he te, he tea, e te, e tea, e team, {SPACE}tea, {SPACE}team, {SPACE}team', team, team', team's, eam', eam's, eam's{SPACE}, am's, am's{SPACE}, am's w, m's{SPACE}, m's w, m's we, 's w, 's we, 's wee, s we, s wee, s week, {SPACE}wee, {SPACE}week, {SPACE}weekl, week, weekl, weekly, eekl, eekly, eekly{SPACE}, ekly, ekly{SPACE}, ekly m, kly{SPACE}, kly m, kly me, ly m, ly me, ly mee, y me, y mee, y meet, {SPACE}mee, {SPACE}meet, {SPACE}meeti, meet, meeti, meetin, eeti, eetin, eeting, etin, eting, ting |
regexCaptureGroup
The regexCaptureGroup tokenizer matches a Java regular expression pattern to extract tokens.
Tip:
To learn more about Java regular expression syntax, see the Pattern class in the Java documentation.
Attributes
The regexCaptureGroup tokenizer has the following attributes:
| Name | Type | Required? | Description |
|---|---|---|---|
type |
string | yes | Human-readable label that identifies this tokenizer type. Value must be regexCaptureGroup. |
pattern |
string | yes | Regular expression to match against. |
group |
integer | yes | Index of the character group within the matching expression to extract into tokens. Use 0 to extract all character groups. |
Example
The following index definition indexes the page_updated_by.phone field in the minutes collection using a custom analyzer named phoneNumberExtractor. It uses the following:
-
mappingscharacter filter to remove parenthesis around the first three digits and replace all spaces and periods with dashes -
regexCaptureGrouptokenizer to create a single token from the first US-formatted phone number present in the text input
Visual Editor
-
In the Custom Analyzers section, click Add Custom Analyzer.
-
Select the Create Your Own radio button and click Next.
-
Type
phoneNumberExtractorin the Analyzer Name field. -
Expand Character Filters and click Add character filter.
-
Select mapping from the dropdown and click Add mapping.
-
Enter the following characters in the Original field, one at a time, and leave the corresponding Replacement field empty.
| Original | Replacement |
|---|---|
- |
|
. |
|
( |
|
) |
-
Click Add character filter.
-
Expand Tokenizer if it's collapsed.
-
Select regexCaptureGroup from the dropdown and type the value for the following fields:
| Field | Value |
|---|---|
| pattern | ^\\b\\d{3}[-]?\\d{3}[-]?\\d{4}\\b$ |
| group | 0 |
-
Click Add to add the custom analyzer to your index.
-
In the Field Mappings section, click Add Field Mapping to apply the custom analyzer on the page_updated_by.phone field.
-
Select page_updated_by.phone from the Field Name dropdown and String from the Data Type dropdown.
-
In the properties section for the data type, select
phoneNumberExtractorfrom the Index Analyzer and Search Analyzer dropdowns. -
Click Add, then Save Changes.
db.minutes.createSearchIndex("default", {
"mappings": {
"dynamic": true,
"fields": {
"page_updated_by": {
"fields": {
"phone": {
"analyzer": "phoneNumberExtractor",
"type": "string"
}
},
"type": "document"
}
}
},
"analyzers": [
{
"charFilters": [
{
"mappings": {
" ": "-",
"(": "",
")": "",
".": "-"
},
"type": "mapping"
}
],
"name": "phoneNumberExtractor",
"tokenFilters": [],
"tokenizer": {
"group": 0,
"pattern": "^\\b\\d{3}[-]?\\d{3}[-]?\\d{4}\\b$",
"type": "regexCaptureGroup"
}
}
]
})
The following query searches the page_updated_by.phone field in the minutes collection for the phone number 123-456-9870.
-
Click the Query button for your index.
-
Click Edit Query to edit the query.
-
Click on the query bar and select the database and collection.
-
Replace the default query with the following and click Find:
json
{
"$search": {
"index": "default",
"text": {
"query": "123-456-9870",
"path": "page_updated_by.phone"
}
}
}
Output:
js
SCORE: 0.5472603440284729 _id: "3"
message: "try to sign-in"
page_updated_by: Object
last_name: "LEWINSKY"
first_name: "Brièle"
email: "lewinsky@example.com"
phone: "(123).456.9870"
text: Object
en_US: "<body>We'll head out to the conference room by noon.</body>"
db.minutes.aggregate([
{
"$search": {
"text": {
"query": "123-456-9870",
"path": "page_updated_by.phone"
}
}
},
{
"$project": {
"_id": 1,
"page_updated_by.phone": 1
}
}
])
Output:
{ _id: 3, page_updated_by: { phone: '(123).456.9870' }
MongoDB Search returns the document with _id: 3 in the results because MongoDB Search created a token with the value 123-456-7890 using the regexCaptureGroup tokenizer for the documents, which matches the search term. If you index the page_updated_by.phone field using the standard tokenizer, MongoDB Search returns all of the documents for the search term 123-456-7890.
The following table shows the tokens that the regexCaptureGroup tokenizer and by comparison, the standard tokenizer, create for the document with _id: 3:
| Tokenizer | Token Outputs |
|---|---|
standard |
123, 456.9870 |
regexCaptureGroup |
123-456-9870 |
regexSplit
The regexSplit tokenizer splits tokens with a Java regular-expression based delimiter.
Tip:
To learn more about Java regular expression syntax, see the Pattern class in the Java documentation.
Attributes
The regexSplit tokenizer has the following attributes:
| Name | Type | Required? | Description |
|---|---|---|---|
type |
string | yes | Human-readable label that identifies this tokenizer type. Value must be regexSplit. |
pattern |
string | yes | Regular expression to match against. |
Example
The following index definition indexes the page_updated_by.phone field in the minutes collection using a custom analyzer named dashDotSpaceSplitter. It uses the regexSplit tokenizer to create tokens (searchable terms) from one or more hyphens, periods and spaces on the page_updated_by.phone field.
Visual Editor
-
In the Custom Analyzers section, click Add Custom Analyzer.
-
Select the Create Your Own radio button and click Next.
-
Type
dashDotSpaceSplitterin the Analyzer Name field. -
Expand Tokenizer if it's collapsed.
-
Select regexSplit from the dropdown and type the value for the following field:
| Field | Value |
|---|---|
| pattern | [-. ]+ |
-
Click Add to add the custom analyzer to your index.
-
In the Field Mappings section, click Add Field Mapping to apply the custom analyzer on the page_updated_by.phone field.
-
Select page_updated_by.phone from the Field Name dropdown and String from the Data Type dropdown.
-
In the properties section for the data type, select
dashDotSpaceSplitterfrom the Index Analyzer and Search Analyzer dropdowns. -
Click Add, then Save Changes.
db.minutes.createSearchIndex("default", {
"mappings": {
"dynamic": true,
"fields": {
"page_updated_by": {
"fields": {
"phone": {
"analyzer": "dashDotSpaceSplitter",
"type": "string"
}
},
"type": "document"
}
}
},
"analyzers": [
{
"charFilters": [],
"name": "dashDotSpaceSplitter",
"tokenFilters": [],
"tokenizer": {
"pattern": "[-. ]+",
"type": "regexSplit"
}
}
]
})
The following query searches the page_updated_by.phone field in the minutes collection for the digits 9870.
-
Click the Query button for your index.
-
Click Edit Query to edit the query.
-
Click on the query bar and select the database and collection.
-
Replace the default query with the following and click Find:
json
{
"$search": {
"index": "default",
"text": {
"query": "9870",
"path": "page_updated_by.phone"
}
}
}
Output:
js
SCORE: 0.5472603440284729 _id: "3"
message: "try to sign-in"
page_updated_by: Object
last_name: "LEWINSKY"
first_name: "Brièle"
email: "lewinsky@example.com"
phone: "(123).456.9870"
text: Object
en_US: "<body>We'll head out to the conference room by noon.</body>"
db.minutes.aggregate([
{
"$search": {
"text": {
"query": "9870",
"path": "page_updated_by.phone"
}
}
},
{
"$project": {
"_id": 1,
"page_updated_by.phone": 1
}
}
])
Output:
{ _id: 3, page_updated_by: { phone: '(123).456.9870' }
MongoDB Search returns the document with _id: 3 in the results because MongoDB Search created a token with the value 9870 using the regexSplit tokenizer for the documents, which matches the search term. If you index the page_updated_by.phone field using the standard tokenizer, MongoDB Search would not return any results for the search term 9870.
The following table shows the tokens that the regexCaptureGroup tokenizer and by comparison, the standard tokenizer, create for the document with _id: 3:
| Tokenizer | Token Outputs |
|---|---|
standard |
123, 456.9870 |
regexSplit |
(123), 456, 9870 |
standard
The standard tokenizer tokenizes based on word break rules from the Unicode Text Segmentation algorithm.
Attributes
The standard tokenizer has the following attributes:
| Name | Type | Required? | Description |
|---|---|---|---|
type |
string | yes | Human-readable label that identifies this tokenizer type. Value must be standard. |
maxTokenLength |
integer | no | Maximum length for a single token. Tokens greater than this length are split at maxTokenLength into multiple tokens. Default: 255 |
Example
The following index definition indexes the message field in the minutes collection using a custom analyzer named standardExample. It uses the standard tokenizer and the [stopword token filter.](https://www.mongodb.com/docs/search/indexes/analyzers/token-filters.md#std-label-stopword-tf-ref
Visual Editor
-
In the Custom Analyzers section, click Add Custom Analyzer.
-
Select the Create Your Own radio button and click Next.
-
Type
standardExamplein the Analyzer Name field. -
Expand Tokenizer if it's collapsed.
-
Select standard from the dropdown.
-
Click Add to add the custom analyzer to your index.
-
In the Field Mappings section, click Add Field Mapping to apply the custom analyzer on the message field.
-
Select message from the Field Name dropdown and String from the Data Type dropdown.
-
In the properties section for the data type, select
standardExamplefrom the Index Analyzer and Search Analyzer dropdowns. -
Click Add, then Save Changes.
db.minutes.createSearchIndex(
"default",
{
"mappings": {
"dynamic": true,
"fields": {
"message": {
"analyzer": "standardExample",
"type": "string"
}
}
},
"analyzers": [
{
"charFilters": [],
"name": "standardExample",
"tokenFilters": [],
"tokenizer": {
"type": "standard"
}
}
]
}
)
The following query searches the message field in the minutes collection for the term signature.
-
Click the Query button for your index.
-
Click Edit Query to edit the query.
-
Click on the query bar and select the database and collection.
-
Replace the default query with the following and click Find:
json
{
"$search": {
"text": {
"query": "signature",
"path": "message"
}
}
}
Output:
js
SCORE: 0.5376965999603271 _id: "4"
message: "write down your signature or phone №"
page_updated_by: Object
last_name: "LEVINSKI"
first_name: "François"
email: "levinski@example.com"
phone: "123-456-8907"
text: Object
en_US: "<body>This page has been updated with the items on the agenda.</body>"
es_MX: "La página ha sido actualizada con los puntos de la agenda."
pl_PL: "Strona została zaktualizowana o punkty porządku obrad."
db.minutes.aggregate([
{
"$search": {
"text": {
"query": "signature",
"path": "message"
}
}
},
{
"$project": {
"_id": 1,
"message": 1
}
}
])
Output:
{ _id: 4, message: 'write down your signature or phone №' }
MongoDB Search returns the document with _id: 4 because MongoDB Search created a token with the value signature using the standard tokenizer for the documents, which matches the search term. If you index the message field using the keyword tokenizer, MongoDB Search would not return any results for the search term signature.
The following table shows the tokens that the standard tokenizer and by comparison, the keyword analyzer, create for the document with _id: 4:
| Tokenizer | Token Outputs |
|---|---|
standard |
write, down, your, signature, or, phone |
keyword |
write down your signature or phone № |
uaxUrlEmail
The uaxUrlEmail tokenizer tokenizes URL (Uniform Resource Locator)s and email addresses. Although uaxUrlEmail tokenizer tokenizes based on word break rules from the Unicode Text Segmentation algorithm, we recommend using uaxUrlEmail tokenizer only when the indexed field value includes URL (Uniform Resource Locator)s and email addresses. For fields that don't include URL (Uniform Resource Locator)s or email addresses, use the [standard](https://www.mongodb.com/docs/search/indexes/analyzers/tokenizers.md#std-label-standard-tokenizer-ref tokenizer to create tokens based on word break rules.
Attributes
The uaxUrlEmail tokenizer has the following attributes:
| Name | Type | Required? | Description |
|---|---|---|---|
type |
string | yes | Human-readable label that identifies this tokenizer type. Value must be uaxUrlEmail. |
maxTokenLength |
int | no | Maximum number of characters in one token. Default: 255 |
Example
Basic Example
Create a simple index using the uaxUrlEmail tokenizer.
The following index definition indexes the page_updated_by.email field in the minutes collection using a custom analyzer named basicEmailAddressAnalyzer. It uses the uaxUrlEmail tokenizer to create tokens (searchable terms) from URL (Uniform Resource Locator)s and email addresses in the page_updated_by.email field.
Visual Editor
-
In the Custom Analyzers section, click Add Custom Analyzer.
-
Select the Create Your Own radio button and click Next.
-
Type
basicEmailAddressAnalyzerin the Analyzer Name field. -
Expand Tokenizer if it's collapsed.
-
Select uaxUrlEmail from the dropdown.
-
Click Add to add the custom analyzer to your index.
-
In the Field Mappings section, click Add Field Mapping to apply the custom analyzer on the page_updated_by.email field.
-
Select page_updated_by.email from the Field Name dropdown and String from the Data Type dropdown.
-
In the properties section for the data type, select
basicEmailAddressAnalyzerfrom the Index Analyzer and Search Analyzer dropdowns. -
Click Add, then Save Changes.
db.minutes.createSearchIndex("default", {
"mappings": {
"fields": {
"page_updated_by": {
"fields": {
"email": {
"analyzer": "basicEmailAddressAnalyzer",
"type": "string"
}
},
"type": "document"
}
}
},
"analyzers": [
{
"name": "basicEmailAddressAnalyzer",
"tokenizer": {
"type": "uaxUrlEmail"
}
}
]
})
The following query searches the page_updated_by.email field in the minutes collection for the email lewinsky@example.com.
-
Click the Query button for your index.
-
Click Edit Query to edit the query.
-
Click on the query bar and select the database and collection.
-
Replace the default query with the following and click Find:
json
{
"$search": {
"text": {
"query": "lewinsky@example.com",
"path": "page_updated_by.email"
}
}
}
Output:
js
SCORE: 0.5472603440284729 _id: "3"
message: "try to sign-in"
page_updated_by: Object
last_name: "LEWINSKY"
first_name: "Brièle"
email: "lewinsky@example.com"
phone: "(123).456.9870"
text: Object
en_US: "<body>We'll head out to the conference room by noon.</body>"
db.minutes.aggregate([
{
"$search": {
"autocomplete": {
"query": "lewinsky@example.com",
"path": "page_updated_by.email"
}
}
},
{
"$project": {
"_id": 1,
"page_updated_by.email": 1
}
}
])
Output:
{ _id: 3, page_updated_by: { email: 'lewinsky@example.com' } }
MongoDB Search returns the document with _id: 3 in the results because MongoDB Search created a token with the value lewinsky@example.com using the uaxUrlEmail tokenizer for the documents, which matches the search term. If you index the page_updated_by.email field using the standard tokenizer, MongoDB Search returns all the documents for the search term lewinsky@example.com.
The following table shows the tokens that the uaxUrlEmail tokenizer and by comparison, the standard tokenizer, create for the document with _id: 3:
| Tokenizer | Token Outputs |
|---|---|
standard |
lewinsky, example.com |
uaxUrlEmail |
lewinsky@example.com |
Advanced Example
Create an index using the uaxUrlEmail tokenizer with autocomplete tokenization strategy.
The following index definition indexes the page_updated_by.email field in the minutes collection using a custom analyzer named emailAddressAnalyzer. It uses the following:
-
The [autocomplete](https://www.mongodb.com/docs/search/query/operators-collectors/autocomplete.md#std-label-autocomplete-ref type with an
edgeGram[tokenization strategy](https://www.mongodb.com/docs/search/indexes/field-types/autocomplete-type.md#std-label-bson-data-types-autocomplete -
The
uaxUrlEmailtokenizer to create tokens (searchable terms) from URL (Uniform Resource Locator)s and email addresses
Visual Editor
-
In the Custom Analyzers section, click Add Custom Analyzer.
-
Select the Create Your Own radio button and click Next.
-
Type
emailAddressAnalyzerin the Analyzer Name field. -
Expand Tokenizer if it's collapsed.
-
Select uaxUrlEmail from the dropdown.
-
Click Add to add the custom analyzer to your index.
-
In the Field Mappings section, click Add Field Mapping to apply the custom analyzer on the page_updated_by.email field.
-
Select page_updated_by.email from the Field Name dropdown and Autocomplete from the Data Type dropdown.
-
In the properties section for the data type, select
emailAddressAnalyzerfrom the Index Analyzer and Search Analyzer dropdowns. -
Click Add, then Save Changes.
db.minutes.createSearchIndex("default", {
"mappings": {
"fields": {
"page_updated_by": {
"fields": {
"email": {
"analyzer": "emailAddressAnalyzer",
"tokenization": "edgeGram",
"type": "autocomplete"
}
},
"type": "document"
}
}
},
"analyzers": [
{
"name": "emailAddressAnalyzer",
"tokenizer": {
"type": "uaxUrlEmail"
}
}
]
})
The following query searches the page_updated_by.email field in the minutes collection for the term exam.
-
Click the Query button for your index.
-
Click Edit Query to edit the query.
-
Click on the query bar and select the database and collection.
-
Replace the default query with the following and click Find:
json
{
"$search": {
"autocomplete": {
"query": "lewinsky@example.com",
"path": "page_updated_by.email"
}
}
}
Output:
js
SCORE: 1.0203158855438232 _id: "3"
message: "try to sign-in"
page_updated_by: Object
last_name: "LEWINSKY"
first_name: "Brièle"
email: "lewinsky@example.com"
phone: "(123).456.9870"
text: Object
en_US: "<body>We'll head out to the conference room by noon.</body>"
db.minutes.aggregate([
{
"$search": {
"autocomplete": {
"query": "lewinsky@example.com",
"path": "page_updated_by.email"
}
}
},
{
"$project": {
"_id": 1,
"page_updated_by.email": 1
}
}
])
Output:
{ _id: 3, page_updated_by: { email: 'lewinsky@example.com' } }
MongoDB Search returns the document with _id: 3 in the results because MongoDB Search created a token with the value lewinsky@example.com using the uaxUrlEmail tokenizer for the documents, which matches the search term. If you index the page_updated_by.email field using the standard tokenizer, MongoDB Search returns all the documents for the search term lewinsky@example.com.
The following table shows the tokens that the uaxUrlEmail tokenizer and by comparison, the standard tokenizer, create for the document with _id: 3:
| Tokenizer | MongoDB Search Field Type | Token Outputs |
|---|---|---|
standard |
autocomplete edgeGram |
le, lew, lewi, lewin, lewins, lewinsk, lewinsky, lewinsky@, lewinsky, ex, exa, exam, examp, exampl, example, example., example.c, example.co, example.com |
uaxUrlEmail |
autocomplete edgeGram |
le, lew, lewi, lewin, lewins, lewinsk, lewinsky, lewinsky@, lewinsky@e, lewinsky@ex, lewinsky@exa, lewinsky@exam, lewinsky@examp, lewinsky@exampl |
whitespace
The whitespace tokenizer tokenizes based on occurrences of whitespace between words.
Attributes
The whitespace tokenizer has the following attributes:
| Name | Type | Required? | Description |
|---|---|---|---|
type |
string | yes | Human-readable label that identifies this tokenizer type. Value must be whitespace. |
maxTokenLength |
integer | no | Maximum length for a single token. Tokens greater than this length are split at maxTokenLength into multiple tokens. Default: 255 |
Example
The following index definition indexes the message field in the minutes collection using a custom analyzer named whitespaceExample. It uses the whitespace tokenizer to create tokens (searchable terms) from any whitespaces in the message field.
Visual Editor
-
In the Custom Analyzers section, click Add Custom Analyzer.
-
Select the Create Your Own radio button and click Next.
-
Type
whitespaceExamplein the Analyzer Name field. -
Expand Tokenizer if it's collapsed.
-
Select whitespace from the dropdown.
-
Click Add to add the custom analyzer to your index.
-
In the Field Mappings section, click Add Field Mapping to apply the custom analyzer on the message field.
-
Select message from the Field Name dropdown and String from the Data Type dropdown.
-
In the properties section for the data type, select
whitespaceExamplefrom the Index Analyzer and Search Analyzer dropdowns. -
Click Add, then Save Changes.
db.minutes.createSearchIndex("default", {
"mappings": {
"dynamic": true,
"fields": {
"message": {
"analyzer": "whitespaceExample",
"type": "string"
}
}
},
"analyzers": [
{
"charFilters": [],
"name": "whitespaceExample",
"tokenFilters": [],
"tokenizer": {
"type": "whitespace"
}
}
]
})
The following query searches the message field in the minutes collection for the term SIGN-IN.
-
Click the Query button for your index.
-
Click Edit Query to edit the query.
-
Click on the query bar and select the database and collection.
-
Replace the default query with the following and click Find:
json
{
"$search": {
"text": {
"query": "sign-in",
"path": "message"
}
}
}
Output:
js
SCORE: 0.6722691059112549 _id: "3"
message: "try to sign-in"
page_updated_by: Object
last_name: "LEWINSKY"
first_name: "Brièle"
email: "lewinsky@example.com"
phone: "(123).456.9870"
text: Object
en_US: "<body>We'll head out to the conference room by noon.</body>"
db.minutes.aggregate([
{
"$search": {
"text": {
"query": "sign-in",
"path": "message"
}
}
},
{
"$project": {
"_id": 1,
"message": 1
}
}
])
Output:
[ { _id: 3, message: 'try to sign-in' } ]
MongoDB Search returns the document with _id: 3 in the results because MongoDB Search created a token with the value sign-in using the whitespace tokenizer for the documents, which matches the search term. If you index the message field using the standard tokenizer, MongoDB Search returns documents with _id: 1, _id: 2 and _id: 3 for the search term sign-in.
The following table shows the tokens that the whitespace tokenizer and by comparison, the standard tokenizer, create for the document with _id: 3:
| Tokenizer | Token Outputs |
|---|---|
standard |
try, to, sign, in |
whitespace |
try, to, sign-in |
