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

Como definir um analisador personalizado e executar uma consulta insensível a diacríticos no Atlas Search

Nesta página

  • Crie o Índice Atlas Search
  • Pesquisar a collection

Este tutorial descreve como criar um índice que usa umanalisador personalizado e executa uma query insensível a diacriticamente na coleção sample_mflix.movies . Ele conduz você pelas seguintes etapas:

  1. Configure um índice de pesquisa do Atlas Search nos campo title e genres na collection sample_mflix.movies .

  2. Execute uma query query do Atlas Search title genres nos campos campo sample_mflix.movies e campo na collection usando os operadores curinga e de texto .

Antes de começar, certifique-se de que seu Atlas cluster atenda aos requisitos descritos nos Pré-requisitos.

Para criar um índice do Atlas Search, você deve ter acesso do Project Data Access Admin ou superior ao projeto.

Nesta seção, você criará um Atlas Search índice de pesquisa nos campo title e genres na collection sample_mflix.movies .

1
  1. Se ainda não tiver sido exibido, selecione a organização que contém seu projeto no menu Organizations na barra de navegação.

  2. Se ainda não estiver exibido, selecione o projeto desejado no menu Projects na barra de navegação.

  3. Se ainda não estiver exibido, clique em Clusters na barra lateral.

    A página Clusters é exibida.

2

Você pode acessar a página do Atlas Search pela barra lateral, pelo Data Explorer ou pela página de detalhes do cluster.

  1. Na barra lateral, clique em Atlas Search sob o título Services.

  2. No menu suspenso Select data source, selecione seu cluster e clique em Go to Atlas Search.

    A página Atlas Search é exibida.

  1. Clique no botão Browse Collections para o seu cluster.

  2. Expanda o banco de dados e selecione a coleção.

  3. Clique na guia Search Indexes da coleção.

    A página Atlas Search é exibida.

  1. Clique no nome do seu cluster.

  2. Clique na aba Atlas Search.

    A página Atlas Search é exibida.

3
4
5
  1. No campo Index Name, digite diacritic-insensitive-tutorial.

    Se você nomear seu índice default, não precisará especificar um parâmetro index no estágio do pipeline $search . Se você der um nome personalizado ao seu índice, deverá especificar este nome no parâmetro index.

  2. Na seção Database and Collection, localize o banco de dados sample_mflix e selecione a coleção movies.

6

Esta definição de índice para os campos genres e title especifica um analisador customizado, diacriticFolder, utilizando o seguinte:

  • tokenizador de palavra- chave que tokeniza toda a entrada como um token único.

  • Filtro de token icuFolding que aplica dobramentos de caracteres, como remoção de acentos e dobramento de maiúsculas e minúsculas.

A definição de índice especifica um tipo de string para os campos genres e title . Ele também aplica o analisador personalizado denominado diacriticFolder ao campo title .

Utilize o Visual Editor do Atlas Search ou o JSON Editor do Atlas Search na interface de usuário do Atlas para criar o índice.

  1. Clique em Next.

  2. Clique em Refine Your Index.

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

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

  5. Digite diacriticFolder no campo Analyzer Name.

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

  7. Expanda Token Filters e clique em Add token filter.

  8. Selecione icuFolding no menu suspenso e clique em Add token filter para adicionar o filtro de token ao seu analisador personalizado.

  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 no campo title na guia Customized Configuration.

  11. Selecione title no menu suspenso Field Name e String no menu suspenso Data Type .

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

  13. Clique em Add.

  14. Clique em Add Field Mapping novamente para indexar o campo genres .

  15. Selecione genres no menu suspenso Field Name e String no menu suspenso Data Type .

  16. Clique em Add e depois em Save Changes.

  1. Substitua a definição padrão pelo seguinte:

1{
2 "mappings": {
3 "fields": {
4 "genres": {
5 "type": "string"
6 },
7 "title": {
8 "analyzer": "diacriticFolder",
9 "type": "string"
10 }
11 }
12 },
13 "analyzers": [{
14 "charFilters": [],
15 "name": "diacriticFolder",
16 "tokenizer": {
17 "type": "keyword"
18 },
19 "tokenFilters": [{
20 "type": "icuFolding"
21 }]
22 }]
23}
  1. Clique em Next.

7
8

Uma janela modal é exibida para que você saiba que seu índice está construindo. Clique no botão Close.

9

O índice deve levar cerca de um minuto para ser criado. Enquanto está se formando, a coluna Status mostra Build in Progress. Quando terminar de se formar, a coluna Status mostrará Active.


➤ Use o menu suspenso Selecione a linguagem para definir a linguagem do exemplo nesta seção.


Você pode usar o operador composto para combinar dois ou mais operadores em uma única query. A query de exemplo nesta seção usa o operador composto para fazer a query dos campos title e genres na collection movies usando vários operadores.

Nesta seção, conecte-se ao Atlas cluster e execute a query de amostra na coleção sample_mflix.movies usando o operador compound .

