Uma estrutura de decisão para MongoDB $regex e $text versus Atlas Search
Classifique este artigo
Você está usando $text ou $regex para fornecer funcionalidade semelhante a pesquisa em seu aplicativo? Em caso afirmativo, o operador $search do MongoDB Atlas oferece várias vantagens para $text e $regex, como resultados de pesquisa mais rápidos e eficientes, queries de linguagem natural, classificação de relevância integrada e melhor escalabilidade. Começar é muito fácil, pois o $search está incorporado como um estágio de agregação diretamente no MongoDB Atlas, fornecendo a você recursos completos de Full Text Search em todos os seus dados operacionais.
Embora os operadores $text e $regex sejam suas únicas opções para implantação local ou local e forneçam correspondência básica de texto e pesquisa de padrões, os usuários do Atlas Search descobrirão que o $search fornece uma solução mais abrangente e eficiente para implementar a funcionalidade de pesquisa avançada em seus aplicativos. Recursos como correspondência difusa, correspondência parcial de palavras, pesquisa de sinônimos, More Like This, facetagem e a capacidade de pesquisar em grandes conjuntos de dados só estão disponíveis com o Atlas Search.
Migrar de $text ou $regex para $search não significa necessariamente reescrever toda a sua base de código. Pode ser um processo gradual em que você começa a incorporar o operador $search em novos recursos ou a refatorar a funcionalidade de pesquisa existente em etapas.
A tabela abaixo explora os benefícios de utilizar o Atlas Search em comparação com expressões regulares para pesquisar dados. Acompanhe e experimente o poder do Atlas Search em primeira mão.
Observação: $text e $regex não tiveram grandes atualizações desde 2015, e todos os aprimoramentos futuros na pesquisa baseada em relevância serão fornecidos por meio do Atlas Search.
Requisitos do aplicativo | $regex | $text | $search | Raciocínio |
---|---|---|---|---|
O datastore deve respeitar as preocupações de gravação | ✅ | 🚫 | 🚫 | If you have a datastore that must respect write concerns for use cases like transactions with heavy reads after writes, $regex is a better choice. For search use cases, reads after writes should be rare. |
Conscientização de idiomas (espanital, chinês, inglês, etc.) | 🚫 | 🚫 | ✅ | Atlas Search natively supports over 40 languages so that you can better tokenize languages, remove stopwords, and interpret diacritics to support improved search relevance. |
Pesquisar texto sem distinção entre letra maiúscula e minúscula | 🚫 | 🚫 | ✅ | Case-insensitive text search using $regex is one of the biggest sources of problems among our customer base, and $search offers far more capabilities than $text. |
Realçando o texto do resultado | 🚫 | 🚫 | ✅ | The ability to highlight text fragments in result documents helps end users contextualize why some documents are returned compared to others. It's essential for user experiences powered by natural language queries. While developers could implement a crude version of highlighting with the other options, the $search aggregation stage provides an easy-to-consume API and a core engine that handles topics like tokenization and offsets. |
Queries de pesquisa com reconhecimento geoespacial | ✅ | 🚫 | ✅ | Both $regex and $search have geospatial capabilities. The differences between the two lie in the differences between how $regex and $search treat geospatial parameters. For instance, Lucene draws a straight line from one query coordinate to another, whereas MongoDB lines are spherical. Spherical queries are best for flights, whereas flat map queries might be better for short distances. |
Implantação local ou no local | ✅ | ✅ | 🚫 | O Atlas Search não está disponível localmente ou para implantação local. O destino de implantação único permite que nossa equipe se mova rapidamente e inove em um ritmo mais rápido do que se segmentássemos muitos modelos de implantação. Por essa razão, $regex e $text são as únicas opções para pessoas que não têm acesso ao Atlas. |
Preenchimento automático de caracteres (nGrams) | 🚫 | 🚫 | ✅ | End users typing in a search box have grown accustomed to an experience where their search queries are completed for them. Atlas Search offers edgeGrams for left-to-right autocomplete, nGrams for autocomplete with languages that do not have whitespace, and rightEdgeGram for languages that are written and read right-to-left. |
Preenchimento automático de palavras (wordGrams) | 🚫 | 🚫 | ✅ | If you have a field with more than two words and want to offer word-based autocomplete as a feature of your application, then a shingle token filter with custom analyzers could be best for you. Custom analyzers offer developers a flexible way to index and modify how their data is stored. |
Correspondência difusa na entrada de texto | 🚫 | 🚫 | ✅ | Se você quiser filtrar a entrada gerada pelo usuário, o fuzzy do Atlas Search oferece flexibilidade. Problemas como palavras com erros ortográficos são tratados melhor por $search. |
Filtragem baseada em mais de 10 strings | 🚫 | 🚫 | ✅ | It’s tricky to filter on more than 10 strings in MongoDB due to the limitations of compound text indexes. The compound filter is again the right way to go here. |
Pesquisa classificada por pontuação de relevância | 🚫 | 🚫 | ✅ | Atlas Search uses the state-of-art BM25 algorithm for determining the search relevance score of documents and allows for advanced configuration through boost expressions like multiply and gaussian decay, as well as analyzers, search operators, and synonyms. |
cluster precisa ser otimizado para desempenho de gravação | 🚫 | 🚫 | ✅ | Ao adicionar um índice de banco de dados no MongoDB, você deve considerar as compensações para o desempenho de gravação nos casos em que o desempenho de gravação do banco de dados seja importante. Os índices de pesquisa não degradam o desempenho de gravação do cluster. |
Pesquisando em grandes sets de data | 🚫 | 🚫 | ✅ | Se você tiver muitos documentos, suas queries ficarão linearmente mais lentas. No Atlas Search, o índice invertido permite a rápida recuperação de documentos em escalas muito grandes. |
Índices parciais para correspondência de texto simples | ✅ | 🚫 | 🚫 | O Atlas Search ainda não oferece suporte à indexação parcial. Hoje, $regex leva o bolo. |
Índice composto único em arrays | 🚫 | 🚫 | ✅ | O Atlas Search foi parcialmente projetado para este caso de uso, onde os índices de termos são intersectados em um único índice de pesquisa, para eliminar a necessidade de índices compostos para filtragem em arrays. |
Pesquisa de sinônimos | 🚫 | 🚫 | ✅ | The only option for robust synonyms search is Atlas Search, where synonyms are defined in a collection, and that collection is referenced in your search index. |
Facetamento rápido para contagens | 🚫 | 🚫 | ✅ | If you are looking for faceted navigation, or fast counts of documents based on text criteria, let Atlas Search do the bucketing. In our internal testing, it's 100x faster and also supports number and date buckets. |
Analisadores personalizados (palavras vazias, token de e-mail/URL etc.) | 🚫 | 🚫 | ✅ | Using Atlas Search, you can define a custom analyzer to suit your specific indexing needs. |
Correspondência parcial | 🚫 | 🚫 | ✅ | MongoDB has a number of partial match options ranging from the wildcard operator to autocomplete, which can be useful for some partial match use cases. |
Consultas de frase | 🚫 | 🚫 | ✅ | Phrase queries are supported natively in Atlas Search via the phrase operator. |
Observação: a marca de seleção verde às vezes não aparece nos casos em que o estágio de agregação correspondente pode ser capaz de satisfazer um requisito do aplicativo e, nesses casos, é porque um dos outros estágios (ou seja, $search) é muito superior para um determinado caso de uso.
Se abrirmos seu interesse em saber mais sobre o Atlas Search, temos alguns recursos para você começar:
The Atlas Search documentation provides reference materials and tutorials, while the MongoDB Developer Hub provides sample apps and code. You can spin up Atlas Search at no cost on the Atlas Free Tier and follow along with the tutorials using our sample data sets, or load your own data for experimentation within your own sandbox.