Modelagem de dados em várias linguagens do Atlas Search
Ethan Steininger, Harshad Dhavale2 min read • Published Sep 07, 2022 • Updated Sep 09, 2022
Avalie esse Tutorial
Vivemos numa economia cada vez mais globalizada. Por extensão, os usuários esperam que nossos aplicativos entendam o contexto de sua cultura e, por extensão, seu idioma.
Felizmente, a maioria dos mecanismos de busca – incluindo o Atlas Search – oferece suporte a várias linguagens. Este artigo abordará três opções de padrões de query, modelos de dados e definições de índice para atender às suas diversas necessidades de aplicativos multilíngues.
Para ilustrar as opções, criaremos um cenário fictício. Gerenciamos um aplicativo de pesquisa de receitas que oferece suporte a três países, e, por extensão, três idiomas: inglês, chinês (Kuromoji) e alemão. Nossos usuários estão localizados em todo o mundo e precisam pesquisar receitas no idioma nativo.
Temos um documento para cada linguagem na mesma coleção e, portanto, cada campo é indexado separadamente como sua própria linguagem. Isso simplifica os padrões de query e a UX às custas do armazenamento de índice inchado.
Documento:
1 [ 2 {"name":"すし"}, 3 {"name":"Fish and Chips"}, 4 {"name":"Käsespätzle"} 5 ]
Índice:
1 { 2 "name":"recipes", 3 "mappings": { 4 "dynamic": false, 5 "fields": { 6 "name": { 7 "type": "string", 8 "analyzer": "lucene.kuromoji" 9 }, 10 "name": { 11 "type": "string", 12 "analyzer": "lucene.english" 13 }, 14 "name": { 15 "type": "string", 16 "analyzer": "lucene.german" 17 } 18 } 19 } 20 }
Query:
1 { 2 "$search": { 3 "index": "recipes", 4 "text": { 5 "query": "Fish and Chips", 6 "path": "name" 7 } 8 } 9 }
Prós:
- Uma única definição de índice.
- Não é necessário especificar o nome ou caminho do índice com base no idioma do usuário.
- Pode aceitar vários idiomas em uma única query.
Contras:
- À medida que mais campos são adicionados, a definição do índice precisa mudar.
- A carga útil da definição do índice é potencialmente muito grande (mapeamento de campo estático por idioma).
- Campos de indexação como idiomas irrelevantes causam um tamanho de índice maior do que o necessário.
Temos uma coleção e um índice por idioma, o que nos permite isolar os diferentes idiomas das receitas. Isso pode ser útil se tivermos mais receitas em alguns idiomas do que em outros, às custas de muitas coleções e índices.
Documentos:
1 recipes_jp: 2 [{"name":"すし"}] 3 4 recipes_en: 5 [{"name":"Fish and Chips"}] 6 7 recipes_de: 8 [{"name":"Käsespätzle"}]
Índice:
1 { 2 "name":"recipes_jp", 3 "mappings": { 4 "dynamic": false, 5 "fields": { 6 "name": { 7 "type": "string", 8 "analyzer": "lucene.kuromoji" 9 } 10 } 11 } 12 } 13 14 { 15 "name":"recipes_en", 16 "mappings": { 17 "dynamic": false, 18 "fields": { 19 "name": { 20 "type": "string", 21 "analyzer": "lucene.english" 22 } 23 } 24 } 25 } 26 27 { 28 "name":"recipes_de", 29 "mappings": { 30 "dynamic": false, 31 "fields": { 32 "name": { 33 "type": "string", 34 "analyzer": "lucene.german" 35 } 36 } 37 } 38 }
Query:
1 { 2 "$search": { 3 "index": "recipes_jp" 4 "text": { 5 "query": "すし", 6 "path": "name" 7 } 8 } 9 }
Prós:
- Pode copiar a mesma definição de índice para cada coleção (substituindo o idioma).
- Isolar documentos de linguagens diferentes.
Contras:
- Os desenvolvedores precisam fornecer antecipadamente o nome da linguagem no caminho do índice.
- Necessidade de copiar documentos entre coleções na atualização.
- Cada índice é um cursor de fluxo de alterações, portanto, sua manutenção pode ser cara.
Ao incorporar cada idioma em um campo pai, podemos colocalizar as traduções de cada receita em cada documento.
Documento:
1 { 2 "name": { 3 "en":"Fish and Chips", 4 "jp":"すし", 5 "de":"Käsespätzle" 6 } 7 }
Índice:
1 { 2 "name":"multi_language_names", 3 "mappings": { 4 "dynamic": false, 5 "fields": { 6 "name": { 7 "fields": { 8 "de": { 9 "analyzer": "lucene.german", 10 "type": "string" 11 }, 12 "en": { 13 "analyzer": "lucene.english", 14 "type": "string" 15 }, 16 "jp": { 17 "analyzer": "lucene.kuromoji", 18 "type": "string" 19 } 20 }, 21 "type": "document" 22 } 23 } 24 } 25 }
Query:
1 { 2 "$search": { 3 "index": "multi_language_names" 4 "text": { 5 "query": "Fish and Chips", 6 "path": "name.en" 7 } 8 } 9 }
Prós:
- Mais fácil gerenciar documentos.
- A definição do índice é esparsa.
Contras:
- A carga útil da definição do índice é potencialmente muito grande (mapeamento de campo estático por idioma).
- Query e UX mais complexas.