1
  1. Se ainda não tiver sido exibido, selecione a organização que contém seu projeto no menu Organizations na barra de navegação.

  2. Se ainda não estiver exibido, selecione o projeto desejado no menu Projects na barra de navegação.

  3. Se ainda não estiver exibido, clique em Clusters na barra lateral.

    A página Clusters é exibida.

2

Você pode acessar a página do Atlas Search pela barra lateral, pelo Data Explorer ou pela página de detalhes do cluster.

  1. Na barra lateral, clique em Atlas Search sob o título Services.

  2. No menu suspenso Select data source, selecione seu cluster e clique em Go to Atlas Search.

    A página Atlas Search é exibida.

  1. Clique no botão Browse Collections para o seu cluster.

  2. Expanda o banco de dados e selecione a coleção.

  3. Clique na guia Search Indexes da coleção.

    A página Atlas Search é exibida.

  1. Clique no nome do seu cluster.

  2. Clique na aba Atlas Search.

    A página Atlas Search é exibida.

3

Clique no botão Query à direita do índice para consultar.

4

Clique em Edit Query para visualizar uma amostra de sintaxe de consulta padrão no formato JSON .

5

Esta query utiliza o estágio $search para fazer query na collection usando o operador compound . O operador compound utiliza as seguintes cláusulas:

  • must cláusula para pesquisar títulos de filmes que começam com o termo allè usando o operador curinga

  • should cláusula para especificar preferência pelo gênero Drama usando o operador de texto

Copie e cole a seguinte consulta no Query Editor e, em seguida, clique no botão Search no Query Editor.

1[
2 {
3 "$search" : {
4 "index": "diacritic-insensitive-tutorial",
5 "compound" : {
6 "must": [{
7 "wildcard" : {
8 "query" : "alle*",
9 "path": "title",
10 "allowAnalyzedField": true
11 }
12 }],
13 "should": [{
14 "text": {
15 "query" : "Drama",
16 "path" : "genres"
17 }
18 }]
19 }
20 }
21 }
22]
SCORE: 1.2084882259368896 _id: "573a13a1f29313caabd07bb6"
plot: "A group of hip retro teenage outsiders become involved in an interscho…"
genres:
0: "Drama"
1: "Family"
2: "Sport"
runtime: 103
title: "Alley Cats Strike"
SCORE: 1.179288625717163 _id: "573a13b1f29313caabd382a2"
plot: "Famous pianist Zetterstrèm returns home to his native Denmark, to give…"
genres:
0: "Drama"
1: "Romance"
2: "Sci-Fi"
runtime: 88
title: "Allegro"
SCORE: 1 _id: "573a1397f29313caabce5f15"
plot: "An enthusiastic filmmaker thinks he's come up with a totally original …"
genres:
0: "Animation"
1: "Comedy"
2: "Fantasy"
runtime: 75
title: "Allegro non troppo"
SCORE: 1 _id: "573a13d1f29313caabd8f84b"
plot: "The eleven year old cycling talent Freddy is the son of a butcher in a…"
genres:
0: "Comedy"
runtime: 100
title: "Allez, Eddy!"
6

O Search Tester pode não exibir todos os campos nos documentos que ele retorna. Para exibir todos os campos, incluindo o campo que você especifica no caminho da consulta, expanda o documento nos resultados.

A pesquisa curinga por allè retorna documentos onde o campo title começa com alle mesmo que não inclua nenhum diacrítico, porque o analisador personalizado diacriticsFolder que usamos no campo title aplicou a normalização de caracteres em seus valores. O Atlas Search retorna documentos com títulos que começam com o termo de query allè porque usamos o tokenizador de palavras-chave, que tokeniza strings inteiras (ou frases) como um único token.

Como alternativa, você pode especificar o tokenizador padrão em vez do tokenizador de palavra-chave no analisador personalizado usado no campo de título. Para o tokenizador padrão, os resultados do Atlas Search conteriam documentos com títulos que começam ou aparecem em qualquer parte do início da palavra para o termo de query allè, como "Desde allè". Para testar isso, edite sua definição de índice para substituir o tokenizador keyword na linha 17 pelo tokenizador standard, salve a definição de índice e execute a query de exemplo.

1

Abra o mongosh em uma janela do terminal e conecte ao seu cluster. Para obter instruções detalhadas sobre a conexão, consulte Conectar via mongosh.

2

Execute o seguinte comando no prompt mongosh:

use sample_mflix
3

Esta query utiliza o estágio $search para fazer query na collection usando o operador compound . O operador compound utiliza as seguintes cláusulas:

  • must cláusula para pesquisar títulos de filmes que começam com o termo allè usando o operador curinga

  • should cláusula para especificar preferência pelo gênero Drama usando o operador de texto

A query utiliza o estágio $project para:

  • Excluir todos os campos, exceto title e genres

  • Adicione um campo chamado score

