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.
"charFilters": [ { "type": "<filter-type>", "<additional-option>": <value> } ]
Tipos de filtro de caracteres
A pesquisa do MongoDB suporta os seguintes tipos de filtro de caracteres:
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.
htmlStrip
O filtro de caracteres htmlStrip
remove as construções HTML.
Atributos
O filtro de caracteres htmlStrip
tem os seguintes atributos:
Nome | Tipo | Obrigatório? | Descrição |
---|---|---|---|
| string | sim | Etiqueta legível para humanos que identifica este tipo de filtro de caracteres. O valor deve ser |
| array de strings | sim | Lista que contém as marcações HTML a serem excluídas da filtragem. |
Exemplo
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:
Remova todas as marcações HTML do texto, exceto a marcação
a
, usando o filtro de caractereshtmlStrip
.Gere tokens com base em regras de quebra de palavras do algoritmo de segmentação de texto Unicode usando o tokenizador padrão.
Na seção Custom Analyzers, clique em Add Custom Analyzer.
Selecione o botão de opção Create Your Own e clique em Next.
Digite
htmlStrippingAnalyzer
no campo Analyzer Name.Expanda Character Filters e clique em Add character filter.
Selecione htmlStrip no menu suspenso e digite
a
no campo ignoredTags.Clique em Add character filter.
Expanda Tokenizer se estiver recolhido e selecione standard no menu suspenso.
Clique em Add para adicionar o analisador personalizado ao seu índice.
Na seção Field Mappings, clique em Add Field Mapping para aplicar o analisador customizado ao campo aninhado text.en_US.
Selecione o campo aninhado text.en_US no menu suspenso Field Name e String no menu suspenso Data Type.
Na seção de propriedades do tipo de dados, selecione
htmlStrippingAnalyzer
nos menus suspensos Index Analyzer e Search Analyzer.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 }
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 )
A query a seguir procura ocorrências da string head
no text.en_US
campo da minutes
collection .
Clique no botão Query para o seu índice.
Clique em Edit Query para editar a query.
Clique em na barra de query e selecione o banco de dados e a coleção.
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>"
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>" } } ]
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 |
---|---|
|
|
|
|
|
|
icuNormalize
O filtro de caractere icuNormalize
normaliza o texto com o UTI Normalizer. É baseado no ICUNormalizer2CharFilter da Lucene.
Atributos
O filtro de caracteres icuNormalize
tem o seguinte atributo:
Nome | Tipo | Obrigatório? | Descrição |
---|---|---|---|
| string | sim | Etiqueta legível para humanos que identifica este tipo de filtro de caracteres. O valor deve ser |
Exemplo
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 caracteresicuNormalize
.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 .
Na seção Custom Analyzers, clique em Add Custom Analyzer.
Selecione o botão de opção Create Your Own e clique em Next.
Digite
normalizingAnalyzer
no campo Analyzer Name.Expanda Character Filters e clique em Add character filter.
Selecione icuNormalize no menu suspenso e clique em Add character filter.
Expanda Tokenizer se estiver recolhido e selecione whitespace no menu suspenso.
Clique em Add para adicionar o analisador personalizado ao seu índice.
Na seção Field Mappings, clique em Add Field Mapping para aplicar o analisador personalizado no campo mensagem.
Selecione a mensagem na lista suspensa Field Name e Cadeia de caracteres na lista suspensa Data Type .
Na seção de propriedades do tipo de dados, selecione
normalizingAnalyzer
nos menus suspensos Index Analyzer e Search Analyzer .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
.
Clique no botão Query para o seu índice.
Clique em Edit Query para editar a query.
Clique em na barra de query e selecione o banco de dados e a coleção.
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."
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 №' } ]
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 |
---|---|
|
|
mapeamento
O filtro de caracteres mapping
aplica mapeamentos de normalização especificados pelo usuário a caracteres. Ele é baseado no MappingCharFilterda Lucene.
Atributos
O filtro de caracteres mapping
tem os seguintes atributos:
Nome | Tipo | Obrigatório? | Descrição |
---|---|---|---|
| string | sim | Etiqueta legível para humanos que identifica este tipo de filtro de caracteres. O valor deve ser |
| 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 |
Exemplo
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 caracteresmapping
.Tokenize toda a entrada como um único token usando a palavra- chave tokenizer.
Na seção Custom Analyzers, clique em Add Custom Analyzer.
Selecione o botão de opção Create Your Own e clique em Next.
Digite
mappingAnalyzer
no campo Analyzer Name.Expanda Character Filters e clique em Add character filter.
Selecione mapping no menu suspenso e clique em Add mapping.
Insira os seguintes caracteres no campo Original, um de cada vez e deixe o campo Replacement correspondente vazio.
OriginalSubstituição-
.
(
)
{SPACE}
Clique em Add character filter.
Expanda Tokenizer se estiver recolhido e selecione keyword no menu suspenso.
Clique em Add para adicionar o analisador personalizado ao seu índice.
Na seção Field Mappings, clique em Add Field Mapping para aplicar o analisador personalizado ao campo page_updated_by.phone (aninhado).
Selecione page_updated_by.phone (aninhado) no menu suspenso Field Name e String no menu suspenso Data Type.
Na seção de propriedades do tipo de dados, selecione
mappingAnalyzer
nos menus suspensos Index Analyzer e Search Analyzer.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 }
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 )
A query a seguir pesquisa o campo page_updated_by.phone
para a string 1234567890
.
Clique no botão Query para o seu índice.
Clique em Edit Query para editar a query.
Clique em na barra de query e selecione o banco de dados e a coleção.
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"
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' } } ]
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 |
---|---|
|
|
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 |
---|---|
|
|
|
|
|
|
Persa
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.
Atributos
O filtro de caracteres persian
tem o seguinte atributo:
Nome | Tipo | Obrigatório? | Descrição |
---|---|---|---|
| string | sim | Etiqueta legível para humanos que identifica este tipo de filtro de caracteres. O valor deve ser |
Exemplo
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.
Na seção Custom Analyzers, clique em Add Custom Analyzer.
Selecione o botão de opção Create Your Own e clique em Next.
Digite
persianCharacterIndex
no campo Analyzer Name.Expanda Character Filters e clique em Add character filter.
Selecione persian no menu suspenso e clique em Add character filter.
Expanda Tokenizer se estiver recolhido e selecione whitespace no menu suspenso.
Clique em Add para adicionar o analisador personalizado ao seu índice.
Na seção Field Mappings, clique em Add Field Mapping para aplicar o analisador customizado ao campo aninhado text.fa_IR campo (aninhado).
Selecione text.fa_IR (aninhado) no menu suspenso Field Name e String no menu suspenso Data Type.
Na seção de propriedades do tipo de dados, selecione
persianCharacterIndex
nos menus suspensos Index Analyzer e Search Analyzer .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 صحبت
.
Clique no botão Query para o seu índice.
Clique em Edit Query para editar a query.
Clique em na barra de query e selecione o banco de dados e a coleção.
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"
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: 'ابتدا رئیس بخش فروش صحبت کرد' } } ]
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 |
---|---|
|
|
Saiba mais
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:
Filtro de token telha
regexCaptureGroup tokenizador