Menu Docs
Página inicial do Docs
/
Atlas
/ / / / /

Filtros de caracteres

Os filtros de caracteres examinam o texto de um caractere de cada vez e executam operações de filtragem. Os filtros de caracteres exigem um campo de tipo, e alguns também aceitam opções adicionais.

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

A pesquisa do MongoDB suporta os seguintes tipos de filtro de caracteres:

  • htmlStrip

  • icuNormalize

  • mapeamento

  • Persa

Os exemplos de definições e consultas de índice a seguir usam a coleção de amostras chamada minutes. Para acompanhar esses exemplos, carregue a coleção minutes no cluster e navegue até a página Create a Search Index na interface do usuário do Atlas seguindo as etapas do tutorial Criar um índice de pesquisa do MongoDB. Em seguida, selecione a minutes collection como sua fonte de dados e siga o procedimento de exemplo para criar um índice a partir da UI do Atlas ou mongosh usando.


➤ Use o menu suspenso Selecione seu idioma para definir o método para executar os exemplos nesta página.


O filtro de caracteres htmlStrip remove as construções HTML.

O filtro de caracteres htmlStrip tem os seguintes atributos:

Nome
Tipo
Obrigatório?
Descrição

type

string

sim

Etiqueta legível para humanos que identifica este tipo de filtro de caracteres. O valor deve ser htmlStrip.

ignoredTags

array de strings

sim

Lista que contém as marcações HTML a serem excluídas da filtragem.

O exemplo de definição de índice a seguir indexa o campo text.en_US na collection de minutos usando um analisador personalizado chamado htmlStrippingAnalyzer. O analisador personalizado especifica o seguinte:

  1. Na seção Custom Analyzers, clique em Add Custom Analyzer.

  2. Selecione o botão de opção Create Your Own e clique em Next.

  3. Digite htmlStrippingAnalyzer no campo Analyzer Name.

  4. Expanda Character Filters e clique em Add character filter.

  5. Selecione htmlStrip no menu suspenso e digite a no campo ignoredTags.

  6. Clique em Add character filter.

  7. Expanda Tokenizer se estiver recolhido e selecione standard no menu suspenso.

  8. Clique em Add para adicionar o analisador personalizado ao seu índice.

  9. Na seção Field Mappings, clique em Add Field Mapping para aplicar o analisador customizado ao campo aninhado text.en_US.

  10. Selecione o campo aninhado text.en_US no menu suspenso Field Name e String no menu suspenso Data Type.

  11. Na seção de propriedades do tipo de dados, selecione htmlStrippingAnalyzer nos menus suspensos Index Analyzer e Search Analyzer.

  12. Clique em Add e depois em Save Changes.

Substitua a definição de índice padrão pelo seguinte:

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)

A query a seguir procura ocorrências da string head no text.en_US campo da minutes collection .

  1. Clique no botão Query para o seu índice.

  2. Clique em Edit Query para editar a query.

  3. Clique em na barra de query e selecione o banco de dados e a coleção.

  4. Substitua a query padrão pelo seguinte e clique em 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>"
}
}
]

O MongoDB Search não retorna o documento com _id: 1 porque a string head faz parte da marcação HTML <head>. O documento com _id: 3 contém tags HTML, mas a string head está em outro lugar, então o documento é uma correspondência. A tabela a seguir mostra os tokens que o MongoDB Search gera para os valores de campo text.en_US nos documentos _id: 1, _id: 2 e _id: 3 na coleção de minutos usando o htmlStrippingAnalyzer.

ID do documento
Tokens de saída

_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

O filtro de caractere icuNormalize normaliza o texto com o UTI Normalizer. É baseado no ICUNormalizer2CharFilter da Lucene.

O filtro de caracteres icuNormalize tem o seguinte atributo:

Nome
Tipo
Obrigatório?
Descrição

type

string

sim

Etiqueta legível para humanos que identifica este tipo de filtro de caracteres. O valor deve ser icuNormalize.

