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.
"charFilters": [ { "type": "<filter-type>", "<additional-option>": <value> } ]
Tipos de filtro de caracteres
MongoDB Search admite los siguientes tipos de filtro de caracteres:
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.
htmlStrip
El filtro de caracteres htmlStrip elimina los constructos HTML.
Atributos
El filtro de caracteres htmlStrip tiene los siguientes atributos:
Nombre | Tipo | ¿Requerido? | Descripción |
|---|---|---|---|
| string | Sí | Etiqueta legible por humanos que identifica este tipo de filtro de caracteres. El valor debe ser |
| Arreglo de cadenas | Sí | Lista que contiene las etiquetas HTML que se excluirán del filtro. |
Ejemplo
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:
Elimina todas las etiquetas HTML del texto excepto la etiqueta
autilizando el filtro de caractereshtmlStrip.Genere tokens basados en las reglas de separación de palabras del algoritmo de segmentación de texto Unicode. accionando el tokenizador estándar.
En la sección Custom Analyzers, haga clic en Add Custom Analyzer.
Selecciona el botón de opción Create Your Own y haz clic en Next.
Escriba
htmlStrippingAnalyzeren el campo Analyzer Name.Expande Character Filters y haz clic en Add character filter.
Selecciona htmlStrip del menú desplegable y escribe
aen el campo ignoredTags.Haga clic en Add character filter.
Expande Tokenizer si está colapsado y selecciona standard en el menú desplegable.
Haz clic en Add para agregar el analizador personalizado a tu índice.
En la sección Field Mappings, haz clic en Add Field Mapping para aplicar el analizador personalizado en text.en_US. campo anidado.
Seleccione text.en_US anidado del menú desplegable Field Name y String del menú desplegable Data Type.
En la sección de propiedades para el tipo de dato, selecciona
htmlStrippingAnalyzerde los desplegables Index Analyzer y Search Analyzer.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 }
1 db.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.
Haz clic en el botón Query para tu índice.
Haz clic en Edit Query para editar la consulta.
Haz clic en la barra de query y selecciona la base de datos y la colección.
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>"
1 db.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 |
|---|---|
|
|
|
|
|
|
icuNormalize
El icuNormalize filtro de caracteres normaliza el texto con el normalizador de ICU. Está basado en el ICUNormalizer2CharFilterde Lucene.
Atributos
El filtro de carácter icuNormalize tiene el siguiente atributo:
Nombre | Tipo | ¿Requerido? | Descripción |
|---|---|---|---|
| string | Sí | Etiqueta legible por humanos que identifica este tipo de filtro de caracteres. El valor debe ser |
Ejemplo
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
messagecon el filtro de caracteresicuNormalize.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.
En la sección Custom Analyzers, haga clic en Add Custom Analyzer.
Selecciona el botón de opción Create Your Own y haz clic en Next.
Escriba
normalizingAnalyzeren el campo Analyzer Name.Expande Character Filters y haz clic en Add character filter.
Seleccione icuNormalize en la lista desplegable y haga clic en Add character filter.
Expande Tokenizer si está colapsado y selecciona whitespace en el menú desplegable.
Haz clic en Add para agregar el analizador personalizado a tu índice.
En la sección Field Mappings, haga clic en Add Field Mapping para aplicar el analizador personalizado en el campo mensaje.
Selecciona mensaje del desplegable Field Name y String del desplegable Data Type .
En la sección de propiedades para el tipo de dato, selecciona el
normalizingAnalyzerde los menús desplegables Index Analyzer y Search Analyzer.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.
Haz clic en el botón Query para tu índice.
Haz clic en Edit Query para editar la consulta.
Haz clic en la barra de query y selecciona la base de datos y la colección.
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."
1 db.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 |
|---|---|
|
|
mapeo
El filtro de caracteres mapping aplica mapeos de normalización especificados por el usuario a los caracteres. Se basa en el MappingCharFilter de Lucene.
Atributos
El filtro de caracteres mapping tiene los siguientes atributos:
Nombre | Tipo | ¿Requerido? | Descripción |
|---|---|---|---|
| string | Sí | Etiqueta legible por humanos que identifica este tipo de filtro de caracteres. El valor debe ser |
| Objeto | Sí | 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 |
Ejemplo
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 caracteresmapping.Tokeniza toda la entrada como un solo token utilizando el tokenizador de palabras clave.
En la sección Custom Analyzers, haga clic en Add Custom Analyzer.
Selecciona el botón de opción Create Your Own y haz clic en Next.
Escriba
mappingAnalyzeren el campo Analyzer Name.Expande Character Filters y haz clic en Add character filter.
Seleccione mapping del menú desplegable y haga clic en Add mapping.
Ingrese los siguientes caracteres en el campo Original, uno a la vez, y deje el campo Replacement correspondiente en blanco.
OriginalReemplazo-.(){SPACE}
Haga clic en Add character filter.
Expande Tokenizer si está colapsado y selecciona keyword en el menú desplegable.
Haz clic en Add para agregar el analizador personalizado a tu índice.
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).
Selecciona page_updated_by.phone (anidado) en el menú desplegable Field Name y String en el menú desplegable Data Type.
En la sección de propiedades para el tipo de dato, selecciona
mappingAnalyzerde los desplegables Index Analyzer y Search Analyzer.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 }
1 db.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.
Haz clic en el botón Query para tu índice.
Haz clic en Edit Query para editar la consulta.
Haz clic en la barra de query y selecciona la base de datos y la colección.
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"
1 db.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 |
|---|---|
|
|
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 |
|---|---|
|
|
|
|
|
|
persa
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
Atributos
El filtro de carácter persian tiene el siguiente atributo:
Nombre | Tipo | ¿Requerido? | Descripción |
|---|---|---|---|
| string | Sí | Etiqueta legible por humanos que identifica este tipo de filtro de caracteres. El valor debe ser |
Ejemplo
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
persianpara 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.
En la sección Custom Analyzers, haga clic en Add Custom Analyzer.
Selecciona el botón de opción Create Your Own y haz clic en Next.
Escriba
persianCharacterIndexen el campo Analyzer Name.Expande Character Filters y haz clic en Add character filter.
Seleccione persian en la lista desplegable y haga clic en Add character filter.
Expande Tokenizer si está colapsado y selecciona whitespace en el menú desplegable.
Haz clic en Add para agregar el analizador personalizado a tu índice.
En la sección Field Mappings, haga clic en Add Field Mapping para aplicar el analizador personalizado en el text.fa_IR (anidado) campo.
Seleccione text.fa_IR (anidado) del menú desplegable Field Name y string del menú desplegable Data Type.
En la sección de propiedades para el tipo de dato, selecciona el
persianCharacterIndexde los menús desplegables Index Analyzer y Search Analyzer.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 صحبت.
Haz clic en el botón Query para tu índice.
Haz clic en Edit Query para editar la consulta.
Haz clic en la barra de query y selecciona la base de datos y la colección.
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"
1 db.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 |
|---|---|
|
|
Obtén más información
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:
shingle Filtro de tokens
tokenizador regexCaptureGroup