Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Filtros de Caracteres

Los filtros de caracteres examinan el texto carácter por carácter y realizan operaciones de filtrado. Los filtros de caracteres requieren un campo de tipo, y algunos también aceptan opciones adicionales.

Sintaxis
"charFilters": [
{
"type": "<filter-type>",
"<additional-option>": <value>
}
]

MongoDB Search admite los siguientes tipos de filtro de caracteres:

  • htmlStrip

  • icuNormalize

  • mapeo

  • persa

Las siguientes definiciones de índice y consultas de ejemplo utilizan el colección de muestras llamada minutes. Para seguir estos ejemplos, carga la colección minutes en tu clúster y navega a la Create a Search Index page en la interfaz de usuario de Atlas siguiendo los pasos del tutorial Crear un índice de búsqueda de MongoDB. A continuación, selecciona la colección minutes como tu fuente de datos y sigue el procedimiento de ejemplo para crear un índice desde la Interfaz de Usuario de Atlas o utilizando mongosh.


➤ Utiliza el menú desplegable Selecciona tu lenguaje para establecer el método para ejecutar los ejemplos en esta página.


El filtro de caracteres htmlStrip elimina los constructos HTML.

El filtro de caracteres htmlStrip tiene los siguientes atributos:

Nombre
Tipo
¿Requerido?
Descripción

type

string

Etiqueta legible por humanos que identifica este tipo de filtro de caracteres. El valor debe ser htmlStrip.

ignoredTags

Arreglo de cadenas

Lista que contiene las etiquetas HTML que se excluirán del filtro.

El siguiente ejemplo de definición de índice indexa el campo text.en_US en la colección de minutos usando un analizador personalizado llamado htmlStrippingAnalyzer. El analizador personalizado especifica lo siguiente:

  1. En la sección Custom Analyzers, haga clic en Add Custom Analyzer.

  2. Selecciona el botón de opción Create Your Own y haz clic en Next.

  3. Escriba htmlStrippingAnalyzer en el campo Analyzer Name.

  4. Expande Character Filters y haz clic en Add character filter.

  5. Selecciona htmlStrip del menú desplegable y escribe a en el campo ignoredTags.

  6. Haga clic en Add character filter.

  7. Expande Tokenizer si está colapsado y selecciona standard en el menú desplegable.

  8. Haz clic en Add para agregar el analizador personalizado a tu índice.

  9. En la sección Field Mappings, haz clic en Add Field Mapping para aplicar el analizador personalizado en text.en_US. campo anidado.

  10. Seleccione text.en_US anidado del menú desplegable Field Name y String del menú desplegable Data Type.

  11. En la sección de propiedades para el tipo de dato, selecciona htmlStrippingAnalyzer de los desplegables Index Analyzer y Search Analyzer.

  12. Haz clic en Add, luego en Save Changes.

Sustituye la definición de índice por defecto por la siguiente:

1 {
2 "mappings": {
3 "fields": {
4 "text": {
5 "type": "document",
6 "dynamic": true,
7 "fields": {
8 "en_US": {
9 "analyzer": "htmlStrippingAnalyzer",
10 "type": "string"
11 }
12 }
13 }
14 }
15 },
16 "analyzers": [{
17 "name": "htmlStrippingAnalyzer",
18 "charFilters": [{
19 "type": "htmlStrip",
20 "ignoredTags": ["a"]
21 }],
22 "tokenizer": {
23 "type": "standard"
24 },
25 "tokenFilters": []
26 }]
27 }
1db.minutes.createSearchIndex(
2 "default",
3 {
4 "mappings": {
5 "fields": {
6 "text": {
7 "type": "document",
8 "dynamic": true,
9 "fields": {
10 "en_US": {
11 "analyzer": "htmlStrippingAnalyzer",
12 "type": "string"
13 }
14 }
15 }
16 }
17 },
18 "analyzers": [
19 {
20 "name": "htmlStrippingAnalyzer",
21 "charFilters": [
22 {
23 "type": "htmlStrip",
24 "ignoredTags": ["a"]
25 }
26 ],
27 "tokenizer": {
28 "type": "standard"
29 },
30 "tokenFilters": []
31 }
32 ]
33 }
34)

