Docs Menu
Docs Home
/ /

Filtros de personajes

Los filtros de caracteres examinan el texto carácter por carácter y realizan operaciones de filtrado. 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 filtros de caracteres:

  • tira html

  • icuNormalizar

  • cartografía

  • Persa

Las siguientes definiciones de índice y consultas de muestra utilizan el colección de muestras denominada minutesPara seguir estos ejemplos, cargue la colección minutes en su clúster y navegue hasta la Create a Search Index Página en la interfaz de usuario de Atlas siguiendo los pasos del tutorial "Crear un índice de búsqueda de MongoDB". A continuación, seleccione la minutes colección como origen de datos y siga el procedimiento de ejemplo para crear un índice desde la interfaz de usuario de Atlas o mongosh usando.


➤ Utilice el menú desplegable Seleccione su idioma para configurar el método para ejecutar los ejemplos en esta página.


El filtro de caracteres htmlStrip elimina las construcciones HTML.

El filtro de caracteres htmlStrip tiene los siguientes atributos:

Nombre
Tipo
¿Obligatorio?
Descripción

type

string

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

ignoredTags

matriz de cadenas

Lista que contiene las etiquetas HTML a excluir del filtrado.

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

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

  2. Seleccione el botón de opción Create Your Own y haga clic en Next.

  3. Escriba htmlStrippingAnalyzer en el campo Analyzer Name.

  4. Expanda Character Filters y haga clic Add character filter en.

  5. Seleccione htmlStrip del menú desplegable y escriba a en el campo ignoredTags.

  6. Haga clic en Add character filter.

  7. Expande Tokenizer si está contraído y selecciona standard del menú desplegable.

  8. Haga clic en Add para agregar el analizador personalizado a su índice.

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

  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 del tipo de datos, seleccione htmlStrippingAnalyzer de los menús desplegables Index Analyzer y Search Analyzer.

  12. Haga clic en Add y luego en Save Changes.

Reemplace la definición de índice predeterminada con lo 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. Haga clic en el botón Query para su índice.

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

  3. Haga clic en la barra de consulta y seleccione la base de datos y la colección.

  4. Reemplace la consulta predeterminada por la siguiente y haga 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 forma parte de la etiqueta <head> HTML. El documento con _id: 3 contiene etiquetas HTML, pero la cadena head se encuentra en otro lugar, por lo que el documento coincide. La siguiente tabla muestra los tokens que MongoDB Search genera para los text.en_US valores del campo en los _id: 1 documentos, _id: 2 y _id: 3 de la colección de minutos htmlStrippingAnalyzer mediante.

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
¿Obligatorio?
Descripción

type

string

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

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

  • Normalice el texto en el valor del campo message utilizando el filtro de caracteres icuNormalize.

  • Tokenice las palabras en el campo en función de las ocurrencias de espacios en blanco entre palabras utilizando el tokenizador de espacios en blanco.

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

  2. Seleccione el botón de opción Create Your Own y haga clic en Next.

  3. Escriba normalizingAnalyzer en el campo Analyzer Name.

  4. Expanda Character Filters y haga clic Add character filter en.

  5. Seleccione icuNormalize del menú desplegable y haga clic en Add character filter.

  6. Expande Tokenizer si está contraído y selecciona whitespace del menú desplegable.

  7. Haga clic en Add para agregar el analizador personalizado a su índice.

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

  9. Seleccione mensaje en el Field Name menú desplegable y Cadena en el Data Type menú desplegable.

  10. En la sección de propiedades del tipo de datos, seleccione normalizingAnalyzer de los menús desplegables Index Analyzer y Search Analyzer.

  11. Haga clic en Add y luego en Save Changes.

Reemplace la definición de índice predeterminada con lo 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 consulta busca ocurrencias de la cadena no (para número) en el campo message de la colección minutes.

  1. Haga clic en el botón Query para su índice.

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

  3. Haga clic en la barra de consulta y seleccione la base de datos y la colección.

  4. Reemplace la consulta predeterminada por la siguiente y haga 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 encontró la correspondencia entre el documento _id: 4 y el término de consulta no porque normalizó el símbolo de número en el campo mediante el filtro de caracteres icuNormalize y creó 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 en el documento _id: 4 mediante normalizingAnalyzer:

ID de documento
Tokens de salida

_id: 4

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

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

El filtro de caracteres mapping tiene los siguientes atributos:

Nombre
Tipo
¿Obligatorio?
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 de asignaciones separadas por comas. Una asignación indica que un carácter o grupo de caracteres debe sustituirse por otro, en el formato <original> : <replacement>.

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

  • Elimine las instancias de guion (-), punto (.), paréntesis de apertura ((), paréntesis de cierre ( )) y espacios en el campo de teléfono utilizando el filtro de caracteres mapping.

  • Tokenice toda la entrada como un solo token utilizando la palabra clave tokenizer.

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

  2. Seleccione el botón de opción Create Your Own y haga clic en Next.

  3. Escriba mappingAnalyzer en el campo Analyzer Name.

  4. Expanda Character Filters y haga clic Add character filter en.

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

  6. Introduzca los siguientes caracteres en el campo Original, uno a la vez, y deje el campo Replacement correspondiente vacío.

    Original
    Sustitución

    -

    .

    (

    )

    {ESPACIO}

  7. Haga clic en Add character filter.

  8. Expande Tokenizer si está contraído y selecciona keyword del menú desplegable.

  9. Haga clic en Add para agregar el analizador personalizado a su índice.

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

  11. Seleccione page_updated_by.phone (anidado)del Field Name menú desplegable y String del Data Type menú desplegable.

  12. En la sección de propiedades del tipo de datos, seleccione mappingAnalyzer de los menús desplegables Index Analyzer y Search Analyzer.

  13. Haga clic en Add y luego en Save Changes.

Reemplace la definición de índice predeterminada con lo 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 cadena 1234567890.

  1. Haga clic en el botón Query para su índice.

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

  3. Haga clic en la barra de consulta y seleccione la base de datos y la colección.

  4. Reemplace la consulta predeterminada por la siguiente y haga 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 MongoDB Search contienen un documento donde los números de la cadena phone coinciden con la cadena de consulta. MongoDB Search encontró la coincidencia entre el documento y la cadena de consulta, aunque esta no incluye los paréntesis que encierran el código de área telefónico ni el guion entre los números, ya que MongoDB Search eliminó estos caracteres mediante el filtro de caracteres mapping y creó un único token para el valor del campo. En concreto, 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 _id: 1 en las búsquedas (123)-456-7890 123-456-7890de,,, 123.456.7890 etc., ya que, para los campos "Cómo indexar campos de cadena", MongoDB Search también analiza los términos de consulta mediante el analizador de índices (o, si se especifica, searchAnalyzer mediante). La siguiente tabla muestra los tokens que MongoDB Search crea al eliminar las instancias de- guion (),. punto( (), paréntesis de) apertura (), paréntesis de cierre () y espacios en el término de consulta:

query término
Tokens de salida

(123)-456-7890

1234567890

123-456-7890

1234567890

123.456.7890

1234567890

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

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

Nombre
Tipo
¿Obligatorio?
Descripción

type

string

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

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

  • Aplique el filtro de carácter persian para reemplazar los caracteres no imprimibles en el valor del campo con el carácter de espacio.

  • Utilice el tokenizador de espacios en blanco para crear tokens basados ​​en las ocurrencias de espacios en blanco entre palabras.

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

  2. Seleccione el botón de opción Create Your Own y haga clic en Next.

  3. Escriba persianCharacterIndex en el campo Analyzer Name.

  4. Expanda Character Filters y haga clic Add character filter en.

  5. Seleccione persian del menú desplegable y haga clic en Add character filter.

  6. Expande Tokenizer si está contraído y selecciona whitespace del menú desplegable.

  7. Haga clic en Add para agregar el analizador personalizado a su índice.

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

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

  10. En la sección de propiedades del tipo de datos, seleccione persianCharacterIndex de los menús desplegables Index Analyzer y Search Analyzer.

  11. Haga clic en Add y luego en Save Changes.

Reemplace la definición de índice predeterminada con lo 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. Haga clic en el botón Query para su índice.

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

  3. Haga clic en la barra de consulta y seleccione la base de datos y la colección.

  4. Reemplace la consulta predeterminada por la siguiente y haga 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 documento _id: 2 que contiene el término de consulta. MongoDB Search relaciona el término de consulta con el documento reemplazando primero las instancias de non-joiners de ancho cero con el carácter de espacio y luego creando tokens individuales para cada palabra en el valor del campo según las instancias de espacios entre 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 índices y consultas adicionales que utilizan el filtro de caracteres mapping, consulte los siguientes ejemplos de páginas de referencia:

Volver

Personalizado

En esta página