1db.movies.aggregate([
2 {
3 "$search" : {
4 "index": "diacritic-insensitive-tutorial",
5 "compound" : {
6 "must": [{
7 "wildcard" : {
8 "query" : "allè*",
9 "path": "title",
10 "allowAnalyzedField": true
11 }
12 }],
13 "should": [{
14 "text": {
15 "query" : "Drama",
16 "path" : "genres"
17 }
18 }]
19 }
20 }
21 },
22 {
23 "$project" : {
24 "_id" : 0,
25 "title" : 1,
26 "genres" : 1,
27 "score" : { "$meta": "searchScore" }
28 }
29 }
30])
{
genres: [ 'Drama', 'Family', 'Sport' ],
title: 'Alley Cats Strike',
score: 1.2084882259368896
},
{
genres: [ 'Drama', 'Romance', 'Sci-Fi' ],
title: 'Allegro',
score: 1.179288625717163
},
{
genres: [ 'Animation', 'Comedy', 'Fantasy' ],
title: 'Allegro non troppo',
score: 1
},
{
genres: [ 'Comedy' ],
title: 'Allez, Eddy!',
score: 1
}

A pesquisa curinga por allè retorna documentos onde o campo title começa com alle mesmo que não inclua nenhum diacrítico, porque o analisador personalizado diacriticsFolder que usamos no campo title aplicou a normalização de caracteres em seus valores. O Atlas Search retorna documentos com títulos que começam com o termo de query allè porque usamos o tokenizador de palavras-chave, que tokeniza strings inteiras (ou frases) como um único token.

Como alternativa, você pode especificar o tokenizador padrão em vez do tokenizador de palavra-chave no analisador personalizado usado no campo de título. Para o tokenizador padrão, os resultados do Atlas Search conteriam documentos com títulos que começam ou aparecem em qualquer parte do início da palavra para o termo de query allè, como "Desde allè". Para testar isso, edite sua definição de índice para substituir o tokenizador keyword na linha 17 pelo tokenizador standard, salve a definição de índice e execute a query de exemplo.

1

Abra o MongoDB Compass e conecte-se ao cluster. Para obter instruções detalhadas sobre a conexão, consulte Conectar via Compass.

2

Na tela Database, clique no banco de dados sample_mflix e, em seguida, clique na coleção movies.

3

Essa query usa as seguintes cláusulas do operador compound para fazer query na collection:

  • must cláusula para pesquisar títulos de filmes que começam com o termo allè usando o operador curinga

  • should cláusula para especificar preferência pelo gênero Drama usando o operador de texto

A query utiliza o estágio $project para:

  • Excluir todos os campos, exceto title e genres

  • Adicione um campo chamado score

Para executar esta consulta no MongoDB Compass:

  1. Clique na aba Aggregations.

  2. Clique em Select... e, em seguida, configure cada um dos seguintes estágios do pipeline, selecionando o estágio no menu suspenso e adicionando a consulta para esse estágio. Clique em Add Stage para adicionar estágios adicionais.

estágio do pipeline
Query

$search

{
"index": "diacritic-insensitive-tutorial",
"compound": {
"must": [{
"wildcard": {
"path": "title",
"query": "allè*",
"allowAnalyzedField": true
}
}],
"should": [{
"text": {
"query": "Drama",
"path": "genres"
}
}]
}
}

$project

{
"_id": 0,
"title": 1,
"genres": 1,
"score": {
"$meta": "searchScore"
}
}

Se você habilitou o Auto Preview, o MongoDB Compass exibe os seguintes documentos ao lado da etapa de pipeline do $project:

{
genres: [ 'Drama', 'Family', 'Sport' ],
title: 'Alley Cats Strike',
score: 1.2084882259368896
},
{
genres: [ 'Drama', 'Romance', 'Sci-Fi' ],
title: 'Allegro',
score: 1.179288625717163
},
{
genres: [ 'Animation', 'Comedy', 'Fantasy' ],
title: 'Allegro non troppo',
score: 1
},
{
genres: [ 'Comedy' ],
title: 'Allez, Eddy!',
score: 1
}

A pesquisa curinga por allè retorna documentos onde o campo title começa com alle mesmo que não inclua nenhum diacrítico, porque o analisador personalizado diacriticsFolder que usamos no campo title aplicou a normalização de caracteres em seus valores. O Atlas Search retorna documentos com títulos que começam com o termo de query allè porque usamos o tokenizador de palavras-chave, que tokeniza strings inteiras (ou frases) como um único token.

Como alternativa, você pode especificar o tokenizador padrão em vez do tokenizador de palavra-chave no analisador personalizado usado no campo de título. Para o tokenizador padrão, os resultados do Atlas Search conteriam documentos com títulos que começam ou aparecem em qualquer parte do início da palavra para o termo de query allè, como "Desde allè". Para testar isso, edite sua definição de índice para substituir o tokenizador keyword na linha 17 pelo tokenizador standard, salve a definição de índice e execute a query de exemplo.