La siguiente consulta busca ocurrencias de la cadena head en el campo text.en_US de la colección minutes.

  1. Haz clic en el botón Query para tu índice.

  2. Haz clic en Edit Query para editar la consulta.

  3. Haz clic en la barra de query y selecciona la base de datos y la colección.

  4. Reemplaza la consulta por defecto por la siguiente y haz clic en Find:

    {
    "$search": {
    "text": {
    "query": "head",
    "path": "text.en_US"
    }
    }
    }
    SCORE: 0.32283568382263184 _id: “2
    message: "do not forget to SIGN-IN. See ① for details."
    page_updated_by: Object
    last_name: "OHRBACH"
    first_name: "Noël"
    email: "ohrbach@example.com"
    phone: "(123) 456 0987"
    text: Object
    en_US: "The head of the sales department spoke first."
    fa_IR: "ابتدا رئیس بخش فروش صحبت کرد"
    sv_FI: "Först talade chefen för försäljningsavdelningen"
    SCORE: 0.3076632022857666 _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>"
1db.minutes.aggregate([
2 {
3 "$search": {
4 "text": {
5 "query": "head",
6 "path": "text.en_US"
7 }
8 }
9 },
10 {
11 "$project": {
12 "_id": 1,
13 "text.en_US": 1
14 }
15 }
16])
[
{
_id: 2,
text: { en_US: "The head of the sales department spoke first." }
},
{
_id: 3,
text: {
en_US: "<body>We'll head out to the conference room by noon.</body>"
}
}
]

MongoDB Search no devuelve el documento con _id: 1 porque la cadena head es parte de la etiqueta HTML <head>. El documento con _id: 3 contiene etiquetas HTML, pero la cadena head está en otro lugar, por lo que el documento es una coincidencia. La siguiente tabla muestra los tokens que MongoDB Search genera para los valores del campo text.en_US en los documentos _id: 1, _id: 2 y _id: 3 en la colección minutos utilizando el htmlStrippingAnalyzer.

ID de documento
Tokens de salida

_id: 1

This, page, deals, with, department, meetings

_id: 2

The, head, of, the, sales, department, spoke, first

_id: 3

We'll, head, out, to, the, conference, room, by, noon

El icuNormalize filtro de caracteres normaliza el texto con el normalizador de ICU. Está basado en el ICUNormalizer2CharFilterde Lucene.

El filtro de carácter icuNormalize tiene el siguiente atributo:

Nombre
Tipo
¿Requerido?
Descripción

type

string

Etiqueta legible por humanos que identifica este tipo de filtro de caracteres. El valor debe ser icuNormalize.

El siguiente ejemplo de definición de índice indexa el campo message en la colección de minutos usando un analizador personalizado llamado normalizingAnalyzer. El analizador personalizado especifica lo siguiente:

  • Normalizar el texto del valor del campo message con el filtro de caracteres icuNormalize.

  • Tokeniza las palabras en el campo basándose en la aparición de espacios en blanco entre palabras usando el tokenizador de espacios en blanco.

  1. En la sección Custom Analyzers, haga clic en Add Custom Analyzer.

  2. Selecciona el botón de opción Create Your Own y haz clic en Next.

  3. Escriba normalizingAnalyzer en el campo Analyzer Name.

  4. Expande Character Filters y haz clic en Add character filter.

  5. Seleccione icuNormalize en la lista desplegable y haga clic en Add character filter.

  6. Expande Tokenizer si está colapsado y selecciona whitespace en el menú desplegable.

  7. Haz clic en Add para agregar el analizador personalizado a tu índice.

  8. En la sección Field Mappings, haga clic en Add Field Mapping para aplicar el analizador personalizado en el campo mensaje.

  9. Selecciona mensaje del desplegable Field Name y String del desplegable Data Type .

  10. En la sección de propiedades para el tipo de dato, selecciona el normalizingAnalyzer de los menús desplegables Index Analyzer y Search Analyzer.

  11. Haz clic en Add, luego en Save Changes.

Sustituye la definición de índice por defecto por la siguiente:

1{
2 "mappings": {
3 "fields": {
4 "message": {
5 "type": "string",
6 "analyzer": "normalizingAnalyzer"
7 }
8 }
9 },
10 "analyzers": [
11 {
12 "name": "normalizingAnalyzer",
13 "charFilters": [
14 {
15 "type": "icuNormalize"
16 }
17 ],
18 "tokenizer": {
19 "type": "whitespace"
20 },
21 "tokenFilters": []
22 }
23 ]
24}
db.minutes.createSearchIndex("default", {
"mappings": {
"fields": {
"message": {
"type": "string",
"analyzer": "normalizingAnalyzer"
}
}
},
"analyzers": [
{
"name": "normalizingAnalyzer",
"charFilters": [
{
"type": "icuNormalize"
}
],
"tokenizer": {
"type": "whitespace"
},
"tokenFilters": []
}
]
})