O exemplo de definição de índice a seguir indexa o campo message na collection de minutos usando um analisador personalizado chamado normalizingAnalyzer. O analisador personalizado especifica o seguinte:

  • Normalize o texto no valor do campo message utilizando o filtro de caracteres icuNormalize .

  • Tokenize as palavras no campo com base em ocorrências de espaços em branco entre as palavras usando o tokenizador de espaço em branco .

  1. Na seção Custom Analyzers, clique em Add Custom Analyzer.

  2. Selecione o botão de opção Create Your Own e clique em Next.

  3. Digite normalizingAnalyzer no campo Analyzer Name.

  4. Expanda Character Filters e clique em Add character filter.

  5. Selecione icuNormalize no menu suspenso e clique em Add character filter.

  6. Expanda Tokenizer se estiver recolhido e selecione whitespace no menu suspenso.

  7. Clique em Add para adicionar o analisador personalizado ao seu índice.

  8. Na seção Field Mappings, clique em Add Field Mapping para aplicar o analisador personalizado no campo mensagem.

  9. Selecione a mensagem na lista suspensa Field Name e Cadeia de caracteres na lista suspensa Data Type .

  10. Na seção de propriedades do tipo de dados, selecione normalizingAnalyzer nos menus suspensos Index Analyzer e Search Analyzer .

  11. Clique em Add e depois em Save Changes.

Substitua a definição de índice padrão pelo seguinte:

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": []
}
]
})

A seguinte query pesquisar ocorrências da string no (para número) no campo message da collection minutes .

  1. Clique no botão Query para o seu índice.

  2. Clique em Edit Query para editar a query.

  3. Clique em na barra de query e selecione o banco de dados e a coleção.

  4. Substitua a query padrão pelo seguinte e clique em 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 №'
}
]

O MongoDB Search combinou o documento com _id: 4 ao termo de query no porque normalizou o símbolo de número no campo usando o filtro de caracteres icuNormalize e criou o token no para essa abreviação tipográfica da palavra "número ". O MongoDB Search gera os seguintes tokens para o valor de campo message no documento _id: 4 usando normalizingAnalyzer:

ID do documento
Tokens de saída

_id: 4

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

O filtro de caracteres mapping aplica mapeamentos de normalização especificados pelo usuário a caracteres. Ele é baseado no MappingCharFilterda Lucene.

O filtro de caracteres mapping tem os seguintes atributos:

Nome
Tipo
Obrigatório?
Descrição

type

string

sim

Etiqueta legível para humanos que identifica este tipo de filtro de caracteres.

O valor deve ser mapping.

mappings

objeto

sim

objeto que contém uma lista de mapeamentos separados por vírgula. Um mapeamento indica que um caractere ou grupo de caracteres deve ser substituído por outro, no formato <original> : <replacement>.

O exemplo de definição de índice a seguir indexa o campo page_updated_by.phone na collection de minutos usando um analisador personalizado chamado mappingAnalyzer. O analisador personalizado especifica o seguinte:

  • Remova instâncias de caracteres de hífen (-), ponto (.), abrir parênteses ((), fechar parênteses ( )) e espaços no campo de telefone usando o filtro de caracteres mapping .

  • Tokenize toda a entrada como um único token usando a palavra- chave tokenizer.

  1. Na seção Custom Analyzers, clique em Add Custom Analyzer.

  2. Selecione o botão de opção Create Your Own e clique em Next.

  3. Digite mappingAnalyzer no campo Analyzer Name.

  4. Expanda Character Filters e clique em Add character filter.

  5. Selecione mapping no menu suspenso e clique em Add mapping.

  6. Insira os seguintes caracteres no campo Original, um de cada vez e deixe o campo Replacement correspondente vazio.

    Original
    Substituição

    -

    .

    (

    )

    {SPACE}

  7. Clique em Add character filter.

  8. Expanda Tokenizer se estiver recolhido e selecione keyword no menu suspenso.

  9. Clique em Add para adicionar o analisador personalizado ao seu índice.

  10. Na seção Field Mappings, clique em Add Field Mapping para aplicar o analisador personalizado ao campo page_updated_by.phone (aninhado).

  11. Selecione page_updated_by.phone (aninhado) no menu suspenso Field Name e String no menu suspenso Data Type.

  12. Na seção de propriedades do tipo de dados, selecione mappingAnalyzer nos menus suspensos Index Analyzer e Search Analyzer.

  13. Clique em Add e depois em Save Changes.

Substitua a definição de índice padrão pelo seguinte:

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)

A query a seguir pesquisa o campo page_updated_by.phone para a string 1234567890.

  1. Clique no botão Query para o seu índice.

  2. Clique em Edit Query para editar a query.

  3. Clique em na barra de query e selecione o banco de dados e a coleção.

  4. Substitua a query padrão pelo seguinte e clique em 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' }
}
]