1
  1. Crie um novo diretório chamado diacritic-insensitive-example e inicialize seu projeto com o comando dotnet new.

    mkdir diacritic-insensitive-example
    cd diacritic-insensitive-example
    dotnet new console
  2. Adicione o driver .NET/C# ao seu projeto como uma dependência.

    dotnet add package MongoDB.Driver
2
  1. Substitua o conteúdo do arquivo Program.cs pelo seguinte código.

    O exemplo de código executa as seguintes tarefas:

    • Importa pacotes e dependências do mongodb .

    • Estabelece uma ligação ao seu cluster Atlas.

    • Usa as seguintes cláusulas do operador compound para consultar a coleção:

      • must cláusula para pesquisar títulos de filmes que começam com o termo allè usando o operador curinga

      • should cláusula para especificar preferência pelo gênero Drama usando o operador de texto

      A query utiliza o estágio $project para:

      • Excluir todos os campos, exceto title e genres

      • Adicione um campo chamado score

    • Itera sobre o cursor para imprimir os documentos que correspondem à consulta.

    1using MongoDB.Bson;
    2using MongoDB.Bson.Serialization.Attributes;
    3using MongoDB.Bson.Serialization.Conventions;
    4using MongoDB.Driver;
    5using MongoDB.Driver.Search;
    6
    7public class DiacriticInsensitiveExample
    8{
    9 private const string MongoConnectionString = "<connection-string>";
    10
    11 public static void Main(string[] args)
    12 {
    13 // allow automapping of the camelCase database fields to our MovieDocument
    14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
    15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
    16
    17 // connect to your Atlas cluster
    18 var mongoClient = new MongoClient(MongoConnectionString);
    19 var mflixDatabase = mongoClient.GetDatabase("sample_mflix");
    20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies");
    21
    22 // define and run pipeline
    23 var results = moviesCollection.Aggregate()
    24 .Search(Builders<MovieDocument>.Search.Compound()
    25 .Must(Builders<MovieDocument>.Search.Wildcard(movie => movie.Title, "allè*", true))
    26 .Should(Builders<MovieDocument>.Search.Text(movie => movie.Genres, "Drama")),
    27 indexName: "diacritic-insensitive-tutorial")
    28 .Project<MovieDocument>(Builders<MovieDocument>.Projection
    29 .Include(movie => movie.Title)
    30 .Include(movie => movie.Genres)
    31 .Exclude(movie => movie.Id)
    32 .MetaSearchScore(movie => movie.Score))
    33 .ToList();
    34
    35 // print results
    36 foreach (var movie in results)
    37 {
    38 Console.WriteLine(movie.ToJson());
    39 }
    40 }
    41}
    42
    43[BsonIgnoreExtraElements]
    44public class MovieDocument
    45{
    46 [BsonIgnoreIfDefault]
    47 public ObjectId Id { get; set; }
    48 public string [] Genres { get; set; }
    49 public string Title { get; set; }
    50 public double Score { get; set; }
    51}
  2. Antes de executar o exemplo, substitua <connection-string> por sua cadeia de conexão do Atlas. Certifique-se de que sua cadeia de conexão inclui as credenciais do usuário do banco de dados. Para saber mais, consulte Conectar via Drivers.

3
dotnet run diacritic-insensitive-example.csproj
{ "genres" : ["Drama", "Family", "Sport"], "title" : "Alley Cats Strike", "score" : 1.2084882259368896 }
{ "genres" : ["Drama", "Romance", "Sci-Fi"], "title" : "Allegro", "score" : 1.1792886257171631 }
{ "genres" : ["Animation", "Comedy", "Fantasy"], "title" : "Allegro non troppo", "score" : 1.0 }
{ "genres" : ["Comedy"], "title" : "Allez, Eddy!", "score" : 1.0 }

A pesquisa curinga por allè retorna documentos onde o campo title começa com alle mesmo que não inclua nenhum diacrítico, porque o analisador personalizado diacriticsFolder que usamos no campo title aplicou a normalização de caracteres em seus valores. O Atlas Search retorna documentos com títulos que começam com o termo de query allè porque usamos o tokenizador de palavras-chave, que tokeniza strings inteiras (ou frases) como um único token.

Como alternativa, você pode especificar o tokenizador padrão em vez do tokenizador de palavra-chave no analisador personalizado usado no campo de título. Para o tokenizador padrão, os resultados do Atlas Search conteriam documentos com títulos que começam ou aparecem em qualquer parte do início da palavra para o termo de query allè, como "Desde allè". Para testar isso, edite sua definição de índice para substituir o tokenizador keyword na linha 17 pelo tokenizador standard, salve a definição de índice e execute a query de exemplo.