La siguiente query busca ocurrencias de la string no (para número) en el campo message de la colección minutes.

  1. Haz clic en el botón Query para tu índice.

  2. Haz clic en Edit Query para editar la consulta.

  3. Haz clic en la barra de query y selecciona la base de datos y la colección.

  4. Reemplaza la consulta por defecto por la siguiente y haz clic en Find:

    {
    "$search": {
    "text": {
    "query": "no",
    "path": "message"
    }
    }
    }
    SCORE: 0.4923309087753296 _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."
1db.minutes.aggregate([
2 {
3 "$search": {
4 "text": {
5 "query": "no",
6 "path": "message"
7 }
8 }
9 },
10 {
11 "$project": {
12 "_id": 1,
13 "message": 1,
14 "title": 1
15 }
16 }
17])
[
{
_id: 4,
title: 'The daily huddle on tHe StandUpApp2',
message: 'write down your signature or phone №'
}
]

MongoDB Search hizo coincidir el documento con _id: 4 con el término de query no porque normalizaba el símbolo de número en el campo utilizando el filtro de caracteres icuNormalize y creaba el token no para esa abreviatura tipográfica de la palabra "número ". MongoDB Search genera los siguientes tokens para el valor del campo message del documento _id: 4 utilizando normalizingAnalyzer:

ID de documento
Tokens de salida

_id: 4

write, down, your, signature, or, phone, no

El filtro de caracteres mapping aplica mapeos de normalización especificados por el usuario a los caracteres. Se basa en el MappingCharFilter de Lucene.

El filtro de caracteres mapping tiene los siguientes atributos:

Nombre
Tipo
¿Requerido?
Descripción

type

string

Etiqueta legible por humanos que identifica este tipo de filtro de caracteres.

El valor debe ser mapping.

mappings

Objeto

Objeto que contiene una lista separada por comas de mapeos. Un mapeo indica que se debe sustituir un carácter o grupo de caracteres por otro, en el formato <original> : <replacement>.

El siguiente ejemplo de definición de índice indexa el campo page_updated_by.phone en la colección de minutos usando un analizador personalizado llamado mappingAnalyzer. El analizador personalizado especifica lo siguiente:

  • Elimina las instancias de guion (-), punto (.), paréntesis abierto ((), paréntesis cerrado ( )) y caracteres de espacio en el campo de teléfono utilizando el filtro de caracteres mapping.

  • Tokeniza toda la entrada como un solo token utilizando el tokenizador de palabras clave.

  1. En la sección Custom Analyzers, haga clic en Add Custom Analyzer.

  2. Selecciona el botón de opción Create Your Own y haz clic en Next.

  3. Escriba mappingAnalyzer en el campo Analyzer Name.

  4. Expande Character Filters y haz clic en Add character filter.

  5. Seleccione mapping del menú desplegable y haga clic en Add mapping.

  6. Ingrese los siguientes caracteres en el campo Original, uno a la vez, y deje el campo Replacement correspondiente en blanco.

    Original
    Reemplazo

    -

    .

    (

    )

    {SPACE}

  7. Haga clic en Add character filter.

  8. Expande Tokenizer si está colapsado y selecciona keyword en el menú desplegable.

  9. Haz clic en Add para agregar el analizador personalizado a tu índice.

  10. En la sección Field Mappings, haz clic en Add Field Mapping para aplicar el analizador personalizado en el campo page_updated_by.phone (anidado).

  11. Selecciona page_updated_by.phone (anidado) en el menú desplegable Field Name y String en el menú desplegable Data Type.

  12. En la sección de propiedades para el tipo de dato, selecciona mappingAnalyzer de los desplegables Index Analyzer y Search Analyzer.

  13. Haz clic en Add, luego en Save Changes.

Sustituye la definición de índice por defecto por la siguiente:

1{
2 "mappings": {
3 "fields": {
4 "page_updated_by": {
5 "fields": {
6 "phone": {
7 "analyzer": "mappingAnalyzer",
8 "type": "string"
9 }
10 },
11 "type": "document"
12 }
13 }
14 },
15 "analyzers": [
16 {
17 "name": "mappingAnalyzer",
18 "charFilters": [
19 {
20 "mappings": {
21 "-": "",
22 ".": "",
23 "(": "",
24 ")": "",
25 " ": ""
26 },
27 "type": "mapping"
28 }
29 ],
30 "tokenizer": {
31 "type": "keyword"
32 }
33 }
34 ]
35}
1db.minutes.createSearchIndex(
2 "default",
3 {
4 "mappings": {
5 "fields": {
6 "page_updated_by": {
7 "fields": {
8 "phone": {
9 "analyzer": "mappingAnalyzer",
10 "type": "string"
11 }
12 },
13 "type": "document"
14 }
15 }
16 },
17 "analyzers": [
18 {
19 "name": "mappingAnalyzer",
20 "charFilters": [
21 {
22 "mappings": {
23 "-": "",
24 ".": "",
25 "(": "",
26 ")": "",
27 " ": ""
28 },
29 "type": "mapping"
30 }
31 ],
32 "tokenizer": {
33 "type": "keyword"
34 }
35 }
36 ]
37 }
38)

La siguiente consulta busca en el campo page_updated_by.phone la string 1234567890.

  1. Haz clic en el botón Query para tu índice.

  2. Haz clic en Edit Query para editar la consulta.

  3. Haz clic en la barra de query y selecciona la base de datos y la colección.

  4. Reemplaza la consulta por defecto por la siguiente y haz clic en Find:

    {
    "$search": {
    "text": {
    "query": "1234567890",
    "path": "page_updated_by.phone"
    }
    }
    }
    SCORE: 0.5472603440284729 _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"
1db.minutes.aggregate([
2 {
3 "$search": {
4 "text": {
5 "query": "1234567890",
6 "path": "page_updated_by.phone"
7 }
8 }
9 },
10 {
11 "$project": {
12 "_id": 1,
13 "page_updated_by.phone": 1,
14 "page_updated_by.last_name": 1
15 }
16 }
17])
[
{
_id: 1,
page_updated_by: { last_name: 'AUERBACH', phone: '(123)-456-7890' }
}
]

Los resultados de búsqueda de MongoDB contienen un documento donde los números en la cadena phone coinciden con la string del query. MongoDB Search emparejó el documento con el string del query aunque el query no incluya los paréntesis alrededor del código de área telefónico y el guion entre los números porque MongoDB Search eliminó estos caracteres usando el filtro de caracteres mapping y creó un solo token para el valor del campo. Específicamente, MongoDB Search generó el siguiente token para el campo phone en el documento con _id: 1:

ID de documento
Tokens de salida

_id: 1

1234567890

MongoDB Search también coincidiría con el documento con _id: 1 para búsquedas de (123)-456-7890, 123-456-7890, 123.456.7890, etc., porque para los campos Cómo indexar campos de String, MongoDB Search también analiza los términos de la consulta de búsqueda mediante el analizador de índices (o si se especifica, usando el searchAnalyzer). La siguiente tabla muestra los tokens que MongoDB Search crea al eliminar las instancias del guion (-), punto (.), paréntesis abierto ((), paréntesis cerrado ( )) y los caracteres de espacio en el término de query:

query término
Tokens de salida

(123)-456-7890

1234567890

123-456-7890

1234567890

123.456.7890

1234567890

El filtro de caracteres persian reemplaza las instancias de no-unidor de ancho cero con el carácter de espacio. Este filtro de caracteres se basa en el PersianCharFilter.de Lucene

El filtro de carácter persian tiene el siguiente atributo:

Nombre
Tipo
¿Requerido?
Descripción

type

string

Etiqueta legible por humanos que identifica este tipo de filtro de caracteres. El valor debe ser persian.