Os resultados da Pesquisa MongoDB contêm um documento onde os números na string phone correspondem à string de query. O MongoDB Search fez a correspondência do documento com a string de query, embora a query não inclua os parênteses ao redor do código de área do telefone e o hífen entre os números, pois o MongoDB Search removeu esses caracteres usando o filtro de caracteres mapping e criou um único token para o valor do campo . Especificamente, o MongoDB Search gerou o seguinte token para o campo phone no documento com _id: 1:

ID do documento
Tokens de saída

_id: 1

1234567890

O MongoDB Search também corresponderia documento com _id: 1 para pesquisas para (123)-456-7890, 123-456-7890, 123.456.7890 e assim por diante porque, para os campos de Como indexar campos de strings, o MongoDB Search também analisa termos de query de pesquisa usando o analisador de índice (ou se especificado, usando o searchAnalyzer). A tabela a seguir mostra os tokens que o MongoDB Search cria removendo instâncias de hífen (-), ponto (.), abertura de parêntese ((), fechamento de parêntese ( )) e caracteres de espaço na query termo:

Termo de query
Tokens de saída

(123)-456-7890

1234567890

123-456-7890

1234567890

123.456.7890

1234567890

O filtro de caracteres persian substitui as instâncias de não ligadores de largura zero pelo caractere de espaço. Este filtro de caracteres é baseado no PersianCharFilterda Lucene.

O filtro de caracteres persian tem o seguinte atributo:

Nome
Tipo
Obrigatório?
Descrição

type

string

sim

Etiqueta legível para humanos que identifica este tipo de filtro de caracteres. O valor deve ser persian.

O exemplo de definição de índice a seguir indexa o campo text.fa_IR na collection de minutos usando um analisador personalizado chamado persianCharacterIndex. O analisador personalizado especifica o seguinte:

  • Aplique o filtro de caracteres persian para substituir caracteres não imprimíveis no valor do campo pelo caractere de espaço.

  • Use o tokenizador de espaço em branco para criar tokens com base em ocorrências de espaço em branco entre as palavras.

  1. Na seção Custom Analyzers, clique em Add Custom Analyzer.

  2. Selecione o botão de opção Create Your Own e clique em Next.

  3. Digite persianCharacterIndex no campo Analyzer Name.

  4. Expanda Character Filters e clique em Add character filter.

  5. Selecione persian no menu suspenso e clique em Add character filter.

  6. Expanda Tokenizer se estiver recolhido e selecione whitespace no menu suspenso.

  7. Clique em Add para adicionar o analisador personalizado ao seu índice.

  8. Na seção Field Mappings, clique em Add Field Mapping para aplicar o analisador customizado ao campo aninhado text.fa_IR campo (aninhado).

  9. Selecione text.fa_IR (aninhado) no menu suspenso Field Name e String no menu suspenso Data Type.

  10. Na seção de propriedades do tipo de dados, selecione persianCharacterIndex nos menus suspensos Index Analyzer e Search Analyzer .

  11. Clique em Add e depois em Save Changes.

Substitua a definição de índice padrão pelo seguinte:

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"
}
}
]
})

A query a seguir pesquisa o campo text.fa_IR para o termo صحبت.

  1. Clique no botão Query para o seu índice.

  2. Clique em Edit Query para editar a query.

  3. Clique em na barra de query e selecione o banco de dados e a coleção.

  4. Substitua a query padrão pelo seguinte e clique em 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: 'ابتدا رئیس بخش فروش صحبت کرد' }
}
]

A pesquisa do MongoDB retorna o documento _id: 2 que contém o termo de query . O MongoDB Search corresponde o termo da query ao documento primeiro substituindo instâncias de não-joiners de largura zero pelo caractere de espaço e, em seguida, criando tokens individuais para cada palavra no valor do campo com base em ocorrências de espaços em branco entre as palavras. Especificamente, o MongoDB Search gera os seguintes tokens para documento com _id: 2:

ID do documento
Tokens de saída

_id: 2

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

Para ver definições adicionais de índice e queries que usam o filtro de caracteres mapping, consulte os seguintes exemplos de páginas de referência:

Voltar

Personalizado

Nesta página