1
  1. Crie um arquivo denominado diacritic-insensitive.go.

  2. Copie e cole o seguinte código no arquivo diacritic-insensitive.go.

    O exemplo de código executa as seguintes tarefas:

    • Importa pacotes e dependências do mongodb .

    • Estabelece uma ligação ao seu cluster Atlas.

    • Usa as seguintes cláusulas do operador compound para consultar a coleção:

      • must cláusula para pesquisar títulos de filmes que começam com o termo allè usando o operador curinga

      • should cláusula para especificar preferência pelo gênero Drama usando o operador de texto

      A query utiliza o estágio $project para:

      • Excluir todos os campos, exceto title e genres

      • Adicione um campo chamado score

    • Itera sobre o cursor para imprimir os documentos que correspondem à consulta.

    1package main
    2
    3import (
    4 "context"
    5 "fmt"
    6
    7 "go.mongodb.org/mongo-driver/bson"
    8 "go.mongodb.org/mongo-driver/mongo"
    9 "go.mongodb.org/mongo-driver/mongo/options"
    10)
    11
    12func main() {
    13 // connect to your Atlas cluster
    14 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("<connection-string>"))
    15 if err != nil {
    16 panic(err)
    17 }
    18 defer client.Disconnect(context.TODO())
    19
    20 // set namespace
    21 collection := client.Database("sample_mflix").Collection("movies")
    22
    23 // define pipeline stages
    24 searchStage := bson.D{{"$search", bson.M{
    25 "index": "diacritic-insensitive-tutorial",
    26 "compound": bson.M{
    27 "must": bson.M{
    28 "wildcard": bson.M{
    29 "path": "title",
    30 "query": "allè*",
    31 "allowAnalyzedField": true,
    32 },
    33 },
    34 "should": bson.D{
    35 {"text", bson.M{
    36 "path": "genres",
    37 "query": "Drama"}}},
    38 },
    39 }}}
    40 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"genres", 1}, {"_id", 0}, {"score", bson.D{{"$meta", "searchScore"}}}}}}
    41
    42 // run pipeline
    43 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, projectStage})
    44 if err != nil {
    45 panic(err)
    46 }
    47
    48 // print results
    49 var results []bson.D
    50 if err = cursor.All(context.TODO(), &results); err != nil {
    51 panic(err)
    52 }
    53 for _, result := range results {
    54 fmt.Println(result)
    55 }
    56}
  3. Antes de executar o exemplo, substitua <connection-string> por sua cadeia de conexão do Atlas. Certifique-se de que sua cadeia de conexão inclui as credenciais do usuário do banco de dados. Para saber mais, consulte Conectar via Drivers.

  4. Execute o seguinte comando para consultar sua collection:

    go run diacritic-insensitive.go
    [{genres [Drama Family Sport]} {title Alley Cats Strike} {score 1.2084882259368896}]
    [{genres [Drama Romance Sci-Fi]} {title Allegro} {score 1.179288625717163}]
    [{genres [Animation Comedy Fantasy]} {title Allegro non troppo} {score 1}]
    [{genres [Comedy]} {title Allez, Eddy!} {score 1}]

A pesquisa curinga por allè retorna documentos onde o campo title começa com alle mesmo que não inclua nenhum diacrítico, porque o analisador personalizado diacriticsFolder que usamos no campo title aplicou a normalização de caracteres em seus valores. O Atlas Search retorna documentos com títulos que começam com o termo de query allè porque usamos o tokenizador de palavras-chave, que tokeniza strings inteiras (ou frases) como um único token.

Como alternativa, você pode especificar o tokenizador padrão em vez do tokenizador de palavra-chave no analisador personalizado usado no campo de título. Para o tokenizador padrão, os resultados do Atlas Search conteriam documentos com títulos que começam ou aparecem em qualquer parte do início da palavra para o termo de query allè, como "Desde allè". Para testar isso, edite sua definição de índice para substituir o tokenizador keyword na linha 17 pelo tokenizador standard, salve a definição de índice e execute a query de exemplo.

1

junit

4.11 ou versão superior

mongodb-driver-sync

4.3.0 ou uma versão superior

slf4j-log4j12

1.7.30 ou uma versão superior

