{"id":6189,"date":"2018-12-21T01:07:09","date_gmt":"2018-12-21T09:07:09","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=6189"},"modified":"2025-06-13T20:28:50","modified_gmt":"2025-06-14T03:28:50","slug":"searching-json-comparing-text-search-in-couchbase-and-mongodb","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/","title":{"rendered":"Pesquisando JSON: compare a pesquisa de texto no Couchbase e no MongoDB."},"content":{"rendered":"<blockquote><p>\"Os aplicativos sem pesquisa s\u00e3o como a p\u00e1gina inicial do Google sem a barra de pesquisa.\"<\/p><\/blockquote>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-6199\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/12\/Screen-Shot-2018-12-21-at-1.03.47-AM-300x161.png\" alt=\"\" width=\"732\" height=\"393\" \/><\/p>\n<p>\u00c9 dif\u00edcil projetar um aplicativo sem uma boa pesquisa.  Hoje em dia, tamb\u00e9m \u00e9 dif\u00edcil encontrar um banco de dados sem uma busca integrada. Do MySQL ao NoSQL, do Sybase ao Couchbase, todos os bancos de dados t\u00eam suporte para busca de texto - integrado como o Couchbase ou por meio de integra\u00e7\u00e3o com a Elastic - como \u00e9 o caso do Cassandra. Ao contr\u00e1rio do SQL, a funcionalidade de busca de texto n\u00e3o \u00e9 padronizada. Todos os aplicativos precisam da melhor busca poss\u00edvel, mas nem todos os bancos de dados oferecem a mesma funcionalidade de busca de texto. \u00c9 importante entender os recursos dispon\u00edveis e o desempenho de cada implementa\u00e7\u00e3o de busca de texto e escolher o que melhor se adapta \u00e0s necessidades do seu aplicativo. Ap\u00f3s motivar a pesquisa de texto, voc\u00ea aprender\u00e1 sobre os recursos de pesquisa de texto necess\u00e1rios para uma pesquisa eficaz, comparar\u00e1 e contrastar\u00e1 esses recursos no MongoDB e no Couchbase com exemplos.<\/p>\n<h5>Vamos examinar os requisitos de pesquisa no n\u00edvel do aplicativo.<\/h5>\n<ol>\n<li>\n<h5>Pesquisa exata: (WHERE item_id = \"ABC482\")<\/h5>\n<\/li>\n<li>\n<h5>Pesquisa de intervalo: (WHERE item_type = \"shoes\" and size = 6 and price between 49.99 and 99.99)<\/h5>\n<\/li>\n<li>\n<h5>Pesquisa de cordas:<\/h5>\n<ul>\n<li>\n<h5>(WHERE lower(name) LIKE \"%joe%\")<\/h5>\n<\/li>\n<li>\n<h5>(WHERE lower(name) LIKE \"%joe%\" AND state = \"CA\")<\/h5>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<h5>Pesquisa de documentos:<\/h5>\n<ul>\n<li>\n<h5>Encontre joe em qualquer campo do documento JSON<\/h5>\n<\/li>\n<li>\n<h5>Encontre documentos que correspondam ao n\u00famero de telefone (408-956-2444) em qualquer formato (+1 (408) 956-2444, +1 510.956.2444, (408) 956 2444)<\/h5>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<h5>Pesquisa complexa: (WHERE lower(title) LIKE \"%dictator%\" and lower(actor) LIKE \"%chaplin\" and year &lt; 1950)<\/h5>\n<\/li>\n<\/ol>\n<h5>As pesquisas de intervalo nos casos (1) e (2) podem ser tratadas com \u00edndices B-Tree t\u00edpicos de forma eficiente. Os dados s\u00e3o bem organizados pelos dados completos que voc\u00ea est\u00e1 pesquisando.  Quando voc\u00ea come\u00e7a a procurar o fragmento da palavra \"joe\" ou a combinar n\u00fameros de telefone com v\u00e1rios padr\u00f5es em um documento maior, os \u00edndices baseados em B-Tree sofrem. Simples <a href=\"https:\/\/dzone.com\/articles\/more-than-like-efficient-json-search-with-couchbas\">tokeniza\u00e7\u00f5es<\/a> e o uso de \u00edndices baseados em B-Tree pode ajudar em casos simples.  Voc\u00ea precisa de novas abordagens para seus casos de pesquisa no mundo real.<\/h5>\n<h5>A se\u00e7\u00e3o de ap\u00eandice deste blog tem mais detalhes sobre como os \u00edndices de \u00e1rvore invertida s\u00e3o organizados e por que eles s\u00e3o usados para a pesquisa empresarial em <a href=\"https:\/\/lucene.apache.org\/\">Lucene<\/a> e <a href=\"https:\/\/blevesearch.com\/\">Bleve<\/a>.  O Bleve alimenta a pesquisa de texto completo do Couchbse.  O MongoDB usa \u00edndices baseados em B-Tree at\u00e9 mesmo para pesquisa de texto.<\/h5>\n<h5>Vamos nos concentrar agora no suporte \u00e0 pesquisa de texto no MongoDB e no Couchbase.<\/h5>\n<h5>O conjunto de dados que usei \u00e9 de\u00a0<a href=\"https:\/\/github.com\/jdorfman\/awesome-json-datasets#movies\">https:\/\/github.com\/jdorfman\/awesome-json-datasets#movies<\/a><\/h5>\n<h5><span style=\"font-weight: 400\">MongoDB: <\/span><a href=\"https:\/\/docs.mongodb.com\/manual\/text-search\/\"><span style=\"font-weight: 400\">https:\/\/docs.mongodb.com\/manual\/text-search\/<\/span><\/a><\/h5>\n<h5><span style=\"font-weight: 400\">Couchbase: <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/6.0\/fts\/full-text-intro.html\"><span style=\"font-weight: 400\">https:\/\/docs.couchbase.com\/server\/6.0\/fts\/full-text-intro.html<\/span><\/a><\/h5>\n<h5><span style=\"font-weight: 400\"><span style=\"color: #008000\"><strong>Vis\u00e3o geral da pesquisa de texto do MongoDB:<\/strong>\u00a0<\/span> Crie e consulte o \u00edndice de pesquisa de texto em strings de documentos do MongoDB.  O \u00edndice parece ser um simples \u00edndice de \u00e1rvore B com camadas adicionais para o analisador integrado.  Isso traz muitos problemas de dimensionamento e desempenho que discutiremos mais adiante.  O \u00edndice de pesquisa de texto est\u00e1 totalmente integrado \u00e0 infraestrutura do banco de dados MongoDB e \u00e0 sua API de consulta.\u00a0<\/span><\/h5>\n<h5><span style=\"font-weight: 400\">O MongoDB fornece \u00edndices de texto para suportar consultas de pesquisa de texto somente em strings. Seus \u00edndices de texto podem incluir apenas campos cujo valor seja uma string ou uma matriz de elementos de string.\u00a0<\/span><span style=\"font-weight: 400\">Uma cole\u00e7\u00e3o s\u00f3 pode ter um \u00edndice de pesquisa de texto, mas esse \u00edndice pode abranger v\u00e1rios campos.<\/span><\/h5>\n<h5><span style=\"font-weight: 400\"><span style=\"color: #ff0000\"><strong>Vis\u00e3o geral do Couchbase FTS (Full-Text Search):<\/strong> <\/span>O Full-Text Search oferece amplos recursos para consultas em linguagem natural. O Bleve, implementado como um \u00edndice invertido, alimenta o \u00edndice de texto completo do Couchbase.  O \u00edndice \u00e9 implantado como um dos servi\u00e7os e pode ser implantado em qualquer um dos n\u00f3s do cluster.<\/span><\/h5>\n<p>&nbsp;<\/p>\n<table>\n<tbody>\n<tr>\n<td>\n<h5><\/h5>\n<\/td>\n<td>\n<h4><span style=\"color: #008000\"><b>MongoDB<\/b><\/span><\/h4>\n<\/td>\n<td>\n<h4><span style=\"color: #ff0000\"><b>Couchbase<\/b><\/span><\/h4>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><strong>Nome<\/strong><\/h5>\n<\/td>\n<td>\n<h5>Pesquisa de texto - 4.x<\/h5>\n<\/td>\n<td>\n<h5>Pesquisa de texto completo (FTS) - 6.x.<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><strong>Funcionalidade<\/strong><\/h5>\n<\/td>\n<td>\n<h5>Pesquisa de texto simples para indexar campos de cadeia e pesquisar uma cadeia em apenas um ou mais campos de cadeia.  Usa seu <strong>\u00cdndices B-Tree<\/strong> para o \u00edndice de pesquisa de texto.<\/h5>\n<h5>Pesquisa em toda a string composta e n\u00e3o pode separar os campos espec\u00edficos.<\/h5>\n<\/td>\n<td>\n<h5>Pesquisa de texto completo para encontrar qualquer coisa em seus dados. Oferece suporte a todos os tipos de dados JSON (string, num\u00e9rico, booleano, data\/hora); a consulta oferece suporte a express\u00f5es booleanas complexas e express\u00f5es difusas em qualquer tipo de campo.  Usa o <strong>\u00edndice invertido<\/strong>\u00a0para o \u00edndice de pesquisa de texto.<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>Instala\u00e7\u00e3o<\/b><\/h5>\n<\/td>\n<td>\n<h5>Pesquisa de texto: Dispon\u00edvel com a instala\u00e7\u00e3o do MongoDB. N\u00e3o h\u00e1 op\u00e7\u00e3o de instala\u00e7\u00e3o separada.<\/h5>\n<\/td>\n<td>\n<h5>Dispon\u00edvel com a instala\u00e7\u00e3o do Couchbase. Pode ser instalado com outros servi\u00e7os (dados, consulta, \u00edndice etc.) ou instalado separadamente em n\u00f3s de pesquisa distintos.<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>Cria\u00e7\u00e3o de \u00edndice em um \u00fanico campo<\/b><\/h5>\n<\/td>\n<td>\n<h5>db.films.createIndex({ title: \"text\" });<\/h5>\n<\/td>\n<td>\n<h5 class=\"p1\"><span class=\"s1\">curl -u Administrador:senha -XPUT<span class=\"Apple-converted-space\">\u00a0 <\/span>https:\/\/localhost:8094\/api\/index\/films_title<span class=\"Apple-converted-space\">\u00a0 <\/span>-H 'cache-control: no-cache'<span class=\"Apple-converted-space\">\u00a0 <\/span>-H 'content-type: application\/json'<span class=\"Apple-converted-space\">\u00a0 <\/span>-d '{ \"name\": \"films_title\", \"type\": \"fulltext-index\", \"params\": { \"mapping\": { \"default_field\": \"title\" } }, \"sourceType\": \"couchbase\", \"sourceName\": \"films\" }'<\/span><\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>Cria\u00e7\u00e3o de \u00edndice em v\u00e1rios campos<\/b><\/h5>\n<\/td>\n<td>\n<h5>db.films.createIndex({ title: \"text\", genres: \"text\"});<\/h5>\n<h5>Antes de criar esse \u00edndice, voc\u00ea precisa eliminar o \u00edndice anterior. <span style=\"color: #0000ff\">S\u00f3 pode haver um \u00edndice de texto em uma cole\u00e7\u00e3o<\/span>. Voc\u00ea precisa do nome dele, que pode ser obtido por: db.films.getIndexes() ou especificar o nome ao criar o \u00edndice.<\/h5>\n<h5>db.films.dropIndex(\"title_text\");<\/h5>\n<\/td>\n<td>\n<h5>Voc\u00ea pode criar v\u00e1rios \u00edndices em um bucket (ou espa\u00e7o de chave) sem restri\u00e7\u00f5es.<\/h5>\n<h5 class=\"p1\"><span class=\"s1\">curl -u Administrator:password -XPUT https:\/\/localhost:8094\/api\/index\/films_title_genres -H 'cache-control: no-cache' -H 'content-type: application\/json' -d '{ \"name\": \"films_title_genres\", \"type\": \"fulltext-index\", \"params\": {<span class=\"Apple-converted-space\">\u00a0 \u00a0 <\/span>\"mapping\": {\"types\": { \"genres\": { \"enabled\": true, \"dynamic\": false }, \"title\": { \"enabled\": true, \"dynamic\": false }}}}, \"sourceType\": \"couchbase\", \"sourceName\": \"films\" }'<\/span><\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>Usando pesos<\/b><\/h5>\n<\/td>\n<td>\n<h5>db.films.createIndex({ title: \"text\", genres: \"text\"}, {weights:{title: 25}, name : \"txt_title_genres\"});<b><\/b><\/h5>\n<\/td>\n<td>\n<h5>Feito dinamicamente por meio do refor\u00e7o usando o ^ mofidier.<\/h5>\n<h5 id=\"jsonQueryCurlContent\" class=\"ng-binding\">curl -XPOST -H \"Content-Type: application\/json\" \\ https:\/\/172.23.120.38:8094\/api\/index\/films_title_genres\/query \\ -d '{ \"explain\": true, \"fields\": [ \"*\" ], \"highlight\": {}, \"query\": { \"query\": \"title:charlie^40 genres:comedy^5\" } }'<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>Op\u00e7\u00e3o de idioma<\/b><\/h5>\n<\/td>\n<td>\n<h5>O idioma padr\u00e3o \u00e9 o ingl\u00eas. Passe um par\u00e2metro para alterar isso.<\/h5>\n<h5>db.films.createIndex({ title: \"text\"}, { default_language: \"french\" });<\/h5>\n<\/td>\n<td>\n<h5>Os analisadores est\u00e3o dispon\u00edveis em 24 idiomas.  Voc\u00ea pode alter\u00e1-lo ao criar o \u00edndice alterando o seguinte par\u00e2metro.<\/h5>\n<h5 id=\"index_def_preview\" class=\"ng-binding\">\"default_analyzer\": \"fr\",<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>\u00cdndice de texto sem distin\u00e7\u00e3o entre mai\u00fasculas e min\u00fasculas<\/b><\/h5>\n<\/td>\n<td>\n<h5>N\u00e3o diferencia mai\u00fasculas de min\u00fasculas por padr\u00e3o. Estendido para novos idiomas.<\/h5>\n<\/td>\n<td>\n<h5>N\u00e3o diferencia mai\u00fasculas de min\u00fasculas por padr\u00e3o.<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>insens\u00edvel a diacr\u00edticos<\/b><\/h5>\n<\/td>\n<td>\n<h5>Com a vers\u00e3o 3, o \u00edndice de texto n\u00e3o \u00e9 sens\u00edvel a diacr\u00edticos.<\/h5>\n<\/td>\n<td>\n<h5>Sim.  Ativado automaticamente no analisador apropriado (por exemplo, franc\u00eas)<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>Delimitadores<\/b><\/h5>\n<\/td>\n<td>\n<h5>Tra\u00e7o, h\u00edfen, sintaxe_padr\u00e3o, aspas, pontua\u00e7\u00e3o_terminal e espa\u00e7o em branco<\/h5>\n<\/td>\n<td>\n<h5>Cada trabalho \u00e9 analisado com base na especifica\u00e7\u00e3o da linguagem e do analisador.<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>Idiomas<\/b><\/h5>\n<\/td>\n<td>\n<h5>15 idiomas:<\/h5>\n<h5 class=\"p1\"><span class=\"s1\">dinamarqu\u00eas, holand\u00eas, ingl\u00eas, finland\u00eas, franc\u00eas, alem\u00e3o, h\u00fangaro, italiano, noruegu\u00eas, portugu\u00eas, romeno, russo, espanhol, sueco, turco<\/span><\/h5>\n<\/td>\n<td>Os filtros de tokens s\u00e3o compat\u00edveis com os seguintes idiomas.<\/p>\n<p class=\"p1\"><span class=\"s1\">\u00c1rabe, catal\u00e3o, chin\u00eas, japon\u00eas, coreano, curdo, dinamarqu\u00eas, alem\u00e3o, grego, ingl\u00eas, espanhol (castelhano), basco, persa, finland\u00eas, franc\u00eas, ga\u00e9lico, espanhol (galego), hindi, h\u00fangaro, arm\u00eanio, indon\u00e9sio, italiano, holand\u00eas, noruegu\u00eas, portugu\u00eas, romeno, russo, sueco, turco<\/span><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>Tipo de \u00edndice<\/b><\/h5>\n<\/td>\n<td>\n<h5>\u00cdndice B-Tree simples contendo uma entrada para cada palavra com haste em cada documento.<\/h5>\n<h5>Os \u00edndices de texto podem ser grandes. Eles cont\u00eam uma entrada de \u00edndice para cada palavra p\u00f3s-temporal exclusiva em cada campo indexado para cada documento inserido.<\/h5>\n<\/td>\n<td>\n<h5>\u00cdndice invertido.  Uma entrada por palavra com haste no \u00edndice INTEIRO (por parti\u00e7\u00e3o de \u00edndice).  Portanto, os tamanhos dos \u00edndices s\u00e3o significativamente menores. Quanto maior for o conjunto de dados, o \u00edndice FTS do Couchbase \u00e9 muito mais eficiente em compara\u00e7\u00e3o com o \u00edndice de texto do MongoDB.<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>Efeito de cria\u00e7\u00e3o de \u00edndice em INSERTS.<\/b><\/h5>\n<\/td>\n<td>\n<h5>Afetar\u00e1 negativamente a taxa de INSER\u00c7\u00c3O.<\/h5>\n<\/td>\n<td>\n<h5>As taxas INSERT\/UPSERT n\u00e3o ser\u00e3o afetadas<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>Manuten\u00e7\u00e3o de \u00edndices<\/b><\/h5>\n<\/td>\n<td>\n<h5>Mantido de forma s\u00edncrona.<\/h5>\n<\/td>\n<td>\n<h5>Mantido de forma ass\u00edncrona.  As consultas podem especificar a obsolesc\u00eancia usando o par\u00e2metro de consist\u00eancia.<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>consultas de frases<\/b><\/h5>\n<\/td>\n<td>\n<h5>Suportado, mas lento.<\/h5>\n<h5>As pesquisas de frases s\u00e3o lentas, pois o \u00edndice de texto n\u00e3o inclui os metadados necess\u00e1rios sobre a proximidade das palavras nos documentos. Como resultado, as consultas por frase ser\u00e3o executadas com muito mais efici\u00eancia quando a cole\u00e7\u00e3o inteira couber na RAM.<\/h5>\n<\/td>\n<td>Suportado e r\u00e1pido.<\/p>\n<p>Inclua os vetores de termos durante a cria\u00e7\u00e3o do \u00edndice.<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>Pesquisa de texto <\/b><\/h5>\n<\/td>\n<td>\n<h5>db.films.find({$text: {$search: \"charlie chaplin\"}})<\/h5>\n<h5>Isso encontra todos os documentos que cont\u00eam charlie OU chaplin.  Ter ambos, charlie e chaplin, dar\u00e1 uma pontua\u00e7\u00e3o maior. Como s\u00f3 pode haver UM \u00edndice de texto por cole\u00e7\u00e3o, essa consulta usa esse \u00edndice independentemente do campo que indexa.  Portanto, \u00e9 importante decidir qual dos campos deve estar no \u00edndice.<\/h5>\n<\/td>\n<td>\n<pre id=\"jsonQueryCurlContent\" class=\"ng-binding\">Very Flexible text search. \r\n\r\ncurl -XPOST -H \"Content-Type: application\/json\" \\\r\nhttps:\/\/172.23.120.38:8094\/api\/index\/films_title_genres\/query \\\r\n-d '{\r\n  \"explain\": true,\r\n  \"fields\": [\r\n    \"*\"\r\n  ],\r\n  \"highlight\": {},\r\n  \"query\": {\r\n    \"query\": \"charlie chaplin\"\r\n  }\r\n}'<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5>Pesquisa de frase exata<\/h5>\n<\/td>\n<td>\n<h5>db.films.find({$text: {$search: \"\\\"charlie chaplin\\\"\"}})<\/h5>\n<\/td>\n<td>\n<pre id=\"jsonQueryCurlContent\" class=\"ng-binding\">curl -XPOST -H \"Content-Type: application\/json\" \\\r\nhttps:\/\/172.23.120.38:8094\/api\/index\/films_title_genres\/query \\\r\n-d '{\r\n  \"explain\": true,\r\n  \"fields\": [\r\n    \"*\"\r\n  ],\r\n  \"highlight\": {},\r\n  \"query\": {\r\n    \"query\": \"\\\"charlie chaplin\\\"\"\r\n  }\r\n}'<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td><b>Exclus\u00e3o exata<\/b><\/td>\n<td>db.films.find({$text: {$search: \"charlie -chaplin\"}});<\/p>\n<p>Todos os filmes com \"charlie\", mas sem \"chaplin\".<\/td>\n<td>\n<pre id=\"jsonQueryCurlContent\" class=\"ng-binding\">curl -XPOST -H \"Content-Type: application\/json\" \\\r\nhttps:\/\/172.23.120.38:8094\/api\/index\/films_title_genres\/query \\\r\n-d '{\r\n  \"explain\": true,\r\n  \"fields\": [\r\n    \"*\"\r\n  ],\r\n  \"highlight\": {},\r\n  \"query\": {\r\n    \"query\": \"charlie -chaplin\"\r\n  }\r\n}'<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td><strong>Ordem dos resultados.<\/strong><\/td>\n<td>\n<h5>N\u00e3o ordenado por padr\u00e3o.<\/h5>\n<h5>Projete e classifique por pontua\u00e7\u00e3o quando precisar.<\/h5>\n<h5>db.films.find({$text: {$search: \"charlie chaplin\"}}, {score: {$meta: \"searchscore\"}}).sort({$meta: \"searchscore\"})<\/h5>\n<\/td>\n<td>Ordenado por pontua\u00e7\u00e3o (decrescente) por padr\u00e3o. \u00c9 poss\u00edvel ordenar por qualquer campo ou metadados.  Isso ordena por t\u00edtulo e pontua\u00e7\u00e3o (decrescente)<\/p>\n<pre id=\"jsonQueryCurlContent\" class=\"ng-binding\">curl -XPOST -H \"Content-Type: application\/json\" \\\r\nhttps:\/\/172.23.120.38:8094\/api\/index\/films_title_genres\/query \\\r\n-d '{\r\n  \"explain\": true,\r\n  \"fields\": [\r\n    \"*\"\r\n  ],\r\n  \"highlight\": {},\r\n  \"sort\":[\"title\", \"-_score\"]\r\n  \"query\": {\r\n    \"query\": \"charlie -chaplin\"\r\n  }\r\n}'<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td><b>Pesquisa de idioma espec\u00edfico<\/b><\/td>\n<td>\n<h5>db.articles.find(<\/h5>\n<h5>\u00a0\u00a0{ $text: { $search: \"leche\", $language: \"es\" } }<\/h5>\n<h5>)<\/h5>\n<\/td>\n<td>O analisador de linguagem ter\u00e1 determinado as caracter\u00edsticas do \u00edndice e da consulta.<\/td>\n<\/tr>\n<tr>\n<td><b>Pesquisa sem distin\u00e7\u00e3o entre mai\u00fasculas e min\u00fasculas<\/b><\/td>\n<td>\n<h5>db.film.find( { $text: { $search: \"Lawrence\", $caseSensitive: true } } )<b><\/b><\/h5>\n<p>&nbsp;<\/td>\n<td>Determinado pelo analista.  Use o filtro de token to_lower para que todas as pesquisas n\u00e3o diferenciem mai\u00fasculas de min\u00fasculas.  Veja mais em: https:\/\/docs.couchbase.com\/server\/6.0\/fts\/fts-using-analyzers.html<\/td>\n<\/tr>\n<tr>\n<td><b>Limitar o conjunto de resultados de retorno.<\/b><\/td>\n<td>\n<h5>db.films.find({$text: {$search: \"charlie chaplin\"}},{score: {$meta: \"searchscore\"}}).sort({$meta: \"searchscore\"}).limit(10)<\/h5>\n<\/td>\n<td>Oferece suporte ao equivalente de LIMIT e SKIP no SQL usando os par\u00e2metros \"size\" e \"from\", respectivamente.<\/p>\n<pre id=\"jsonQueryCurlContent\" class=\"ng-binding\">curl -XPOST -H \"Content-Type: application\/json\" \\\r\nhttps:\/\/172.23.120.38:8094\/api\/index\/films_title_genres\/query \\\r\n-d '{\r\n  \"explain\": true,\r\n  \"fields\": [\r\n    \"*\"\r\n  ],\r\n  \"highlight\": {},\r\n  \"query\": {\r\n    \"query\": \"charlie chaplin\"\r\n  }, \r\n  \"size\":10,\r\n  \"from\":40\r\n}'<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td><b>Classifica\u00e7\u00e3o complexa<\/b><\/td>\n<td>\n<h5>db.films.find({$text: {$search: \"charlie chaplin\"}},<\/h5>\n<h5>{score: {$meta: \"searchscore\"}}).sort({year : 1, $meta: \"searchscore\"}).limit(10)<\/h5>\n<\/td>\n<td>Ordenado por pontua\u00e7\u00e3o (decrescente) por padr\u00e3o. \u00c9 poss\u00edvel ordenar por qualquer campo ou metadados.  Isso classifica por t\u00edtulo (crescente), ano (decrescente) e pontua\u00e7\u00e3o (decrescente)<\/p>\n<pre id=\"jsonQueryCurlContent\" class=\"ng-binding\">curl -XPOST -H \"Content-Type: application\/json\" \\\r\nhttps:\/\/172.23.120.38:8094\/api\/index\/films_title_genres\/query \\\r\n-d '{\r\n  \"explain\": true,\r\n  \"fields\": [\r\n    \"*\"\r\n  ],\r\n  \"highlight\": {},\r\n  \"sort\":[\"title\", \"-year\", \"-_score\"]\r\n  \"query\": {\r\n    \"query\": \"charlie -chaplin\"\r\n  }\r\n}'<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td><b>Consulta complexa<\/b><\/td>\n<td>\n<h5>Use a estrutura de agrega\u00e7\u00e3o.  A pesquisa do $text pode ser usada em uma estrutura de agrega\u00e7\u00e3o com algumas restri\u00e7\u00f5es.<\/h5>\n<h5>db.articles.aggregate(<br \/>\n[<br \/>\n{ $match: { $text: { $search: \"charlie chaplin\" } } },<br \/>\n{ $project: { title: 1, _id: 0, score: { $meta: \"searchscore\" } } },<br \/>\n{ $match: { score: { $gt: 5.0 } } }<br \/>\n]<br \/>\n)<\/h5>\n<ul>\n<li>Limita\u00e7\u00f5es: <a href=\"https:\/\/docs.mongodb.com\/manual\/tutorial\/text-search-in-aggregation\/\">https:\/\/docs.mongodb.com\/manual\/tutorial\/text-search-in-aggregation\/<\/a><\/li>\n<\/ul>\n<\/td>\n<td>Como voc\u00ea viu at\u00e9 agora, a pr\u00f3pria consulta do FTS \u00e9 bastante sofisticada. Al\u00e9m disso, o FTS oferece suporte a facetas para agrupamento e contagem simples.\u00a0<a href=\"https:\/\/docs.couchbase.com\/server\/6.0\/fts\/fts-response-object-schema.html\">https:\/\/docs.couchbase.com\/server\/6.0\/fts\/fts-response-object-schema.html<\/a><\/p>\n<p>Na pr\u00f3xima vers\u00e3o, o N1QL (SQL para JSON) usar\u00e1 o \u00edndice FTS para predicados de pesquisa.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"\">SELECT state, sum(sales)\r\nFROM store_sales s\r\nWHERE search(s.title, \"lego\", \"fts_title\")\r\nGROUP BY state<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td><b>\u00cdndice completo do documento<\/b><\/td>\n<td>N\u00e3o oferece suporte \u00e0 indexa\u00e7\u00e3o completa de documentos.  Todos os campos de cadeia de caracteres dever\u00e3o ser especificados na chamada createIndex.<\/p>\n<h5>db.films.createIndex({t\u00edtulo: \"texto\", g\u00eaneros: \"texto\", elenco: \"texto\", ano: \"texto\"});<b><\/b><\/h5>\n<p>&nbsp;<\/td>\n<td>Por padr\u00e3o, ele suporta a indexa\u00e7\u00e3o do documento completo, reconhece automaticamente o tipo de campo e o indexa de acordo.<\/td>\n<\/tr>\n<tr>\n<td><b>Tipos de consulta<\/b><\/td>\n<td>\n<h5>Pesquisa b\u00e1sica, deve ter, n\u00e3o deve ter.<\/h5>\n<\/td>\n<td>\n<h5>Consultas Match, Match Phrase, Doc ID e Prefix<\/h5>\n<h5>Consultas de campo de Conjun\u00e7\u00e3o, Disjun\u00e7\u00e3o e Booleano<\/h5>\n<h5>Consultas de intervalo num\u00e9rico e intervalo de datas<\/h5>\n<h5>Consultas geoespaciais<\/h5>\n<h5>Consultas Query String, que empregam uma sintaxe especial para expressar os detalhes de cada consulta (consulte Consulta Query String Query para obter informa\u00e7\u00f5es)<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td><b>Analisadores dispon\u00edveis<\/b><\/td>\n<td>Somente analisadores incorporados.<\/td>\n<td>Analisadores incorporados e personaliz\u00e1veis. Veja mais em:\u00a0<a href=\"https:\/\/docs.couchbase.com\/server\/6.0\/fts\/fts-using-analyzers.html#character-filters\/token-filters\">https:\/\/docs.couchbase.com\/server\/6.0\/fts\/fts-using-analyzers.html#character-filters\/token-filters<\/a><b><br \/>\n<\/b><\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>Criar e pesquisar por meio da interface do usu\u00e1rio<\/b><\/h5>\n<\/td>\n<td>\n<h5>N\u00e3o no produto b\u00e1sico.<\/h5>\n<\/td>\n<td>\n<h5>Integrado ao console<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td><b>API REST<\/b><\/td>\n<td>\n<h5>Indispon\u00edvel.<\/h5>\n<\/td>\n<td><b>Dispon\u00edvel.<\/b><\/p>\n<p><a href=\"https:\/\/docs.couchbase.com\/server\/6.0\/fts\/fts-searching-with-the-rest-api.html\"><b>https:\/\/docs.couchbase.com\/server\/6.0\/fts\/fts-searching-with-the-rest-api.html<\/b><\/a><\/p>\n<p><b>https:\/\/docs.couchbase.com\/server\/6.0\/rest-api\/rest-fts.html<\/b><\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>SDK<\/b><\/h5>\n<\/td>\n<td>\n<h5>A pesquisa de texto \u00e9 incorporada \u00e0 maioria dos SDKs do Mongo.   Por exemplo, https:\/\/mongodb.github.io\/mongo-java-driver\/<\/h5>\n<\/td>\n<td>\n<h5><a href=\"https:\/\/docs.couchbase.com\/java-sdk\/2.7\/full-text-searching-with-sdk.html\">https:\/\/docs.couchbase.com\/java-sdk\/2.7\/full-text-searching-with-sdk.html<\/a><\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td><b>Tipos de dados suportados<\/b><\/td>\n<td><b>Somente strings.  N\u00e3o h\u00e1 suporte para nenhum outro tipo de dado.<\/b><\/td>\n<td><b>Todos os tipos de dados JSON e datas e horas.<\/b><\/p>\n<p><b>String, num\u00e9rico, booleano, data e hora, objeto e matrizes. <\/b><\/p>\n<p><b>GEOPOINT para consultas ao vizinho mais pr\u00f3ximo.   Veja :\u00a0<\/b><a href=\"https:\/\/docs.couchbase.com\/server\/6.0\/fts\/fts-geospatial-queries.html\">https:\/\/docs.couchbase.com\/server\/6.0\/fts\/fts-geospatial-queries.html<\/a><\/td>\n<\/tr>\n<tr>\n<td><strong>Vetores de prazo.<\/strong><\/td>\n<td>Sem suporte.<\/td>\n<td>Dispon\u00edvel.   Os vetores de termos s\u00e3o muito \u00fateis na pesquisa de frases.<\/td>\n<\/tr>\n<tr>\n<td><strong>Facetamento<\/strong><\/td>\n<td>Sem suporte<\/td>\n<td>\n<h5>Termo Faceta<\/h5>\n<h5>Faceta de intervalo num\u00e9rico<\/h5>\n<h5>Faceta Intervalo de datas<\/h5>\n<h5><a href=\"https:\/\/docs.couchbase.com\/server\/6.0\/fts\/fts-response-object-schema.html\">https:\/\/docs.couchbase.com\/server\/6.0\/fts\/fts-response-object-schema.html<\/a><\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td><strong>Consultas AND avan\u00e7adas (conjun\u00e7\u00f5es)<\/strong><\/td>\n<td>Sem suporte.<\/td>\n<td>\n<h5>curl -u Administrator:password -XPOST -H \"Content-Type: application\/json\" https:\/\/172.23.120.38:8094\/api\/index\/filmsearch\/query -d '{<\/h5>\n<h5>\u00a0\"explain\": verdadeiro,<\/h5>\n<h5>\u00a0\"fields\": [<\/h5>\n<h5>\u00a0\u00a0\u00a0&#8220;*&#8221;<\/h5>\n<h5>\u00a0],<\/h5>\n<h5>\u00a0\"highlight\": {},<\/h5>\n<h5>\u00a0\"query\": {<\/h5>\n<h5>\u00a0\u00a0\u00a0\"conjuncts\":[ {\"field\": \"title\", \"match\": \"kid\"}, {\"field\": \"cast\", \"match\": \"chaplin\"}]<\/h5>\n<h5>\u00a0}<\/h5>\n<h5>}&#8217;<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td><strong>Consultas OR avan\u00e7adas (disjuntos)<\/strong><\/td>\n<td>Sem suporte.<\/td>\n<td>\n<h5>curl -u Administrator:password -XPOST -H \"Content-Type: application\/json\" https:\/\/172.23.120.38:8094\/api\/index\/filmsearch\/query -d '{<\/h5>\n<h5>\u00a0\"explain\": verdadeiro,<\/h5>\n<h5>\u00a0\"fields\": [<\/h5>\n<h5>\u00a0\u00a0\u00a0&#8220;*&#8221;<\/h5>\n<h5>\u00a0],<\/h5>\n<h5>\u00a0\"highlight\": {},<\/h5>\n<h5>\u00a0\"query\": {<\/h5>\n<h5>\u00a0\u00a0\u00a0\"disjuncts\":[ {\"field\": \"title\", \"match\": \"kid\"}, {\"field\": \"cast\", \"match\": \"chaplin\"}]<\/h5>\n<h5>\u00a0}<\/h5>\n<h5>}&#8217;<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\u00a0<strong>Consultas de intervalo de datas<\/strong><\/td>\n<td>Sem suporte.<\/p>\n<p>Necessita de p\u00f3s-processamento, o que pode afetar o desempenho.<\/td>\n<td>\u00a0Suportado pelo FTS.<\/p>\n<h5>{<br \/>\n\"start\": \u201c2001-10-09T10:20:30-08:00\u201d,<br \/>\n\"end\": \"2016-10-31\",<br \/>\n\"inclusive_start\": false,<br \/>\n\"inclusive_end\": false,<br \/>\n\"field\" (campo): \"review_date\"<br \/>\n}<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td><strong>Consultas de intervalo num\u00e9rico<\/strong><\/td>\n<td>\u00a0Sem suporte.<\/td>\n<td>\u00a0curl -u Administrator:password -XPOST -H \"Content-Type: application\/json\" https:\/\/172.23.120.38:8094\/api\/index\/filmsearch\/query -d '{<br \/>\n\"explain\": verdadeiro,<br \/>\n\"fields\": [<br \/>\n&#8220;*&#8221;<br \/>\n],<br \/>\n\"highlight\": {},<br \/>\n\"query\": {<br \/>\n\"field\": \"year\", \"min\":1999, \"max\":1999, \"inclusive_min\": true, \"inclusive_max\":true<br \/>\n}<br \/>\n}&#8217;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5><strong><span style=\"color: #0000ff\">Desempenho:<\/span><\/strong><\/h5>\n<p>Embora uma compara\u00e7\u00e3o elaborada de desempenho ainda esteja pendente, fizemos uma compara\u00e7\u00e3o r\u00e1pida com 1 milh\u00e3o de documentos da Wikip\u00e9dia. Veja o que vimos:<\/p>\n<p><strong>Tamanhos de \u00edndice.<\/strong><\/p>\n<table dir=\"ltr\" border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<colgroup>\n<col width=\"158\" \/>\n<col width=\"237\" \/>\n<col width=\"100\" \/><\/colgroup>\n<tbody>\n<tr>\n<td><\/td>\n<td>Couchbase (6.0)<\/td>\n<td>MongoDB (4.x)<\/td>\n<\/tr>\n<tr>\n<td>Tamanho da indexa\u00e7\u00e3o<\/td>\n<td>1 GB (queimadura)<\/td>\n<td>1,6 GB<\/td>\n<\/tr>\n<tr>\n<td>Tempo de indexa\u00e7\u00e3o<\/td>\n<td>46 segundos<\/td>\n<td>7,5 min<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Taxa de transfer\u00eancia de consultas de pesquisa (consultas por segundo):<\/strong><\/p>\n<p class=\"p1\"><span class=\"s1\"><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <strong>\u00a0Couchbase<\/strong><\/span><strong><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0\u00a0<\/span>Mongodb<\/strong><\/span><\/p>\n<p class=\"p1\"><span class=\"s1\">Termos de alta frequ\u00eancia<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span>395<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span>79<span class=\"Apple-converted-space\">\u00a0 \u00a0<\/span><\/span><\/p>\n<p class=\"p1\"><span class=\"s1\">Med<span class=\"Apple-converted-space\">\u00a0 <\/span>termos de frequ\u00eancia <span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0<\/span>6396 <span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0<\/span>201<\/span><\/p>\n<p class=\"p1\"><span class=\"s1\">Baixa<span class=\"Apple-converted-space\">\u00a0 <\/span>termos de frequ\u00eancia<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0<\/span>24600 <span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0<\/span>643<\/span><\/p>\n<p class=\"p1\"><span class=\"s1\">Alta ou Alta<span class=\"Apple-converted-space\">\u00a0 <\/span>termos<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0<\/span>145<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0<\/span>82<span class=\"Apple-converted-space\">\u00a0 \u00a0<\/span><\/span><\/p>\n<p class=\"p1\"><span class=\"s1\">Alta ou m\u00e9dia <span class=\"Apple-converted-space\">\u00a0 <\/span>termos<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0<\/span>258<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0<\/span>78\u00a0 \u00a0<\/span><\/p>\n<p class=\"p1\"><span class=\"s1\">Pesquisa de frases<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span>107<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span>50<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0<\/span><\/span><\/p>\n<h5><span style=\"color: #0000ff\"><strong>Resumo:<\/strong><\/span><\/h5>\n<p>O MongoDB fornece um \u00edndice simples de pesquisa de strings e APIs para fazer pesquisas de strings.  O \u00edndice B-tree que ele cria para a pesquisa de strings tamb\u00e9m \u00e9 bastante grande. N\u00e3o se trata de pesquisa de texto.<\/p>\n<p>O \u00edndice de texto do Couchbase \u00e9 baseado no \u00edndice invertido e \u00e9 um \u00edndice de texto completo com um n\u00famero significativamente maior de recursos e melhor desempenho.<\/p>\n<p>&nbsp;<\/p>\n<p><strong><span style=\"color: #0000ff\">Por que o Inverted Index para o \u00edndice de pesquisa?<\/span><\/strong><\/p>\n<h6>Pesquisas simples, exatas e de intervalo podem ser realizadas por <a href=\"https:\/\/en.wikipedia.org\/wiki\/B-tree\">\u00c1rvore B<\/a> como \u00edndices para uma varredura eficiente. As pesquisas de texto, no entanto, t\u00eam requisitos mais amplos de stemming, stopwords, analisadores etc.  Isso requer n\u00e3o apenas uma abordagem de indexa\u00e7\u00e3o diferente, mas tamb\u00e9m filtragem pr\u00e9-indexa\u00e7\u00e3o, ferramentas de an\u00e1lise personalizadas, stemming espec\u00edfico de idioma e insensibilidade a casos.<\/h6>\n<h6>O \u00edndice de pesquisa pode ser criado usando o B-TREE tradicional.  Mas, diferentemente dos \u00edndices B-tree em valores escalares, o \u00edndice de texto ter\u00e1 v\u00e1rias entradas de \u00edndice para cada documento.  Um \u00edndice de texto somente para esse documento poderia ter at\u00e9 12 entradas: 8 para nomes de elenco, uma para g\u00eaneros, duas para o t\u00edtulo depois de remover a palavra de parada (in) e o ano. Documentos maiores e contagens de documentos aumentar\u00e3o exponencialmente o tamanho do \u00edndice de texto.<\/h6>\n<pre class=\"theme:github tab-size:2 whitespace-before:2 whitespace-after:2 lang:js decode:true\">  {\r\n      \"cast\": [\r\n        \"Whoopi Goldberg\",\r\n        \"Ted Danson\",\r\n        \"Will Smith\",\r\n        \"Nia Long\"\r\n      ],\r\n      \"genres\": [\r\n        \"Comedy\"\r\n      ],\r\n      \"title\": \"Made in America\",\r\n      \"year\": 1993\r\n    }\r\n  }<\/pre>\n<h6><\/h6>\n<h6><strong>Solu\u00e7\u00e3o:<\/strong> Aqui entra a \u00e1rvore invertida.  A \u00e1rvore invertida tem os dados (termo de pesquisa) na parte superior (raiz) e tem v\u00e1rias chaves de documentos nas quais o termo existe na parte inferior, fazendo com que a estrutura se pare\u00e7a com uma \u00e1rvore invertida.  \u00cdndices de texto populares em <a href=\"https:\/\/lucene.apache.org\/\">Lucene<\/a>, <a href=\"https:\/\/blevesearch.com\/\">Bleve<\/a> s\u00e3o todos implementados como \u00edndices invertidos.<\/h6>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-6191 alignleft\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/12\/Screen-Shot-2018-12-19-at-9.30.00-PM-300x150.png\" alt=\"\" width=\"556\" height=\"278\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-12-19-at-9.30.00-PM-300x150.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-12-19-at-9.30.00-PM-1024x511.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-12-19-at-9.30.00-PM-768x383.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-12-19-at-9.30.00-PM-20x10.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-12-19-at-9.30.00-PM-1320x659.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-12-19-at-9.30.00-PM.png 1354w\" sizes=\"auto, (max-width: 556px) 100vw, 556px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"\" src=\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcS9mgPR7VdKR2Jtxp0oh0-DumD82wsaOAQ08ZIVUcUJnBfvibB15A\" alt=\"Image result for inverted tree\" width=\"240\" height=\"321\" \/><\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>&#8220;Apps without search is like Google homepage without the search bar.&#8221; It&#8217;s hard to design an app without a good search.\u00a0 These days, it&#8217;s also hard to find a database without a built-in search. MySQL to NoSQL, Sybase to Couchbase, [&hellip;]<\/p>","protected":false},"author":55,"featured_media":6192,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1816,2165,1812],"tags":[1292,1309],"ppma_author":[8929],"class_list":["post-6189","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-couchbase-server","category-full-text-search","category-n1ql-query","tag-elasticsearch","tag-mongodb"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Compare text search in Couchbase &amp; MongoDB- The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Learn more about the text search features for an effective, compare and contrast those available features in MongoDB and Couchbase with examples.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Searching JSON: compare text search in Couchbase and MongoDB.\" \/>\n<meta property=\"og:description\" content=\"Learn more about the text search features for an effective, compare and contrast those available features in MongoDB and Couchbase with examples.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-12-21T09:07:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:28:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Glacier-Gardens-replace-1170x731.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1170\" \/>\n\t<meta property=\"og:image:height\" content=\"731\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Keshav Murthy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@rkeshavmurthy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Keshav Murthy\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/\"},\"author\":{\"name\":\"Keshav Murthy\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c261644262bf98e146372fe647682636\"},\"headline\":\"Searching JSON: compare text search in Couchbase and MongoDB.\",\"datePublished\":\"2018-12-21T09:07:09+00:00\",\"dateModified\":\"2025-06-14T03:28:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/\"},\"wordCount\":2235,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Glacier-Gardens-replace-1170x731.jpg\",\"keywords\":[\"elasticsearch\",\"mongodb\"],\"articleSection\":[\"Application Design\",\"Couchbase Server\",\"Full-Text Search\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/\",\"name\":\"Compare text search in Couchbase & MongoDB- The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Glacier-Gardens-replace-1170x731.jpg\",\"datePublished\":\"2018-12-21T09:07:09+00:00\",\"dateModified\":\"2025-06-14T03:28:50+00:00\",\"description\":\"Learn more about the text search features for an effective, compare and contrast those available features in MongoDB and Couchbase with examples.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Glacier-Gardens-replace-1170x731.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Glacier-Gardens-replace-1170x731.jpg\",\"width\":1170,\"height\":731},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Searching JSON: compare text search in Couchbase and MongoDB.\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c261644262bf98e146372fe647682636\",\"name\":\"Keshav Murthy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4e51d72fc07c662aa791316deafffac4\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g\",\"caption\":\"Keshav Murthy\"},\"description\":\"Keshav Murthy is a Vice President at Couchbase R&amp;D. Previously, he was at MapR, IBM, Informix, Sybase, with more than 20 years of experience in database design &amp; development. He lead the SQL and NoSQL R&amp;D team at IBM Informix. He has received two President's Club awards at Couchbase, two Outstanding Technical Achievement Awards at IBM. Keshav has a bachelor's degree in Computer Science and Engineering from the University of Mysore, India, holds eleven US patents and has four US patents pending.\",\"sameAs\":[\"https:\/\/blog.planetnosql.com\/\",\"https:\/\/x.com\/rkeshavmurthy\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/keshav-murthy\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Compare text search in Couchbase & MongoDB- The Couchbase Blog","description":"Learn more about the text search features for an effective, compare and contrast those available features in MongoDB and Couchbase with examples.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/","og_locale":"pt_BR","og_type":"article","og_title":"Searching JSON: compare text search in Couchbase and MongoDB.","og_description":"Learn more about the text search features for an effective, compare and contrast those available features in MongoDB and Couchbase with examples.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-12-21T09:07:09+00:00","article_modified_time":"2025-06-14T03:28:50+00:00","og_image":[{"width":1170,"height":731,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Glacier-Gardens-replace-1170x731.jpg","type":"image\/jpeg"}],"author":"Keshav Murthy","twitter_card":"summary_large_image","twitter_creator":"@rkeshavmurthy","twitter_misc":{"Written by":"Keshav Murthy","Est. reading time":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/"},"author":{"name":"Keshav Murthy","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c261644262bf98e146372fe647682636"},"headline":"Searching JSON: compare text search in Couchbase and MongoDB.","datePublished":"2018-12-21T09:07:09+00:00","dateModified":"2025-06-14T03:28:50+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/"},"wordCount":2235,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Glacier-Gardens-replace-1170x731.jpg","keywords":["elasticsearch","mongodb"],"articleSection":["Application Design","Couchbase Server","Full-Text Search","SQL++ \/ N1QL Query"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/","url":"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/","name":"Compare text search in Couchbase & MongoDB- The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Glacier-Gardens-replace-1170x731.jpg","datePublished":"2018-12-21T09:07:09+00:00","dateModified":"2025-06-14T03:28:50+00:00","description":"Learn more about the text search features for an effective, compare and contrast those available features in MongoDB and Couchbase with examples.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Glacier-Gardens-replace-1170x731.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Glacier-Gardens-replace-1170x731.jpg","width":1170,"height":731},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Searching JSON: compare text search in Couchbase and MongoDB."}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c261644262bf98e146372fe647682636","name":"Keshav Murthy","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4e51d72fc07c662aa791316deafffac4","url":"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g","caption":"Keshav Murthy"},"description":"Keshav Murthy \u00e9 vice-presidente de P&amp;D da Couchbase. Anteriormente, ele trabalhou na MapR, IBM, Informix e Sybase, com mais de 20 anos de experi\u00eancia em design e desenvolvimento de bancos de dados. Ele liderou a equipe de P&amp;D de SQL e NoSQL na IBM Informix. Ele recebeu dois pr\u00eamios President's Club na Couchbase e dois Outstanding Technical Achievement Awards na IBM. Keshav \u00e9 bacharel em Ci\u00eancia da Computa\u00e7\u00e3o e Engenharia pela Universidade de Mysore, \u00cdndia, det\u00e9m onze patentes nos EUA e tem quatro patentes pendentes nos EUA.","sameAs":["https:\/\/blog.planetnosql.com\/","https:\/\/x.com\/rkeshavmurthy"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/keshav-murthy\/"}]}},"authors":[{"term_id":8929,"user_id":55,"is_guest":0,"slug":"keshav-murthy","display_name":"Keshav Murthy","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g","first_name":"Keshav","last_name":"Murthy","user_url":"https:\/\/blog.planetnosql.com\/","author_category":"","description":"Keshav Murthy \u00e9 vice-presidente de P&amp;D da Couchbase. Anteriormente, ele trabalhou na MapR, IBM, Informix e Sybase, com mais de 20 anos de experi\u00eancia em design e desenvolvimento de bancos de dados. Ele liderou a equipe de P&amp;D de SQL e NoSQL na IBM Informix. Recebeu dois pr\u00eamios President's Club na Couchbase e dois Outstanding Technical Achievement Awards na IBM. Keshav \u00e9 bacharel em Ci\u00eancia da Computa\u00e7\u00e3o e Engenharia pela Universidade de Mysore, \u00cdndia, det\u00e9m dez patentes nos EUA e tem tr\u00eas patentes pendentes nos EUA."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/6189","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/55"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=6189"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/6189\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/6192"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=6189"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=6189"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=6189"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=6189"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}