{"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\/es\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/","title":{"rendered":"B\u00fasqueda en JSON: compara la b\u00fasqueda de texto en Couchbase y MongoDB."},"content":{"rendered":"<blockquote><p>\"Apps sin b\u00fasqueda es como la p\u00e1gina de inicio de Google sin la barra de b\u00fasqueda\".<\/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>Es dif\u00edcil dise\u00f1ar una aplicaci\u00f3n sin una buena b\u00fasqueda.  Hoy en d\u00eda, tambi\u00e9n es dif\u00edcil encontrar una base de datos sin una b\u00fasqueda integrada. De MySQL a NoSQL, de Sybase a Couchbase, todas las bases de datos tienen soporte de b\u00fasqueda de texto, incorporado como Couchbase o a trav\u00e9s de la integraci\u00f3n con Elastic, como es el caso de Cassandra. A diferencia de SQL, la funcionalidad de b\u00fasqueda de texto no est\u00e1 estandarizada. Cada aplicaci\u00f3n necesita la mejor b\u00fasqueda, pero no todas las bases de datos proporcionan la misma funcionalidad de b\u00fasqueda de texto. Es importante entender la funcionalidad disponible, el rendimiento de cada implementaci\u00f3n de b\u00fasqueda de texto y elegir lo que se adapte a la necesidad de su aplicaci\u00f3n. Despu\u00e9s de motivar la b\u00fasqueda de texto, aprender\u00e1s sobre las caracter\u00edsticas de b\u00fasqueda de texto que necesitar\u00edas para una b\u00fasqueda efectiva, comparar y contrastar esas caracter\u00edsticas en MongoDB y Couchbase con ejemplos.<\/p>\n<h5>Veamos los requisitos de b\u00fasqueda a nivel de aplicaci\u00f3n.<\/h5>\n<ol>\n<li>\n<h5>B\u00fasqueda exacta: (WHERE item_id = \"ABC482\")<\/h5>\n<\/li>\n<li>\n<h5>B\u00fasqueda por rango: (WHERE item_type = \"shoes\" and size = 6 and price between 49.99 and 99.99)<\/h5>\n<\/li>\n<li>\n<h5>B\u00fasqueda por cadena:<\/h5>\n<ul>\n<li>\n<h5>(WHERE lower(nombre) 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>B\u00fasqueda de documentos:<\/h5>\n<ul>\n<li>\n<h5>Buscar joe en cualquier campo del documento JSON<\/h5>\n<\/li>\n<li>\n<h5>Buscar documentos que coincidan con el n\u00famero de tel\u00e9fono (408-956-2444) en cualquier formato (+1 (408) 956-2444, +1 510.956.2444, (408) 956 2444)<\/h5>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<h5>B\u00fasqueda compleja: (WHERE lower(title) LIKE \"%dictator%\" and lower(actor) LIKE \"%chaplin\" and year &lt; 1950)<\/h5>\n<\/li>\n<\/ol>\n<h5>Las b\u00fasquedas por rangos en los casos (1) y (2) pueden manejarse con \u00edndices B-Tree t\u00edpicos de forma eficiente. Los datos est\u00e1n bien organizados por los datos completos que se buscan.  Cuando se empieza a buscar el fragmento de palabra \"joe\" o se buscan n\u00fameros de tel\u00e9fono con varios patrones en un documento m\u00e1s grande, los \u00edndices basados en B-Tree se resienten. Simple <a href=\"https:\/\/dzone.com\/articles\/more-than-like-efficient-json-search-with-couchbas\">tokenizaciones<\/a> y el uso de \u00edndices basados en B-Tree puede ayudar en casos sencillos.  Necesitas nuevos enfoques para tus casos de b\u00fasqueda en el mundo real.<\/h5>\n<h5>La secci\u00f3n de ap\u00e9ndices de este blog contiene m\u00e1s detalles sobre c\u00f3mo se organizan los \u00edndices de \u00e1rbol invertido y por qu\u00e9 se utilizan para la b\u00fasqueda empresarial en <a href=\"https:\/\/lucene.apache.org\/\">Lucene<\/a> y <a href=\"https:\/\/blevesearch.com\/\">Bleve<\/a>.  Bleve potencia la b\u00fasqueda de texto completo de Couchbse.  MongoDB utiliza \u00edndices basados en B-Tree incluso para la b\u00fasqueda de texto.<\/h5>\n<h5>Centr\u00e9monos ahora en el soporte de b\u00fasqueda de texto en MongoDB y Couchbase.<\/h5>\n<h5>El conjunto de datos que he utilizado es 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>Visi\u00f3n general de la b\u00fasqueda de texto en MongoDB:<\/strong>\u00a0<\/span> Crear y consultar \u00edndice de b\u00fasqueda de texto en cadenas de documentos MongoDB.  El \u00edndice parece ser simples \u00edndices B-tree con capas adicionales para el analizador incorporado.  Esto conlleva muchos problemas de tama\u00f1o y rendimiento que discutiremos m\u00e1s adelante.  El \u00edndice de b\u00fasqueda de texto est\u00e1 estrechamente integrado en la infraestructura de la base de datos MongoDB y su API de consulta.\u00a0<\/span><\/h5>\n<h5><span style=\"font-weight: 400\">MongoDB proporciona \u00edndices de texto para soportar consultas de b\u00fasqueda de texto s\u00f3lo sobre cadenas. Sus \u00edndices de texto solo pueden incluir campos cuyo valor sea una cadena o una matriz de elementos de cadena.\u00a0<\/span><span style=\"font-weight: 400\">Una colecci\u00f3n s\u00f3lo puede tener un \u00edndice de b\u00fasqueda de texto, pero ese \u00edndice puede abarcar varios campos.<\/span><\/h5>\n<h5><span style=\"font-weight: 400\"><span style=\"color: #ff0000\"><strong>Visi\u00f3n general de Couchbase FTS (B\u00fasqueda de texto completo):<\/strong> <\/span>La b\u00fasqueda de texto completo ofrece amplias posibilidades de consulta en lenguaje natural. Bleve, implementado como un \u00edndice invertido, alimenta el \u00edndice de texto completo de Couchbase.  El \u00edndice se despliega como uno de los servicios y puede desplegarse en cualquiera de los nodos del cl\u00faster.<\/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>Nombre<\/strong><\/h5>\n<\/td>\n<td>\n<h5>B\u00fasqueda de texto - 4.x<\/h5>\n<\/td>\n<td>\n<h5>B\u00fasqueda de texto completo (FTS) - 6.x.<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><strong>Funcionalidad<\/strong><\/h5>\n<\/td>\n<td>\n<h5>B\u00fasqueda de texto simple para indexar campos de cadena y buscar una cadena s\u00f3lo en uno o m\u00e1s campos de cadena.  Utiliza su <strong>\u00cdndices B-Tree<\/strong> para el \u00edndice de b\u00fasqueda de texto.<\/h5>\n<h5>Busca en toda la cadena compuesta y no puede separar los campos espec\u00edficos.<\/h5>\n<\/td>\n<td>\n<h5>B\u00fasqueda de texto completo para encontrar cualquier cosa en sus datos. Admite todos los tipos de datos JSON (cadena, num\u00e9rico, booleano, fecha\/hora); la consulta admite expresiones booleanas complejas, expresiones difusas en cualquier tipo de campos.  Utiliza la <strong>\u00edndice invertido<\/strong>\u00a0para el \u00edndice de b\u00fasqueda de texto.<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>Instalaci\u00f3n<\/b><\/h5>\n<\/td>\n<td>\n<h5>B\u00fasqueda de texto: Disponible con la instalaci\u00f3n de MongoDB. Sin opci\u00f3n de instalaci\u00f3n por separado.<\/h5>\n<\/td>\n<td>\n<h5>Disponible con la instalaci\u00f3n de Couchbase. Puede instalarse con otros servicios (datos, consulta, \u00edndice, etc.) o por separado en distintos nodos de b\u00fasqueda.<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>Creaci\u00f3n de \u00edndices en un solo campo<\/b><\/h5>\n<\/td>\n<td>\n<h5>db.films.createIndex({ t\u00edtulo: \"texto\" });<\/h5>\n<\/td>\n<td>\n<h5 class=\"p1\"><span class=\"s1\">curl -u Administrador:contrase\u00f1a -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>Creaci\u00f3n de \u00edndices en varios campos<\/b><\/h5>\n<\/td>\n<td>\n<h5>db.films.createIndex({ t\u00edtulo: \"texto\", g\u00e9neros: \"texto\"});<\/h5>\n<h5>Antes de crear este \u00edndice, tienes que eliminar el \u00edndice anterior. <span style=\"color: #0000ff\">S\u00f3lo puede haber un \u00edndice de texto en una colecci\u00f3n<\/span>. Se necesita su nombre, que se obtiene mediante: db.films.getIndexes() o especificando el nombre al crear el \u00edndice.<\/h5>\n<h5>db.films.dropIndex(\"texto_t\u00edtulo\");<\/h5>\n<\/td>\n<td>\n<h5>Puede crear m\u00faltiples \u00edndices en un bucket (o espacio de claves) sin restricciones.<\/h5>\n<h5 class=\"p1\"><span class=\"s1\">curl -u Administrador:contrase\u00f1a -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>Utilizaci\u00f3n de pesos<\/b><\/h5>\n<\/td>\n<td>\n<h5>db.films.createIndex({ t\u00edtulo: \"texto\", g\u00e9neros: \"texto\"}, {weights:{t\u00edtulo: 25}, name : \"txt_t\u00edtulo_g\u00e9neros\"});<b><\/b><\/h5>\n<\/td>\n<td>\n<h5>Hecho din\u00e1micamente a trav\u00e9s de refuerzo utilizando el ^ 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>Opci\u00f3n de idioma<\/b><\/h5>\n<\/td>\n<td>\n<h5>El idioma por defecto es el ingl\u00e9s. Introduce un par\u00e1metro para cambiarlo.<\/h5>\n<h5>db.films.createIndex({ title: \"text\"}, { default_language: \"french\" });<\/h5>\n<\/td>\n<td>\n<h5>Los analizadores est\u00e1n disponibles en 24 idiomas.  Puede cambiar es mientras se crea el \u00edndice cambiando el siguiente par\u00e1metro.<\/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 sin distinci\u00f3n entre may\u00fasculas y min\u00fasculas<\/b><\/h5>\n<\/td>\n<td>\n<h5>No distingue entre may\u00fasculas y min\u00fasculas por defecto. Ampliado a nuevos idiomas.<\/h5>\n<\/td>\n<td>\n<h5>No distingue entre may\u00fasculas y min\u00fasculas por defecto.<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>insensible a los diacr\u00edticos<\/b><\/h5>\n<\/td>\n<td>\n<h5>Con la versi\u00f3n 3, el \u00edndice de texto es insensible a los diacr\u00edticos.<\/h5>\n<\/td>\n<td>\n<h5>S\u00ed.  Se activa autom\u00e1ticamente en el analizador correspondiente (por ejemplo, franc\u00e9s).<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>Delimitadores<\/b><\/h5>\n<\/td>\n<td>\n<h5>Gui\u00f3n, gui\u00f3n, sintaxis_patr\u00f3n, comillas, puntuaci\u00f3n_terminal y espacio_en_blanco.<\/h5>\n<\/td>\n<td>\n<h5>Cada obra se analiza en funci\u00f3n del lenguaje y la especificaci\u00f3n del analizador.<\/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\">alem\u00e1n, dan\u00e9s, espa\u00f1ol, fin\u00e9s, franc\u00e9s, holand\u00e9s, h\u00fangaro, ingl\u00e9s, italiano, noruego, portugu\u00e9s, rumano, ruso, sueco, turco<\/span><\/h5>\n<\/td>\n<td>Los filtros de tokens son compatibles con los siguientes idiomas.<\/p>\n<p class=\"p1\"><span class=\"s1\">\u00c1rabe, catal\u00e1n, chino, japon\u00e9s, coreano, kurdo, dan\u00e9s, alem\u00e1n, griego, ingl\u00e9s, espa\u00f1ol (castellano), vasco, persa, fin\u00e9s, franc\u00e9s, ga\u00e9lico, espa\u00f1ol (gallego), hindi, h\u00fangaro, armenio, indonesio, italiano, neerland\u00e9s, noruego, portugu\u00e9s, rumano, ruso, sueco y 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 de \u00e1rbol B simple que contiene una entrada por cada palabra con ra\u00edz en cada documento.<\/h5>\n<h5>Los \u00edndices de texto pueden ser grandes. Contienen una entrada de \u00edndice por cada palabra \u00fanica pospuesta en cada campo indexado de cada documento insertado.<\/h5>\n<\/td>\n<td>\n<h5>\u00cdndice invertido.  Una entrada por palabra con ra\u00edz en TODO el \u00edndice (por partici\u00f3n del \u00edndice).  Por lo tanto, los tama\u00f1os de \u00edndice son significativamente m\u00e1s peque\u00f1os. Cuanto m\u00e1s grande sea el conjunto de datos, el \u00edndice FTS de Couchbase es mucho m\u00e1s eficiente comparado con el \u00edndice de texto de MongoDB.<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>Efecto de la creaci\u00f3n de \u00edndices sobre los INSERTOS.<\/b><\/h5>\n<\/td>\n<td>\n<h5>Afectar\u00e1 negativamente a la tasa de INSERTOS.<\/h5>\n<\/td>\n<td>\n<h5>Las tarifas INSERT\/UPSERT no se ver\u00e1n afectadas<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>\u00cdndice Mantenimiento<\/b><\/h5>\n<\/td>\n<td>\n<h5>Sincr\u00f3nicamente mantenido.<\/h5>\n<\/td>\n<td>\n<h5>Se mantiene de forma as\u00edncrona.  Las consultas pueden especificar la caducidad mediante el par\u00e1metro de consistencia.<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>consultas de frase<\/b><\/h5>\n<\/td>\n<td>\n<h5>Soportado, pero lento.<\/h5>\n<h5>Las b\u00fasquedas de frases se ralentizan porque el \u00edndice de texto no incluye los metadatos necesarios sobre la proximidad de las palabras en los documentos. En consecuencia, las consultas de frases se ejecutar\u00e1n de forma mucho m\u00e1s eficaz cuando toda la colecci\u00f3n quepa en la memoria RAM.<\/h5>\n<\/td>\n<td>Soportado y r\u00e1pido.<\/p>\n<p>Incluir los vectores de t\u00e9rminos durante la creaci\u00f3n del \u00edndice.<\/td>\n<\/tr>\n<tr>\n<td>\n<h5><b>B\u00fasqueda de texto <\/b><\/h5>\n<\/td>\n<td>\n<h5>db.films.find({$text: {$search: \"charlie chaplin\"}})<\/h5>\n<h5>Esto encontrar todos los documentos que contienen Charlie o Chaplin.  Si contiene tanto charlie como chaplin obtendr\u00e1 una puntuaci\u00f3n m\u00e1s alta. Como s\u00f3lo puede haber UN \u00edndice de texto por colecci\u00f3n, esta consulta utiliza ese \u00edndice independientemente del campo que indexe.  Por lo tanto, es importante decidir cu\u00e1l de los campos debe estar en el \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>B\u00fasqueda por frase exacta<\/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>Exclusi\u00f3n exacta<\/b><\/td>\n<td>db.films.find({$text: {$search: \"charlie -chaplin\"}});<\/p>\n<p>Toda la pel\u00edcula con \"charlie\", pero sin \"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>Orden de resultados.<\/strong><\/td>\n<td>\n<h5>Desordenado por defecto.<\/h5>\n<h5>Proyecta y ordena por puntuaci\u00f3n cuando lo necesites.<\/h5>\n<h5>db.films.find({$text: {$search: \"charlie chaplin\"}}, {score: {$meta: \"searchscore\"}}).sort({$meta: \"searchscore\"})<\/h5>\n<\/td>\n<td>Ordenado por puntuaci\u00f3n (descendente) por defecto. Se puede ordenar por cualquier campo o metadato.  Ordenado por t\u00edtulo y puntuaci\u00f3n (descendente)<\/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>B\u00fasqueda espec\u00edfica por idioma<\/b><\/td>\n<td>\n<h5>db.articles.find(<\/h5>\n<h5>\u00a0\u00a0{ $text: { $search: \"leche\", 1TP4Idioma: \"es\" } }<\/h5>\n<h5>)<\/h5>\n<\/td>\n<td>El analizador ling\u00fc\u00edstico habr\u00e1 determinado las caracter\u00edsticas del \u00edndice y de la consulta.<\/td>\n<\/tr>\n<tr>\n<td><b>B\u00fasqueda sin distinci\u00f3n entre may\u00fasculas y 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 por el analizador.  Utilice el filtro to_lower token para que las b\u00fasquedas no distingan entre may\u00fasculas y min\u00fasculas.  M\u00e1s informaci\u00f3n en: https:\/\/docs.couchbase.com\/server\/6.0\/fts\/fts-using-analyzers.html<\/td>\n<\/tr>\n<tr>\n<td><b>Limitaci\u00f3n del conjunto de resultados devueltos.<\/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>Soporta los equivalentes de LIMIT y SKIP en SQL utilizando los par\u00e1metros \"size\" y \"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>Clasificaci\u00f3n compleja<\/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 puntuaci\u00f3n (descendente) por defecto. Puede ordenar por cualquier campo o metadato.  Ordena por t\u00edtulo (ascendente), a\u00f1o (descendente) y puntuaci\u00f3n (descendente).<\/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 compleja<\/b><\/td>\n<td>\n<h5>Utilizar el marco de agregaci\u00f3n.  La b\u00fasqueda $text puede utilizarse en un marco de agregaci\u00f3n con algunas restricciones.<\/h5>\n<h5>db.articles.aggregate(<br \/>\n[<br \/>\n{ $match: { $text: { $search: \"charlie chaplin\" } } },<br \/>\n{ $project: { t\u00edtulo: 1, _id: 0, puntuaci\u00f3n: { $meta: \"searchscore\" } } },<br \/>\n{ $match: { puntuaci\u00f3n: { $gt: 5.0 } } }<br \/>\n]<br \/>\n)<\/h5>\n<ul>\n<li>Limitaciones: <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 has visto hasta ahora, la consulta FTS en s\u00ed es bastante sofisticada. Adem\u00e1s, FTS admite facetas para la agrupaci\u00f3n y el recuento sencillos.\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>En la pr\u00f3xima versi\u00f3n, N1QL (SQL para JSON) utilizar\u00e1 el \u00edndice FTS para los predicados de b\u00fasqueda.<\/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 de documentos<\/b><\/td>\n<td>No admite la indexaci\u00f3n completa de documentos.  Todos los campos de cadena tendr\u00e1n que especificarse en la llamada a createIndex.<\/p>\n<h5>db.films.createIndex({ t\u00edtulo: \"texto\", g\u00e9neros: \"texto\", reparto: \"texto\", a\u00f1o: \"texto\"});<b><\/b><\/h5>\n<p>&nbsp;<\/td>\n<td>Por defecto, permite indexar el documento completo, reconoce autom\u00e1ticamente el tipo de campo y los indexa en consecuencia.<\/td>\n<\/tr>\n<tr>\n<td><b>Tipos de consulta<\/b><\/td>\n<td>\n<h5>B\u00fasqueda b\u00e1sica, debe tener, no debe tener.<\/h5>\n<\/td>\n<td>\n<h5>Consultas de coincidencia, frase coincidente, ID de documento y prefijo<\/h5>\n<h5>Consultas de conjunci\u00f3n, disyunci\u00f3n y campos booleanos<\/h5>\n<h5>Consultas de rango num\u00e9rico y rango de fechas<\/h5>\n<h5>Consultas geoespaciales<\/h5>\n<h5>Consultas de cadenas de consulta, que emplean una sintaxis especial para expresar los detalles de cada consulta (para m\u00e1s informaci\u00f3n, consulte Consultas de cadenas de consulta)<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td><b>Analizadores disponibles<\/b><\/td>\n<td>S\u00f3lo analizadores integrados.<\/td>\n<td>Analizadores integrados y personalizables. M\u00e1s informaci\u00f3n en:\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>Crear y buscar a trav\u00e9s de la interfaz de usuario<\/b><\/h5>\n<\/td>\n<td>\n<h5>No en el producto base.<\/h5>\n<\/td>\n<td>\n<h5>Integrado en la consola<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td><b>API REST<\/b><\/td>\n<td>\n<h5>No disponible.<\/h5>\n<\/td>\n<td><b>Disponible.<\/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>La b\u00fasqueda de texto est\u00e1 integrada en la mayor\u00eda de los SDK de Mongo.   Por ejemplo, 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 datos admitidos<\/b><\/td>\n<td><b>S\u00f3lo cadenas.  No se admite ning\u00fan otro tipo de dato.<\/b><\/td>\n<td><b>Todos los tipos de datos JSON y fechas y horas.<\/b><\/p>\n<p><b>String, numeric, boolean, datetime, object y arrays. <\/b><\/p>\n<p><b>GEOPOINT para consultas al vecino m\u00e1s pr\u00f3ximo.   V\u00e9ase :\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>Vectores de t\u00e9rmino.<\/strong><\/td>\n<td>No compatible.<\/td>\n<td>Disponibles.   Los vectores de t\u00e9rminos son muy \u00fatiles en la b\u00fasqueda de frases.<\/td>\n<\/tr>\n<tr>\n<td><strong>Facetado<\/strong><\/td>\n<td>Sin soporte<\/td>\n<td>\n<h5>T\u00e9rmino Facet<\/h5>\n<h5>Facetas de rango num\u00e9rico<\/h5>\n<h5>Faceta de intervalo de fechas<\/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 avanzadas (conjuntos)<\/strong><\/td>\n<td>No compatible.<\/td>\n<td>\n<h5>curl -u Administrador:contrase\u00f1a -XPOST -H \"Content-Type: application\/json\" https:\/\/172.23.120.38:8094\/api\/index\/filmsearch\/query -d '{<\/h5>\n<h5>\u00a0\"explicar\": true,<\/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\"consulta\": {<\/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 avanzadas (disyuntos)<\/strong><\/td>\n<td>No compatible.<\/td>\n<td>\n<h5>curl -u Administrador:contrase\u00f1a -XPOST -H \"Content-Type: application\/json\" https:\/\/172.23.120.38:8094\/api\/index\/filmsearch\/query -d '{<\/h5>\n<h5>\u00a0\"explicar\": true,<\/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\"consulta\": {<\/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>Consulta de intervalos de fechas<\/strong><\/td>\n<td>No compatible.<\/p>\n<p>Necesita postprocesado, lo que podr\u00eda afectar al rendimiento.<\/td>\n<td>\u00a0Compatible con FTS.<\/p>\n<h5>{<br \/>\n\"inicio\": \u201c2001-10-09T10:20:30-08:00\u201d,<br \/>\n\"fin\": \"2016-10-31\",<br \/>\n\"inclusive_start\": falso,<br \/>\n\"inclusive_end\": falso,<br \/>\n\"field\": \"fecha_revisi\u00f3n\"<br \/>\n}<\/h5>\n<\/td>\n<\/tr>\n<tr>\n<td><strong>Consultas de rangos num\u00e9ricos<\/strong><\/td>\n<td>\u00a0No compatible.<\/td>\n<td>\u00a0curl -u Administrador:contrase\u00f1a -XPOST -H \"Content-Type: application\/json\" https:\/\/172.23.120.38:8094\/api\/index\/filmsearch\/query -d '{<br \/>\n\"explicar\": true,<br \/>\n\"fields\": [<br \/>\n&#8220;*&#8221;<br \/>\n],<br \/>\n\"highlight\": {},<br \/>\n\"consulta\": {<br \/>\n\"campo\": \"a\u00f1o\", \"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\">Rendimiento:<\/span><\/strong><\/h5>\n<p>Aunque a\u00fan est\u00e1 pendiente una comparaci\u00f3n de rendimiento m\u00e1s detallada, hemos realizado una comparaci\u00f3n r\u00e1pida con 1 mill\u00f3n de documentos de wikipedia. Esto es lo que vimos:<\/p>\n<p><strong>Tama\u00f1os 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>Tama\u00f1o de indexaci\u00f3n<\/td>\n<td>1 GB (chamuscado)<\/td>\n<td>1,6 GB<\/td>\n<\/tr>\n<tr>\n<td>Tiempo de indexaci\u00f3n<\/td>\n<td>46 segundos<\/td>\n<td>7,5 min<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Rendimiento de las consultas de b\u00fasqueda (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\">T\u00e9rminos de alta frecuencia<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>t\u00e9rminos de frecuencia <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\">Bajo<span class=\"Apple-converted-space\">\u00a0 <\/span>t\u00e9rminos de frecuencia<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 o Alta<span class=\"Apple-converted-space\">\u00a0 <\/span>t\u00e9rminos<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 o Media <span class=\"Apple-converted-space\">\u00a0 <\/span>t\u00e9rminos<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\">B\u00fasqueda 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>Resumen:<\/strong><\/span><\/h5>\n<p>MongoDB proporciona un \u00edndice de b\u00fasqueda de cadenas simple y APIs para realizar b\u00fasquedas de cadenas.  El \u00edndice de \u00e1rbol B que crea para la b\u00fasqueda de cadenas tambi\u00e9n puede ser bastante grande. La b\u00fasqueda de texto, no.<\/p>\n<p>El \u00edndice de texto de Couchbase se basa en un \u00edndice invertido y es un \u00edndice de texto completo con un n\u00famero significativamente mayor de funciones y un mejor rendimiento.<\/p>\n<p>&nbsp;<\/p>\n<p><strong><span style=\"color: #0000ff\">\u00bfPor qu\u00e9 un \u00edndice invertido?<\/span><\/strong><\/p>\n<h6>Las b\u00fasquedas simples, exactas y por rango, pueden realizarse mediante <a href=\"https:\/\/en.wikipedia.org\/wiki\/B-tree\">\u00c1rbol B<\/a> como \u00edndices para una exploraci\u00f3n eficaz. Las b\u00fasquedas de texto, sin embargo, exigen un uso m\u00e1s amplio de stemming, stopwords, analizadores, etc.  Esto requiere no s\u00f3lo un planteamiento de indexaci\u00f3n diferente, sino tambi\u00e9n un filtrado previo, herramientas de an\u00e1lisis personalizadas, separaciones de palabras en funci\u00f3n del idioma e insensibilidad a las may\u00fasculas y min\u00fasculas.<\/h6>\n<h6>El \u00edndice de b\u00fasqueda puede crearse utilizando el \u00e1rbol B tradicional.  Pero, a diferencia de los \u00edndices B-tree sobre valores escalares, el \u00edndice de texto tendr\u00e1 m\u00faltiples entradas de \u00edndice para cada documento.  Un \u00edndice de texto s\u00f3lo en este documento podr\u00eda tener hasta 12 entradas: 8 para nombres de reparto, una para g\u00e9neros, dos para el t\u00edtulo tras eliminar la palabra de parada (in) y el a\u00f1o. Si el n\u00famero de documentos es mayor, el tama\u00f1o del \u00edndice de texto aumentar\u00e1 exponencialmente.<\/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>Soluci\u00f3n:<\/strong> Aqu\u00ed viene el \u00e1rbol invertido.  El \u00e1rbol invertido tiene los datos (t\u00e9rmino de b\u00fasqueda) en la parte superior (ra\u00edz) y tiene varias claves de documentos en los que existe el t\u00e9rmino en la parte inferior, haciendo que la estructura parezca un \u00e1rbol invertido.  \u00cdndices de texto populares en <a href=\"https:\/\/lucene.apache.org\/\">Lucene<\/a>, <a href=\"https:\/\/blevesearch.com\/\">Bleve<\/a> se implementan 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\/es\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\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\/es\/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\":\"es\",\"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\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\",\"@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\/es\/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\/es\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/","og_locale":"es_MX","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\/es\/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":"es","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":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/"]}]},{"@type":"ImageObject","inLanguage":"es","@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":"El blog de Couchbase","description":"Couchbase, la base de datos 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":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@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":"es","@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 es Vicepresidente de Couchbase R&amp;D. Anteriormente, estuvo en MapR, IBM, Informix, Sybase, con m\u00e1s de 20 a\u00f1os de experiencia en dise\u00f1o y desarrollo de bases de datos. Dirigi\u00f3 el equipo de I+D de SQL y NoSQL en IBM Informix. Ha recibido dos premios President's Club en Couchbase y dos premios Outstanding Technical Achievement en IBM. Keshav es licenciado en Inform\u00e1tica e Ingenier\u00eda por la Universidad de Mysore (India), es titular de once patentes estadounidenses y tiene cuatro pendientes.","sameAs":["https:\/\/blog.planetnosql.com\/","https:\/\/x.com\/rkeshavmurthy"],"url":"https:\/\/www.couchbase.com\/blog\/es\/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 es Vicepresidente de Couchbase R&amp;D. Anteriormente, estuvo en MapR, IBM, Informix, Sybase, con m\u00e1s de 20 a\u00f1os de experiencia en dise\u00f1o y desarrollo de bases de datos. Dirigi\u00f3 el equipo de I+D de SQL y NoSQL en IBM Informix. Ha recibido dos premios President's Club en Couchbase y dos premios Outstanding Technical Achievement en IBM. Keshav es licenciado en Inform\u00e1tica e Ingenier\u00eda por la Universidad de Mysore (India), es titular de diez patentes estadounidenses y tiene tres pendientes."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/6189","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/55"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=6189"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/6189\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/6192"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=6189"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=6189"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=6189"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=6189"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}