2
  1. Crie um arquivo denominado DiacriticInsensitive.java.

  2. Copie e cole o seguinte código no arquivo DiacriticInsensitive.java.

    O exemplo de código executa as seguintes tarefas:

    • Importa pacotes e dependências do mongodb .

    • Estabelece uma ligação ao seu cluster Atlas.

    • Usa as seguintes cláusulas do operador compound para consultar a coleção:

      • must cláusula para pesquisar títulos de filmes que começam com o termo allè usando o operador curinga

      • should cláusula para especificar preferência pelo gênero Drama usando o operador de texto

      A query utiliza o estágio $project para:

      • Excluir todos os campos, exceto title e genres

      • Adicione um campo chamado score

    • Itera sobre o cursor para imprimir os documentos que correspondem à consulta.

    1import static com.mongodb.client.model.Aggregates.project;
    2import static com.mongodb.client.model.Projections.*;
    3import com.mongodb.client.MongoClient;
    4import com.mongodb.client.MongoClients;
    5import com.mongodb.client.MongoCollection;
    6import com.mongodb.client.MongoDatabase;
    7import org.bson.Document;
    8import java.util.Arrays;
    9import java.util.List;
    10
    11public class tutorial {
    12 public static void main(String[] args) {
    13 // define clauses
    14 List<Document> mustClauses =
    15 List.of( new Document("wildcard",
    16 new Document("path", "title")
    17 .append("query", "allè*")
    18 .append("allowAnalyzedField", true)));
    19 List<Document> shouldClauses =
    20 List.of( new Document("text",
    21 new Document("query", "Drama")
    22 .append("path", "genres")));
    23 // define pipeline
    24 Document agg = new Document( "$search",
    25 new Document("index", "diacritic-insensitive-tutorial")
    26 .append("compound",
    27 new Document("must", mustClauses)
    28 .append("should", shouldClauses)));
    29
    30 // connect to your Atlas cluster
    31 String uri = "<connection-string>";
    32
    33 try (MongoClient mongoClient = MongoClients.create(uri)) {
    34 // set namespace
    35 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
    36 MongoCollection<Document> collection = database.getCollection("movies");
    37
    38 // run pipeline and print results
    39 collection.aggregate(Arrays.asList(agg,
    40 project(fields(
    41 excludeId(),
    42 include("title"),
    43 include("genres"),
    44 computed("score", new Document("$meta", "searchScore"))))))
    45 .forEach(doc -> System.out.println(doc.toJson()));
    46 }
    47 }
    48}

    Observação

    Para executar o código de amostra em seu ambiente Maven, adicione o seguinte código acima das declarações de importação em seu arquivo.

    package com.mongodb.drivers;
  3. Antes de executar o exemplo, substitua <connection-string> por sua cadeia de conexão do Atlas. Certifique-se de que sua cadeia de conexão inclui as credenciais do usuário do banco de dados. Para saber mais, consulte Conectar via Drivers.

  4. Compile e execute o arquivo DiacriticInsensitive.java .

    javac DiacriticInsensitive.java
    java DiacriticInsensitive
    {"genres": ["Drama", "Family", "Sport"], "title": "Alley Cats Strike", "score": 1.2084882259368896}
    {"genres": ["Drama", "Romance", "Sci-Fi"], "title": "Allegro", "score": 1.179288625717163}
    {"genres": ["Animation", "Comedy", "Fantasy"], "title": "Allegro non troppo", "score": 1.0}
    {"genres": ["Comedy"], "title": "Allez, Eddy!", "score": 1.0}

A pesquisa curinga por allè retorna documentos onde o campo title começa com alle mesmo que não inclua nenhum diacrítico, porque o analisador personalizado diacriticsFolder que usamos no campo title aplicou a normalização de caracteres em seus valores. O Atlas Search retorna documentos com títulos que começam com o termo de query allè porque usamos o tokenizador de palavras-chave, que tokeniza strings inteiras (ou frases) como um único token.

Como alternativa, você pode especificar o tokenizador padrão em vez do tokenizador de palavra-chave no analisador personalizado usado no campo de título. Para o tokenizador padrão, os resultados do Atlas Search conteriam documentos com títulos que começam ou aparecem em qualquer parte do início da palavra para o termo de query allè, como "Desde allè". Para testar isso, edite sua definição de índice para substituir o tokenizador keyword na linha 17 pelo tokenizador standard, salve a definição de índice e execute a query de exemplo.

1

mongodb-driver-kotlin-coroutine

4.10.0 ou uma versão superior