El siguiente ejemplo de definición de índice indexa el campo text.fa_IR en la colección de minutos usando un analizador personalizado llamado persianCharacterIndex. El analizador personalizado especifica lo siguiente:

  • Aplica el filtro de caracteres persian para sustituir los caracteres no imprimibles en el valor del campo por el carácter de espacio.

  • Utiliza el tokenizador de espacio en blanco para crear tokens basados en las apariciones de espacios en blanco entre palabras.

  1. En la sección Custom Analyzers, haga clic en Add Custom Analyzer.

  2. Selecciona el botón de opción Create Your Own y haz clic en Next.

  3. Escriba persianCharacterIndex en el campo Analyzer Name.

  4. Expande Character Filters y haz clic en Add character filter.

  5. Seleccione persian en la lista desplegable y haga clic en Add character filter.

  6. Expande Tokenizer si está colapsado y selecciona whitespace en el menú desplegable.

  7. Haz clic en Add para agregar el analizador personalizado a tu índice.

  8. En la sección Field Mappings, haga clic en Add Field Mapping para aplicar el analizador personalizado en el text.fa_IR (anidado) campo.

  9. Seleccione text.fa_IR (anidado) del menú desplegable Field Name y string del menú desplegable Data Type.

  10. En la sección de propiedades para el tipo de dato, selecciona el persianCharacterIndex de los menús desplegables Index Analyzer y Search Analyzer.

  11. Haz clic en Add, luego en Save Changes.

Sustituye la definición de índice por defecto por la siguiente:

1{
2 "analyzer": "lucene.standard",
3 "mappings": {
4 "fields": {
5 "text": {
6 "dynamic": true,
7 "fields": {
8 "fa_IR": {
9 "analyzer": "persianCharacterIndex",
10 "type": "string"
11 }
12 },
13 "type": "document"
14 }
15 }
16 },
17 "analyzers": [
18 {
19 "name": "persianCharacterIndex",
20 "charFilters": [
21 {
22 "type": "persian"
23 }
24 ],
25 "tokenizer": {
26 "type": "whitespace"
27 }
28 }
29 ]
30}
db.minutes.createSearchIndex("default", {
"analyzer": "lucene.standard",
"mappings": {
"fields": {
"text": {
"dynamic": true,
"fields": {
"fa_IR": {
"analyzer": "persianCharacterIndex",
"type": "string"
}
},
"type": "document"
}
}
},
"analyzers": [
{
"name": "persianCharacterIndex",
"charFilters": [
{
"type": "persian"
}
],
"tokenizer": {
"type": "whitespace"
}
}
]
})

La siguiente consulta busca en el campo text.fa_IR el término صحبت.

  1. Haz clic en el botón Query para tu índice.

  2. Haz clic en Edit Query para editar la consulta.

  3. Haz clic en la barra de query y selecciona la base de datos y la colección.

  4. Reemplaza la consulta por defecto por la siguiente y haz clic en Find:

    {
    "$search": {
    "text": {
    "query": "صحبت",
    "path": "text.fa_IR"
    }
    }
    }
    SCORE: 0.13076457381248474 _id: “2
    message: "do not forget to SIGN-IN. See ① for details."
    page_updated_by: Object
    last_name: "OHRBACH"
    first_name: "Noël"
    email: "ohrbach@example.com"
    phone: "(123) 456 0987"
    text: Object
    en_US: "The head of the sales department spoke first."
    fa_IR: "ابتدا رئیس بخش فروش صحبت کرد"
    sv_FI: "Först talade chefen för försäljningsavdelningen"
1db.minutes.aggregate([
2 {
3 "$search": {
4 "text": {
5 "query": "صحبت",
6 "path": "text.fa_IR"
7 }
8 }
9 },
10 {
11 "$project": {
12 "_id": 1,
13 "text.fa_IR": 1,
14 "page_updated_by.last_name": 1
15 }
16 }
17])
[
{
_id: 2,
page_updated_by: { last_name: 'OHRBACH' },
text: { fa_IR: 'ابتدا رئیس بخش فروش صحبت کرد' }
}
]

MongoDB Search devuelve el _id: 2 documento que contiene el término de consulta. MongoDB Search coincide el término de query con el documento al reemplazar primero las instancias de separadores de no-conectores de ancho cero por el carácter de espacio y luego crear un token individual por cada palabra en el valor del campo basándose en la aparición de espacios en blanco entre las palabras. Específicamente, MongoDB Search genera los siguientes tokens para el documento con _id: 2:

ID de documento
Tokens de salida

_id: 2

ابتدا, رئیس, بخش, فروش, صحبت, کرد

Para ver definiciones de índice adicionales y consultas que utilizan el filtro de caracteres mapping, consulte los siguientes ejemplos de la página de referencia:

Volver

Personalizado

En esta página