2
  1. Crie um arquivo denominado DiacriticInsensitive.kt.

  2. Copie e cole o seguinte código no arquivo DiacriticInsensitive.kt.

    O exemplo de código executa as seguintes tarefas:

    • Importa pacotes e dependências do mongodb .

    • Estabelece uma ligação ao seu cluster Atlas.

    • Usa as seguintes cláusulas do operador compound para consultar a coleção:

      • must cláusula para pesquisar títulos de filmes que começam com o termo allè usando o operador curinga

      • should cláusula para especificar preferência pelo gênero Drama usando o operador de texto

      A query utiliza o estágio $project para:

      • Excluir todos os campos, exceto title e genres

      • Adicione um campo chamado score

    • Imprime os documentos que correspondem à query da instância AggregateFlow.

    1import com.mongodb.client.model.Aggregates.project
    2import com.mongodb.client.model.Projections.*
    3import com.mongodb.kotlin.client.coroutine.MongoClient
    4import kotlinx.coroutines.runBlocking
    5import org.bson.Document
    6
    7fun main() {
    8 // connect to your Atlas cluster
    9 val uri = "<connection-string>"
    10 val mongoClient = MongoClient.create(uri)
    11
    12 // set namespace
    13 val database = mongoClient.getDatabase("sample_mflix")
    14 val collection = database.getCollection<Document>("movies")
    15
    16 runBlocking {
    17 // define clauses
    18 val mustClauses = listOf(
    19 Document(
    20 "wildcard",
    21 Document("path", "title")
    22 .append("query", "allè*")
    23 .append("allowAnalyzedField", true)
    24 )
    25 )
    26
    27 val shouldClauses = listOf(
    28 Document(
    29 "text",
    30 Document("query", "Drama")
    31 .append("path", "genres")
    32 )
    33 )
    34
    35 // define pipeline
    36 val agg = Document( "\$search",
    37 Document("index", "diacritic-insensitive-tutorial")
    38 .append("compound", Document("must", mustClauses)
    39 .append("should", shouldClauses)
    40 )
    41 )
    42
    43 // run pipeline and print results
    44 val resultsFlow = collection.aggregate<Document>(
    45 listOf(
    46 agg,
    47 project(fields(
    48 excludeId(),
    49 include("title", "genres"),
    50 computed("score", Document("\$meta", "searchScore"))))
    51 )
    52 )
    53 resultsFlow.collect { println(it) }
    54 }
    55
    56 mongoClient.close()
    57}
  3. Antes de executar o exemplo, substitua <connection-string> por sua cadeia de conexão do Atlas. Certifique-se de que sua cadeia de conexão inclui as credenciais do usuário do banco de dados. Para saber mais, consulte Conectar via Drivers.

  4. Execute o arquivo DiacriticInsensitive.kt.

    Ao executar o programa DiacriticInsensitive.kt no seu IDE, ele imprime os seguintes documentos:

    Document{{genres=[Drama, Family, Sport], title=Alley Cats Strike, score=1.2084882259368896}}
    Document{{genres=[Drama, Romance, Sci-Fi], title=Allegro, score=1.179288625717163}}
    Document{{genres=[Animation, Comedy, Fantasy], title=Allegro non troppo, score=1.0}}
    Document{{genres=[Comedy], title=Allez, Eddy!, score=1.0}}

A pesquisa curinga por allè retorna documentos onde o campo title começa com alle mesmo que não inclua nenhum diacrítico, porque o analisador personalizado diacriticsFolder que usamos no campo title aplicou a normalização de caracteres em seus valores. O Atlas Search retorna documentos com títulos que começam com o termo de query allè porque usamos o tokenizador de palavras-chave, que tokeniza strings inteiras (ou frases) como um único token.

Como alternativa, você pode especificar o tokenizador padrão em vez do tokenizador de palavra-chave no analisador personalizado usado no campo de título. Para o tokenizador padrão, os resultados do Atlas Search conteriam documentos com títulos que começam ou aparecem em qualquer parte do início da palavra para o termo de query allè, como "Desde allè". Para testar isso, edite sua definição de índice para substituir o tokenizador keyword na linha 17 pelo tokenizador standard, salve a definição de índice e execute a query de exemplo.

1
  1. Crie um arquivo denominado diacritic-insensitive.js.

  2. Copie e cole o seguinte código no arquivo diacritic-insensitive.js.

    O exemplo de código executa as seguintes tarefas:

    • Importa mongodb, o driver do Node.js da MongoDB.

    • Cria uma instância da classe MongoClient para estabelecer uma conexão com seu cluster do Atlas.

    • Usa as seguintes cláusulas do operador compound para consultar a coleção:

      • must cláusula para pesquisar títulos de filmes que começam com o termo allè usando o operador curinga

      • should cláusula para especificar preferência pelo gênero Drama usando o operador de texto

      A query utiliza o estágio $project para:

      • Excluir todos os campos, exceto title e genres

      • Adicione um campo chamado score

    • Itera sobre o cursor para imprimir os documentos que correspondem à consulta.

    1const { MongoClient } = require("mongodb");
    2
    3// Replace the uri string with your MongoDB deployment's connection string.
    4const uri =
    5 "<connection-string>";
    6
    7const client = new MongoClient(uri);
    8
    9async function run() {
    10 try {
    11 await client.connect();
    12
    13 // set namespace
    14 const database = client.db("sample_mflix");
    15 const coll = database.collection("movies");
    16
    17 // define pipeline
    18 const agg = [{
    19 '$search': {
    20 'index': 'diacritic-insensitive-tutorial',
    21 'compound': {
    22 'must': [{
    23 'wildcard': {
    24 'query': "allè*",
    25 'path': "title",
    26 'allowAnalyzedField': true
    27 }
    28 }],
    29 'should': [{'text': {'query': 'Drama', 'path': 'genres'}}]
    30 }}},
    31 { '$project': { '_id': 0, 'title': 1 , 'genres': 1, 'score': {'$meta': 'searchScore'}}}];
    32
    33 // run pipeline
    34 const result = await coll.aggregate(agg);
    35
    36 // print results
    37 await result.forEach((doc) => console.log(doc));
    38
    39 } finally {
    40 await client.close();
    41 }
    42}
    43run().catch(console.dir);
  3. Antes de executar o exemplo, substitua <connection-string> por sua cadeia de conexão do Atlas. Certifique-se de que sua cadeia de conexão inclui as credenciais do usuário do banco de dados. Para saber mais, consulte Conectar via Drivers.

  4. Execute o seguinte comando para consultar sua collection:

    node diacritic-insensitive.js
    {
    genres: [ 'Drama', 'Family', 'Sport' ],
    title: 'Alley Cats Strike',
    score: 1.2084882259368896
    }
    {
    genres: [ 'Drama', 'Romance', 'Sci-Fi' ],
    title: 'Allegro',
    score: 1.179288625717163
    }
    {
    genres: [ 'Animation', 'Comedy', 'Fantasy' ],
    title: 'Allegro non troppo',
    score: 1
    }
    {
    genres: [ 'Comedy' ],
    title: 'Allez, Eddy!',
    score: 1
    }

A pesquisa curinga por allè retorna documentos onde o campo title começa com alle mesmo que não inclua nenhum diacrítico, porque o analisador personalizado diacriticsFolder que usamos no campo title aplicou a normalização de caracteres em seus valores. O Atlas Search retorna documentos com títulos que começam com o termo de query allè porque usamos o tokenizador de palavras-chave, que tokeniza strings inteiras (ou frases) como um único token.

Como alternativa, você pode especificar o tokenizador padrão em vez do tokenizador de palavra-chave no analisador personalizado usado no campo de título. Para o tokenizador padrão, os resultados do Atlas Search conteriam documentos com títulos que começam ou aparecem em qualquer parte do início da palavra para o termo de query allè, como "Desde allè". Para testar isso, edite sua definição de índice para substituir o tokenizador keyword na linha 17 pelo tokenizador standard, salve a definição de índice e execute a query de exemplo.

1
  1. Crie um arquivo denominado diacritic-insensitive.py.

  2. Copie e cole o seguinte código no arquivo diacritic-insensitive.py.

    O seguinte exemplo de código:

    • Importa pymongo, o driver Python do MongoDB e o módulo dns, que é necessário para conectar pymongo a Atlas usando uma string de conexão da lista de sementes de DNS.

    • Cria uma instância da classe MongoClient para estabelecer uma conexão com seu cluster do Atlas.

    • Usa as seguintes cláusulas do operador compound para consultar a coleção:

      • must cláusula para pesquisar títulos de filmes que começam com o termo allè usando o operador curinga

      • should cláusula para especificar preferência pelo gênero Drama usando o operador de texto

      A query utiliza o estágio $project para:

      • Excluir todos os campos, exceto title e genres

      • Adicione um campo chamado score

    • Itera sobre o cursor para imprimir os documentos que correspondem à consulta.

    1import pymongo
    2
    3# connect to your Atlas cluster
    4client = pymongo.MongoClient('<connection-string>')
    5
    6# define pipeline
    7pipeline = [
    8 {'$search': {
    9 'index': 'diacritic-insensitive-tutorial',
    10 'compound': {
    11 'must': [{'wildcard': {'path': 'title', 'query': 'allè*', 'allowAnalyzedField': True}}],
    12 'should': [{'text': {'query': 'Drama', 'path': 'genres'}}]}}},
    13 {'$project': {'_id': 0, 'title': 1, 'genres': 1, 'score': {'$meta': 'searchScore'}}}
    14]
    15
    16# run pipeline
    17result = client['sample_mflix']['movies'].aggregate(pipeline)
    18
    19# print results
    20for i in result:
    21 print(i)
  3. Antes de executar o exemplo, substitua <connection-string> por sua cadeia de conexão do Atlas. Certifique-se de que sua cadeia de conexão inclui as credenciais do usuário do banco de dados. Para saber mais, consulte Conectar via Drivers.

  4. Execute o seguinte comando para consultar sua collection:

    python diacritic-insensitive.py
    {'genres': ['Drama', 'Family', 'Sport'], 'title': 'Alley Cats Strike', 'score': 1.2084882259368896}
    {'genres': ['Drama', 'Romance', 'Sci-Fi'], 'title': 'Allegro', 'score': 1.179288625717163}
    {'genres': ['Animation', 'Comedy', 'Fantasy'], 'title': 'Allegro non troppo', 'score': 1.0}
    {'genres': ['Comedy'], 'title': 'Allez, Eddy!', 'score': 1.0}

A pesquisa curinga por allè retorna documentos onde o campo title começa com alle mesmo que não inclua nenhum diacrítico, porque o analisador personalizado diacriticsFolder que usamos no campo title aplicou a normalização de caracteres em seus valores. O Atlas Search retorna documentos com títulos que começam com o termo de query allè porque usamos o tokenizador de palavras-chave, que tokeniza strings inteiras (ou frases) como um único token.

Como alternativa, você pode especificar o tokenizador padrão em vez do tokenizador de palavra-chave no analisador personalizado usado no campo de título. Para o tokenizador padrão, os resultados do Atlas Search conteriam documentos com títulos que começam ou aparecem em qualquer parte do início da palavra para o termo de query allè, como "Desde allè". Para testar isso, edite sua definição de índice para substituir o tokenizador keyword na linha 17 pelo tokenizador standard, salve a definição de índice e execute a query de exemplo.

Voltar

Todos os resultados